因为项目有个需求,要求能够在某个预定时间对特定报表进行自动打印。报表的形式主要是excel。如果是c++或者c#什么的,简直是小菜一碟。可惜,偏偏是java实现。并且,这又不同于常见的页面手工打印,可以通过javascript调用打印机来实现。于是乎,开始摸索如何实现该功能。
首先想到的是java自带的打印类。在javax.print包下。根据jdk说明,照着搬来了个程序,小试牛刀。
/**
* @author xjj
* 说明:打印类
* email: exceljava@163.com
* @date Oct 29, 2008
*/
public class AutoPrint {
public static void main(String[] args) {
FileInputStream psStream;
try {
psStream = new FileInputStream("file.ps");
} catch (FileNotFoundException ffne) {
}
if (psStream == null) {
return;
}
DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT;
Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
PrintRequestAttributeSet aset =
new HashPrintRequestAttributeSet();
aset.add(new Copies(5));
aset.add(MediaSize.A4);
aset.add(Sides.DUPLEX);
PrintService[] services =
PrintServiceLookup.lookupPrintServices(psInFormat, aset);
if(services.length<1){
throw new RuntimeException("找不到打印机");
}
if (services.length > 0) {
DocPrintJob job = services[0].createPrintJob();
try {
job.print(myDoc, aset);
} catch (PrintException pe) {}
}
}
通过测试,始终无法找到打印机,运行时报定义的:找不到打印机。听说,局域网内的打印机无法链接,打印机只能连在本机上。而测试的打印机刚好在局域网内而不在本机上。然后,查看了下文档,忽然发现,java自带的打印只对plain文本,gif,jpeg,pdf等支持,而对excle,word等是不支持的。看来要学会放弃,goodbye java print。
有道是:车道山前必有路。这不,关键时刻,jacob出现了。根据官方网站的介绍 jacob即Java COM Bridge
充当java和windows平台的桥梁作用,通过com组件的方式。如果大家不了解com组件。可以google一下。(顺便鄙视下百度)。通过它,是我们在java中可以很方便的操作office,包括word,excel等。
闲话少说,马上开始jacob之旅。首先,当然是从官网上下载我们必要的资源。http://danadler.com/jacob/
进入官网,大家会看到这样一段话:The JACOB project is moving to Sourceforge.net. Verion 1.8 is now available at Sourceforge. If you are a sourceforge developer and are interested in contributing to the project, please contact the project administrators. 也就是jacob已经在大名鼎鼎的Sourceforge.net上安营扎寨了。不过不解的是,最新版本1.14已经出来了,这里介绍的最新版本为什么还是1.8.鄙视一下。下载的时候,除了jacob-1.14.3.zip,我建议最好把jacob-1.14.3_src.zip也下载下来。src下有源码,demo等等,非常有用。
解压:jacob-1.14.3.zip,将jacob.jar加入classpath,如果是intel平台,将jacob-1.14.3-x86.dll加入系统盘的system32下。比如我的路径是:C:\WINDOWS\system32 如果是AMD平台,则加入:jacob-1.14.3-x64.dll,
ok, 准备就绪。开始写代码了,本人参照自带的demo实现了简单的打开excel并打印的功能。代码如下:
写道
/**
* 功能:实现打印工作
* @param path
* @date Oct 29, 2008
* @time 11:40:03 AM
*/
public static void print(String path){
ComThread.InitSTA();
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
try {
// System.out.println("version=" + xl.getProperty("Version"));
//不打开文档
Dispatch.put(xl, "Visible", new Variant(true));
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
//打开文档
Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch();
//开始打印
Dispatch.get(excel,"PrintOut");
} catch (Exception e) {
e.printStackTrace();
} finally {
//始终释放资源
ComThread.Release();
}
}
然后,运行,就会打开路径下的文件,然后链接打印机,打印。而这,正是我想要的。然后就开始其他操作的摸索了。在此基础上,通过定时任务,生成excel,利用jacob进行打印。就功成名就了。
说个题外话,参照demo,打开的命令调用是Open,关闭的命令调用是Close,我想当然认为,打印当然是Print莫属了。然而,jacob真是不按常理出牌啊,既然搞个PrintOut,真nnd。最后还是暴力破解出来的。相关文档也没有(不知道是不是本人没有找到).
根据我所掌握的情况,有两点需要说明(通过验证):
1.jacob只适合windows平台,如果是linux平台,你最终会南辕北辙。
2.在xp下,只需要在系统中加入jacob-1.14.3-x86.dll即可。但是如果在2000(估计已经绝技了)或者2003 server下,需要额外的msvcr80.dll支持,可以从通过下载vcredist_x86.exe进行安装获得。下载地址:http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=en
最后说一下,我说碰到的几个异常情况:
001 原因:没有dll文件:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jacob in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1030)
at com.jacob.com.ComThread.<clinit>(ComThread.java:153)
at com.bester.hw.util.PrintExcel.print(PrintExcel.java:25)
at com.bester.hw.util.PrintExcel.main(PrintExcel.java:16)
002 原因:C++库不正确:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\apps\...\jacob.dll: This application has fa
iled to start because the application configuration is incorrect. Reinstalling the application may fix this pr
oblem
003 原因:文件路径不正确(因为调用的第一个命令是Open,所以这里Invoke of:Open ,以此类推):
com.jacob.com.ComFailException: Invoke of: Open
Source: Microsoft Office Excel
004 原因:机子上没有装office
cant get Object cldid from progid
好了,搞了一个上午,也算高点名堂出来了。至少找到了一条解决问题的明路。一点体会,共勉!
分享到:
相关推荐
Jacob 是 JAVA-COM Bridge的缩写,是一个中间件,能够提供自动化访问MS系统下COM组件和Win32 libraries的功能。支持win32位与64位
java使用jacob将word,excel,ppt转成html,代码和所需的jar都在压缩包,项目需求实现后分享下
如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目,本文使用的版本是1.10.1。 这篇文章可能不能完全...
jacob操作WPS、Office对应Word、Excel、PPT生成PDF,采用版本为jaco1.7X。
Jacob Word excel 转PDF 合并PDF文件,需要安装微软的转换插件,压缩包内含插件
资源中包括工具类、jacob.jar和jacob-1.18-x64.dll(64位)、jacob-1.18-x86.dll(32位) 在使用jacob时,我们需要将jacob-1.18-x64.dll或jacob-1.18-x86.dll放到jdk的bin目录下或者jdk/jre的bin目录下才可以使用。
java生成excel 操作word jacob java操作office poi jacob
jacob.jar: a JAR file for the java classes which you must add to your CLASSPATH. The package names replace com.ms with com.jacob (for example com.ms.com.Variant maps to com.jacob.com.Variant. jacob...
JACOB操作work和excel示例。附包
Java使用jacob将word和excel转为pdf,确保运行机器上安装了office或wps软件
jdk1.6 以上版本测试可用的 jacob_1.9使用Jacob转换Word,Excel为HTML 源码测试程序 及 工具,使用时 将 jacob.dll 放在 系统Java\jdk1.6.0_10\jre\bin目录下即可,jar 看项目需求放置添加到工程
此程序借用poi和jacob 包实现了对Excel和Word的读取操作功能
java 操作word、excel的包文件
java对excel,word打哈哈java对excel,word打哈哈java对excel,word打哈哈
itext:读取txt和图片;jacob: 读取word;...其中jxl可运行与windows和Linux下,jacob读取word完美读取, 不会有图片读取不了或者颜色样式丢失问题, 采用的支持jar基本都是最新版, 献给和我一样苦苦追寻的人
jacob java 操作 Word 、excel 文档
把jacob.jar加载到工程里。 在C:\WINDOWS\system32;C:\Program Files\Java\jdk1.5.0_04\bin;...下添加jacob.dll文件。 OfficeToXML.java文件是实现代码。 我自己工程用到的代码,现共享出来给大家!
该项目通过jacob将word转换成pdf图片,在jdk中需要导入jacob的.dll文件,然后将项目导入到工具中直接运行即可,项目中有详细文档
jacob.jar1.20及使用方法 解压后获得3个文件 jacob.jar jacob-1.20-x64.dll jacob-1.20-x86.dll 包含(32位,64位)以及文档 jacob(java com bradge) 通过调用MS OFFICE可以快捷的将word excel ppt等转换为pdf
主要为大家详细介绍了Java使用jacob将微软office中word、excel、ppt转成pdf,具有一定的参考价值,感兴趣的小伙伴们可以参考一下