`
jeasony
  • 浏览: 199951 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

java平台下通过jacob对excel,word进行打印等操作(转exceljava*^__^)

    博客分类:
  • java
阅读更多

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

   

Java代码 复制代码
  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.     }  
/**
 * @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文件:

Java代码 复制代码
  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)  
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++库不正确:

Java代码 复制代码
  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   
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 ,以此类推):
  

Java代码 复制代码
  1. com.jacob.com.ComFailException: Invoke of: Open   
  2. Source: Microsoft Office Excel  
 com.jacob.com.ComFailException: Invoke of: Open
 Source: Microsoft Office Excel

 004 原因:机子上没有装office

  

Java代码 复制代码
  1. cant get Object cldid from progid  
cant get Object cldid from progid

 

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

分享到:
评论
1 楼 tss0823 2011-06-22  
我遇到了文件路径的问题。哈哈。谢谢!

相关推荐

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

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

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

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

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

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

    java_jacob_操作word_文档

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

    Jacob Word excel 转PDF 合并PDF文件

    标题提到的"Jacob Word excel 转PDF 合并PDF文件"是指使用Jacob库来将Microsoft Word和Excel文档转换为PDF格式,并进一步合并多个PDF文件。Jacob(Java Advanced COM Bridge)是一个Java库,它允许Java应用程序与...

    JACOB操作word和excel示例

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

    java将word转图片转pdf_jacob.zip

    本项目“java将word转图片转pdf_jacob.zip”是关于利用Java进行文档格式转换的一个实例,主要涉及的技术点包括Java与Microsoft Office文档的交互以及图片和PDF的生成。 首先,我们需要了解Java中的Jacob库。Jacob...

    jacob_1.9 使用Jacob转换Word,Excel为HTML

    jdk1.6 以上版本测试可用的 jacob_1.9使用Jacob转换Word,Excel为HTML 源码测试程序 及 工具,使用时 将 jacob.dll 放在 系统Java\jdk1.6.0_10\jre\bin目录下即可,jar 看项目需求放置添加到工程

    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目录下才可以使用。

    Jacob实现word转PDF之格式最美转化

    Jacob库在Java编程环境中是一个非常实用的工具,它允许开发者通过COM接口与Microsoft Office应用程序进行交互,例如Word、Excel和PowerPoint。在这个场景中,我们使用Jacob来实现Word文档到PDF的转换,以保持格式的...

    java实现excel转换成html

    Java作为一种强大的编程语言,提供了多种库来处理这样的任务,其中一个常用的工具是Jacob库,它允许Java程序与Microsoft Office进行交互。 标题"java实现excel转换成html"指出,我们将使用Java编程语言,通过Jacob...

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

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

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

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

    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。

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

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

    java通过jacob操作word,原码

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

    [jacob]---------------->java 实现 word 转换为html jacob

    代码中可能有对Jacob库的导入,以及一系列对Word对象的创建、操作和关闭的操作。 4. **注意事项**: - 使用Jacob进行转换时,必须在运行Java程序的机器上安装与Word文档版本兼容的Microsoft Word。 - Jacob是...

    jacob实例 word excel pdf

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

    Java jacob将word和excel转为pdf

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

Global site tag (gtag.js) - Google Analytics