`
lgl669
  • 浏览: 173479 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java平台下通过jacob对excel,word进行打印等操作

    博客分类:
  • java
阅读更多

因为项目有个需求,要求能够在某个预定时间对特定报表进行自动打印。报表的形式主要是excel。如果是c++或者c#什么的,简直是小菜一碟。可 惜,偏偏是java实现。并且,这又不同于常见的页面手工打印,可以通过javascript调用打印机来实现。于是乎,开始摸索如何实现该功能。
      首先想到的是java自带的打印类。在javax.print包下。根据jdk说明,照着搬来了个程序,小试牛刀。

  1. /**   
  2.  * @author xjj   
  3.  * 说明:打印类   
  4.  * email: exceljava@163.com   
  5.  * @date Oct 29, 2008   
  6.  */     
  7. public   class  AutoPrint {    
  8.     public   static   void  main(String[] args) {    
  9.         FileInputStream psStream;    
  10.         try  {    
  11.            psStream = new  FileInputStream( "file.ps" );    
  12.         } catch  (FileNotFoundException ffne) {    
  13.         }    
  14.         if  (psStream ==  null ) {    
  15.             return ;    
  16.         }    
  17.         DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT;    
  18.         Doc myDoc = new  SimpleDoc(psStream, psInFormat,  null );      
  19.         PrintRequestAttributeSet aset =     
  20.                 new  HashPrintRequestAttributeSet();    
  21.         aset.add(new  Copies( 5 ));    
  22.         aset.add(MediaSize.A4);    
  23.         aset.add(Sides.DUPLEX);    
  24.         PrintService[] services =     
  25.           PrintServiceLookup.lookupPrintServices(psInFormat, aset);    
  26.         if (services.length< 1 ){    
  27.             throw   new  RuntimeException( "找不到打印机" );    
  28.         }    
  29.         if  (services.length >  0 ) {    
  30.            DocPrintJob job = services[0 ].createPrintJob();    
  31.            try  {    
  32.                 job.print(myDoc, aset);    
  33.            } catch  (PrintException pe) {}    
  34.         }    
  35.     
  36.     }    

 

通过测试,始终无法找到打印机,运行时报定义的:找不到打印机。听说,局域网内的打印机无法链接,打印机只能连在本机上。而测试的打印机刚好在局域 网内而不在本机上。然后,查看了下文档,忽然发现,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并打印的功能。代码如下:

  1. /**   
  2. * 功能:实现打印工作   
  3. * @param path   
  4. * @date Oct 29, 2008   
  5. * @time 11:40:03 AM   
  6. */    
  7. public   static   void  print(String path){   
  8. ComThread.InitSTA();   
  9. ActiveXComponent xl = new  ActiveXComponent( "Excel.Application" );   
  10. try  {   
  11. // System.out.println("version=" + xl.getProperty("Version"));    
  12. //不打开文档    
  13. Dispatch.put(xl, "Visible" new  Variant( true ));   
  14. Dispatch workbooks = xl.getProperty("Workbooks" ).toDispatch();   
  15. //打开文档    
  16. Dispatch excel=Dispatch.call(workbooks,"Open" ,path).toDispatch();   
  17. //开始打印    
  18. Dispatch.get(excel,"PrintOut" );   
  19. catch  (Exception e) {   
  20. e.printStackTrace();   
  21. finally  {   
  22. //始终释放资源    
  23. ComThread.Release();   
  24. }   
  25. }  

 

然后,运行,就会打开路径下的文件,然后链接打印机,打印。而这,正是我想要的。然后就开始其他操作的摸索了。在此基础上,通过定时任务,生成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文件:

Java代码 < type="application/x-shockwave-flash" width="14" height="15" src="http://exceljava.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=Exception%20in%20thread%20%22main%22%20java.lang.UnsatisfiedLinkError%3A%20no%20jacob%20in%20java.library.path%0A%20at%20java.lang.ClassLoader.loadLibrary(ClassLoader.java%3A1682)%0A%20at%20java.lang.Runtime.loadLibrary0(Runtime.java%3A823)%0A%20at%20java.lang.System.loadLibrary(System.java%3A1030)%0A%20at%20com.jacob.com.ComThread.%3Cclinit%3E(ComThread.java%3A153)%0A%20at%20com.bester.hw.util.PrintExcel.print(PrintExcel.java%3A25)%0A%20at%20com.bester.hw.util.PrintExcel.main(PrintExcel.java%3A16)">
  1. Exception in thread  "main"  java.lang.UnsatisfiedLinkError: no jacob in java.library.path  
  2.  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682 )  
  3.  at java.lang.Runtime.loadLibrary0(Runtime.java:823 )  
  4.  at java.lang.System.loadLibrary(System.java:1030 )  
  5.  at com.jacob.com.ComThread.<clinit>(ComThread.java:153 )  
  6.  at com.bester.hw.util.PrintExcel.print(PrintExcel.java:25 )  
  7.  at com.bester.hw.util.PrintExcel.main(PrintExcel.java:16 )  

 
002 原因:C++库不正确:

Java代码 < type="application/x-shockwave-flash" width="14" height="15" src="http://exceljava.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=Exception%20in%20thread%20%22main%22%20java.lang.UnsatisfiedLinkError%3A%20C%3A%5Capps%5C...%5Cjacob.dll%3A%20This%20application%20has%20fa%20%0Ailed%20to%20start%20because%20the%20application%20configuration%20is%20incorrect.%20Reinstalling%20the%20application%20may%20fix%20this%20pr%20%0Aoblem%20">
  1. Exception in thread  "main"  java.lang.UnsatisfiedLinkError: C:\apps\...\jacob.dll: This application has fa   
  2. iled to start because the application configuration is incorrect. Reinstalling the application may fix this  pr   
  3. oblem   

003 原因:文件路径不正确(因为调用的第一个命令是Open,所以这里Invoke of:Open ,以此类推):

Java代码 < type="application/x-shockwave-flash" width="14" height="15" src="http://exceljava.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%20com.jacob.com.ComFailException%3A%20Invoke%20of%3A%20Open%0A%20Source%3A%20Microsoft%20Office%20Excel">
  1. com.jacob.com.ComFailException: Invoke of: Open  
  2. Source: Microsoft Office Excel  

 004 原因:机子上没有装office

Java代码 < type="application/x-shockwave-flash" width="14" height="15" src="http://exceljava.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=cant%20get%20Object%20cldid%20from%20progid">
  1. cant get Object cldid from progid  

好了,搞了一个上午,也算高点名堂出来了。至少找到了一条解决问题的明路。一点体会,共勉!

分享到:
评论
3 楼 antony102201 2011-12-21  
有没有支持通过java调用Adobe_PDF_Printer来打印一些可以打印的文件啊
2 楼 linchixiong 2011-05-09  
学习了,谢谢~
1 楼 minfirefox 2010-07-28  
请问你知道这是什么原因吗?
在win2003下出现cant get Object cldid from progid

相关推荐

    jacob是java平台下对excel,word进行打印等操作工具

    Jacob是Java平台上一个重要的库,专门用于与Microsoft Office应用程序(如Excel和Word)进行交互,实现数据的读取、写入、打印等操作。它的全名JAVA-COM Bridge,正如其名,它充当了Java与COM(Component Object ...

    (转)Java jacob调用打印机打印word文档

    1. **Jacob库**:Jacob全称为Java COM Bridge,是一个开源的Java库,通过JNI(Java Native Interface)技术实现,使得Java程序能够直接调用COM组件,如Microsoft Office的各种应用,如Word、Excel等。Jacob提供了对...

    Jacob Word excel 转PDF 合并PDF文件

    通过Jacob,开发者可以在Java程序中调用任何支持COM接口的应用程序,例如Microsoft Office套件,进行文档操作。它通过JNI(Java Native Interface)来实现这一目标,使得Java代码可以调用C++编写的COM组件。 在Word...

    java使用jacob将word,excel,ppt转成html

    Jacob(Java and COM Bridge)是一个 Java 库,它允许 Java 应用程序通过 COM(Component Object Model)接口与 Microsoft Office 进行交互。下面,我们将详细探讨如何使用 Jacob 实现 Word、Excel 和 PowerPoint ...

    jacob打印机打印本地的excel和word

    要使用Jacob进行打印操作,你需要先在项目中添加Jacob的jar文件,并确保你的系统中已经安装了相应的Office组件,因为Jacob是通过它们来实现功能的。安装Jacob库通常包括以下步骤: 1. 下载Jacob的jar文件。 2. 将...

    java操作word:jacob(方法解析+环境配置)

    这意味着开发者可以通过Java来控制诸如Microsoft Word、Excel等应用程序,从而实现文档的自动化处理。 #### Jacob官方网站 Jacob的官方网站为[http://danadler.com/jacob](http://danadler.com/jacob),用户可以从...

    JACOB操作word和excel示例

    本文将深入探讨如何使用Jacob库来操作Word和Excel,通过提供的示例文档,我们将理解如何进行文件转换和其他操作。 首先,Jacob全称为Java COM Bridge,是一个Java到COM(Component Object Model)桥接器,它使得...

    java通过jacob操作word,原码

    Jacob(Java COM Automation Bridge)是一个开源库,它允许Java应用程序利用COM接口与Windows操作系统中的Office应用程序进行交互,包括Word、Excel等。下面将详细阐述如何使用Jacob库在Java中操作Word,并结合描述...

    jacob-java调用word

    JACOB同样能在这个场景中发挥作用,允许Java后台生成报表,并通过Word或Excel模板将数据填充到相应位置,再进行打印。 JACOB的使用指南通常包括如何创建COM对象,如何操作这些对象,以及如何处理异常和资源清理。...

    jacob操作WPS、Office对应Word、Excel、PPT生成PDF

    jacob操作WPS、Office对应Word、Excel、PPT生成PDF,采用版本为jaco1.7X。

    java使用jacob通过模板生成word文档完整项目

    这意味着你可以使用Jacob来操作Word、Excel、PowerPoint等Microsoft Office应用,而无需通过中间的脚本语言如VBS或JScript。 在本项目中,"WordTest"可能是包含主程序逻辑的类或者测试文件。这个类通常会包含一个或...

    java对word、excel、pdf等操作.doc

    本文将对Java操作Word、Excel、PDF等文档的知识点进行总结和分析。 一、Java操作Word文档 Java可以使用 Jacob 库来操作 Word 文档。Jacob 库是一个 Java 库,允许 Java 应用程序与 COM 组件交互,从而实现对 Word ...

    jacob实例 word excel pdf

    Jacob(Java COM Bridge)是一个Java库,用于在Java应用程序中与Microsoft Office进行交互,包括Word、Excel和PDF文档的处理。它通过JNI(Java Native Interface)技术,实现了Java与COM(Component Object Model)...

    jacob操作word,excel(图表,表格等)代码

    Jacob是一个Java库,它提供了对Microsoft Office应用程序如Word和Excel的COM自动化接口,使得Java开发者可以利用这些Office工具的功能,例如创建、修改文档、处理表格和图表等。在这个主题下,我们将深入探讨如何...

    Java jacob将word和excel转为pdf

    同样,你可以对Excel的转换进行类似的处理,只是需要替换相应的对象和方法,如使用`Excel.Application`代替`Word.Application`,以及使用`Workbook`和`Worksheet`对象。 需要注意的是,这种转换方法依赖于安装的...

    Java 使用 jacob 将office中 word excel ppt 转成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-JACOB操作WORD文档

    Java-JACOB库提供了一种方式让Java程序与Microsoft的COM接口进行交互,使得开发者能够直接在Java应用中操作如MS Word和Excel等Office应用程序。本文主要探讨如何使用Java-JACOB来创建和操作Word文档。 首先,使用...

    java 操作jacob 生成word,html或者excel

    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操作Excel

    Jacob非常适合那些需要在Java环境中操作Office文档(如Word、Excel)的应用场景。 #### 二、Jacob操作Excel基本流程 使用Jacob操作Excel主要包括以下几个步骤: 1. **初始化Excel对象**:创建Excel应用程序实例。...

    java_jacob_操作word_文档

    ### Java Jacob 操作 Word 文档知识点详解 #### 一、Java Jacob 库介绍与...通过以上介绍,我们了解到使用 Java Jacob 库操作 Word 文档的具体方法和注意事项,这对于自动化办公任务、文档生成等应用场景非常有用。

Global site tag (gtag.js) - Google Analytics