前段时间碰到一个新需求,客户系统中有一个用于管理Excel的模块,excel文档由下边的人上传至系统,由管理员负责进行查看和审查。现在客户提出,因为excel默认需要下载才能打开,又加上客户要查看很多excel,每次都要下载下来。Office的Excel又启动得很快,客户就提出,是否可以直接在网页中查看,而不是以Excel的形式打开。比如,点击一个文档时,直接弹出一个界面,这个界面就是显示的excel的内容,而并不是由excel进行打开了。这样,客户每次看了之后,就可以直接关闭,再看下一篇文档,以节约时间和提高速度。下来研究了一下,可以使用jacob和com4j来将excel在服务器端转化为一个html,再将这个html发送到客户端进行查看。
首先,使用jacob,代码如下:
ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel try { app.setProperty("Visible", new Variant(false)); Dispatch excels = app.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.invoke(excels, "Open", Dispatch.Method, new Object[] {"d:/aaa.xls", new Variant(false), new Variant(true)}, new int[1]).toDispatch(); Dispatch .invoke(excel, "SaveAs", Dispatch.Method, new Object[] {"d:/aaa.html", new Variant(44)}, new int[1]); Variant f = new Variant(false); Dispatch.call(excel, "Close", f); } catch(Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); }
简单看了一下,这就是一个通过开启一个对excel组件的dispatch关系,所有的方法都通过一个Dispatch.invoke进行调用,并且需要将相应的参数传递进去,一点也没有oo的味道。下面来看一下com4j。
_Application app = excel.ClassFactory.createApplication(); Variant _ = Variant.MISSING; app.visible(0, false); app.displayAlerts(0, false); _Workbook wb = app.workbooks().open("d:/aaa.xls", _, _, _, _, _, _, _, _, _, _, _, _, _, _, 0); Variant html = new Variant(Variant.Type.VT_INT); html.set(30); wb.saveAs("d:/xxx.html", XlFileFormat.xlHtml, _, _, _, false, XlSaveAsAccessMode.xlNoChange, _, _, _, _, _, 0); Variant saveBeforeExit = new Variant(Variant.Type.VT_BOOL); saveBeforeExit.set(1); wb.close(XlSaveAction.xlSaveChanges, _, _, 0); app.quit();
上面的代码就有一点点oo的味道了,首先建立一个excel对象,然后进行属性设置,再进行saveAs(另存)操作,最后退出excel。如果懂vb编程的话,这就是excel的vb编程,只不过这里把它java化了。个人推荐使用com4j。
首先下载com4j,通过以下将相应jar包下载下来:)
<dependency> <groupId>org.jvnet.com4j</groupId> <artifactId>com4j</artifactId> <version>20080107</version> </dependency> <dependency> <groupId>org.jvnet.com4j</groupId> <artifactId>tlbimp</artifactId> <version>20080107</version> </dependency>
第一个是com4j的运行包,第二个是将相应的com组件进行java映射化的包。首先需要使用tlbimp对一个com组件进行java化,生成相对应的java文件(这些java文件中都是一些属性与com组件的classId映射)。需要注意的是,我下载的这个版本的tlbimp在它的jar包中的MANIFEST.MF文件中指明了classpath属性,如下所示:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.6.5 Created-By: 1.5.0_06-b03 (Sun Microsystems Inc.) Main-Class: com4j.tlbimp.driver.Main Build-Date: 20080107 Class-Path: com4j.jar args4j-2.0.1.jar
所以需要将相应的com4j jar和args4j(一个命令行参数解析工具,使用maven时会自动下载下来),放在与tlbimp同样的目录,在命令行下,运行以下命令:
java -jar tlbimp.jar -o 生成的目录名 -p 包名 相对应的com组件excel.exe的完整路径
这样,就会在相对应的目录下生成相应的java文件了。这个是网上很多文章里都没有提及到的(为什么代码中会有excel.XXX的包名和类,就是这样生成的),然后将这些java文件引入到工程中,就可以使用了。
java命令运行完的结果就是与excel另存的结果一样,在相应目录生成一个xxx.html文件,并且有一个相对应的xxx.files目录,里面放的是相对应的图片等信息。接下来的工作就是如何将这个xxx.html发送到客户端的问题了,同时处理好图片等信息的相对路径问题即可。
转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/use-jacob-or-com4j-change-excel-to-html.html