使用jacob或com4j将Excel转换为html

     前段时间碰到一个新需求,客户系统中有一个用于管理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

相关文章:

作者: flym

I am flym,the master of the site:)

发表评论

邮箱地址不会被公开。 必填项已用*标注