查资料网上有很多博客里有教程里讲这个方法,教程中的代码基本雷同,不知是从国外那个网站流传进来被国内入门级玩家传播开来,使用过程中普遍都是只知其然不知所以然。随手找来一个操作,基本可以保证成功,例如这篇http://blog.youkuaiyun.com/liugenghao3048/article/details/8771673
我按着操作之后,基本能够成功转换,但是有一个问题,通过这种方法转出的html中图片是用v:shape标签包起来,而不是以img标签包起来,导致无法显示标签。搜了一下很多人说是路径不对,我点击v:shape中的路径却可以直接打开图片。按理说调用ActiveX转换的话,应该是和在word里面手动另存为转换的是一样的,我怀疑可能是另存为的选项不对导致的,于是我手动在word里面将可以转换的html格式一一转换,与代码转换的进行对比,word支持的html格式如下图红色框框的部分:
果然,发现代码转换的文件同上述红框中”网页(*.html;*.html)“的格式是一样的,而这种格式就是上述提到的无法正常显示图片的格式,最下面一个”筛选过的网页(*.html;*.html)“才是可以正常显示网页的。那么就需要修改另存为选项了。查阅微软的MSDN中关于ActiveX Document的API可以找到其支持的另存为格式与对应的参数,支持的格式见,这个地址是针对Office2007的msdn:http://msdn.microsoft.com/en-us/library/bb238158(v=office.12).aspx
其中wdFormatFilteredHTML 格式就对应上述图片中”筛选过的网页(*.html;*.html)“类型,其对应的值是10,那么修改广泛流传的jacob word转html教程中的对应的部分就可以成功显示了,不明白为什么那么多人号称使用教程都成功进行转换了,世界真奇妙。当然,运行代码之前需要将环境配置好,包括需要的dll和jar包的配置,以及安装MS Office。
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class App
{
public static void main( String[] args )
{
wordToHtml("c:/test.doc","c:/test/jacob.html");
}
public static boolean wordToHtml (String inPath,String toPath) {
//启动word
ActiveXComponent axc = new ActiveXComponent("Word.Application");
boolean flag = false;
try {
//后台执行,不显示word界面
axc.setProperty("Visible",new Variant(false));
Dispatch docs = axc.getProperty("Documents").toDispatch();
//打开word文档
Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,
new Object[]{inPath,new Variant(false),
new Variant(true)},new int[1]).toDispatch();
//作为html保存到文件
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
toPath, new Variant(10) }, new int[1]); //这里的new Variant(10)中的初始化值是10,而不是8
Variant f = new Variant(false);
Dispatch.call(doc, "Close", f);
flag = true;
return flag;
} catch (Exception e) {
e.printStackTrace();
return flag;
} finally{
axc.invoke("Quit", new Variant[] {});
}
}
}