最进在做一个功能需要在网页中直接打开word文档,在网上找了好久都没找到一个合适的,最后看到jacob可以把word文档转化为html,于是决定用它了,在网上收了jacob的资料和demo。下面我们说说jacob吧,对它的介绍网上很多,我在这里就在累赘了。由于jacob是调用dll,所以在性能上不是很优化,我没有仔细研究过它,也没去看它的源代码。但是我照着网上的做了很久,老是出错。
第一个错误,大家都知道,就是no jacob in the java.library.path,解决方案如下:
引用下别个写的:
一、将jacob.dll拷贝到windows/system32下,并在部署环境中添加jacob.jar包,这两个文件的版本必须一致,不然会出现一些错误,如果多个应用用到改包,最好放到公共包目录下,因为可能出现一些错误。
二、如果通过上述配置还不能正确运用改包,则将jacob.dll放入 Java/jdk/jre/bin目录下,如果不是web应用,则需将jacob.dll放到Java/jdk/jre/lib/ext目录下。
我照着做还是不行,唉,郁闷死了,但是我后来看到网上帖子说要看版本,我用的是jdk1.6,于是去官方下载了一个最新的jacob,我照着上面的第一步做,ok了!其中有个主意的地方就是,jacob.dll这个文件名,网上大多数是写的jacob.dll,但是我从官方下的是jacob-1.15-M3-x86.dll和jacob-1.15-M3-x64.dll,这里得注意下,这个名字不能改。
好了,我这样做好后,没报这个错了,却又报了另一个错,唉,真是倒霉透了,呵呵!也花费我很久的时间解决,黄天不负苦心人啊,最后还是终于解决了,于是发帖纪念下,希望能帮到其他用jacob的朋友们。这个问题就是,网上很多人说要转换后的html文件绝对路径和文件名(不要扩展名),这个是错误的,要把扩展名加起,切记。还有就是我发现一个小bug,就是转化后的html文件不能和原word文件放在同一个目下下哦,切记切记,就是这里把我郁闷到了,呵呵!
下面是一个demo程序,网上也找的到的:
/** * Word文档转化为Html * * @author lazy_p * @Date Mar 12, 2010 * */ public class WordToHtmlUtils { /** * 文档转换函数 * * @param docfile * word文档的绝对路径加文件名(包括扩展名) * @param htmlfile * 转换后的html文件绝对路径和文件名(包括扩展名并且路径不能和原word完全一样) */ public static void change(String docfile, String htmlfile) { ActiveXComponent app = new ActiveXComponent("Word.Application");// 查找word组件 // String inFile = "C:/1.doc";// 要转换的word文件 // String tpFile = "C:/4.html";// 目标文件 // boolean flag = false; try { app.setProperty("Visible", new Variant(false));// 设置word不可见 Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch doc = Dispatch.invoke( docs, "Open", Dispatch.Method, new Object[] { docfile, new Variant(false), new Variant(true) }, new int[1]).toDispatch();// 打开word文件,注意这里第三个参数要设为true,这个参数表示是否以只读方式打开,因为我们不用保存原文件,所以以只读方式打开,如果你想进行读写,那么就得设为false。 Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { htmlfile, new Variant(8) }, new int[1]);// 作为html格式保存到目标文件 Variant f = new Variant(false); Dispatch.call(doc, "Close", f); // 关闭word文件 // flag = true; } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } } public static void main(String[] strs) { change(null, null); } }
测试环境: windows vista + JDK1.6+MyEclipse6.5