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

      因为项目有个需求,要求能够在某个预定时间对特定报表进行自动打印。报表的形式主要是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

 

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

Java使用jacob调用默认打印机打印Word和excel 代码随意一搜一大片,都能用。 我这里讲的是,我这两天的心得。 起因: jacob在myeclipse里面完美运行,但是封装成Runnable Jar后却不能运行。 解决方法: 1.必须要将Jacob.jar封到Jar中 2. (1)如果是64位系统,那么要把jacob-1.17-x64.dll放到C:\Program Files\Java\jre7\bin中,把jacob-1.17- 阅读详情

相关推荐

Java使用Jacob实现Word与Excel打印完整解决方案

Jacob(Java-COM Bridge)是一个开源库,专为实现Java与Windows平台COM组件之间的交互而设计。它通过JNI(Java Native Interface)技术,使Java程序能够调用如Microsoft Office等基于COM接口的应用程序。本章将介绍Jacob的基本构成、作用机制及其在自动化处理Office文档中的核心价值,为后续深入使用奠定理论与实践基础。

weixin_35835018的博客 1146

【JACOB问题】类Workbooks的Open方法无效&无法关闭打开的进程

问题现象: 1. 如果使用excel组件,则报错:workbook没有open方法 2.如果使用et组件,直接就获取不到组件,can't  get  clsid object from progid 信息搜集: http://blog.sina.com.cn/s/blog_6248dc000100g26c.html   是不是远程调用才会出问题? 使用COM组件实现对

一只代码喵 1万+

eMMC数据擦除的方式

接下来主要是讲解erase、trim、discard的差异,涉及的command有CMD35、CMD36、CMD38。一般用来擦除整卡或者某些分区,如果只想擦除一个。以下是device status的部分解释。eMMC的数据擦除方式有6种,分别是。将会跳过写保护,只执行其他的范围。Discard的命令序列是。Erase的命令序列是。的范围有包含写保护,Trim的命令序列是。

DPJimmy的博客 1774

Java调用com组件之jacob

属性值说明Program ID具有一个方法:需要使用Java进行调用。

hanxirensheng的专栏 2230

nCode:GlyphWorks案例教程一

nCode GlyphWorks案例一Comparing Frequency Content of Two Different Tests案例文件目标配置选择数据 Comparing Frequency Content of Two Different Tests 在本案例中,我们将比较来自两个不同测试的六个加速计通道的频率内容。将三轴加速度计放置在车辆的左前角和右前角,然后分别在两个不同的试验路面上行驶12分钟以上。 案例文件 此案例的文件(采用nCode DAC格式)位于nCode安装目录下的\demo

追月行的博客 1万+

研究生研一学习机器学习ML、深度学习DL的规划

研究生学习机器学习DL、深度学习DL的规划 保上研之后也没有很好规划自己的学习路线,看到b站上的一位清华博士讲述他本科也是机械跨考计算机的学习路线,所以记录下来,从现在开始按照规划来一点一点地做好。 掌握python(推荐一周) 1.1 面向对象编程 廖雪峰python网站: https://www.liaoxuefeng.com 1.2 数据分析Numpy numpy 100题: https://www.yanxishe.com/columnDetail/24784 1.3数据分析pandas pan

没有最好,只有更好 3100

java jacob 使用_【JAVA】JACOB使用简介

它允许在java中调用com接口自动组件,它使用JNI(本地调用进程)来进行本地调用COM库。它可运行在x86和支持32位和64位Java虚拟机X64的环境。测试源码包:密码: ej9uJACOB项目的由来首先,我们将了解JACOB项目的基本情况,探讨在什么样的情况下选择它来完成您的任务COM中暴露出来的方法,主要有两种机制:早期绑定和晚期绑定。大桥调用可以参考IBM的RJCB项目,它提供了一套高...

weixin_39929259的博客 1216

大模型微调框架之TRL

近年来,大语言模型(LLMs)的快速发展推动了下游应用的繁荣,但如何高效地对这些模型进行对齐和微调,依然是研究与应用的热点。Hugging Face 开源的 TRL(Transformer Reinforcement Learning) 框架,提供了基于强化学习的语言模型训练方法,并支持 SFT(监督微调)、PPO(近端策略优化)、DPO(直接偏好优化)等多种方式,是目前对齐和微调 LLM 的重要工具。

和大家一起涨芝士 905

jacob 80010105

jacob 80010105

willow的博客 991

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求,对此小编整理了一些相关问题~

HDJ9387的博客 940

【agent实战教程】OpenClaw多个agent一文通

一个合格的独立agent,必须具备6个完全独立的专属组件独立组件路径规则核心要求不独立的严重后果唯一agentId配置文件中全局唯一,不能重复,建议用英文+数字,不要有特殊字符agent配置冲突,消息派单错误,会话串线独立工作区(workspace)建议每个agent一个独立文件夹,不要共用人设、记忆、规则混在一起,agent人设崩塌,对话串线独立状态目录(agentDir)固定系统自动生成,绝对禁止多个agent复用同一个agentDir。

海兰 650

java平台下经过jacob对excel_word进行打印等操作_通过jacob对excel word进行打印等操作...

public class AutoPrint {public static void main(String[] args) {FileInputStream psStream;try {psStream = new FileInputStream("file.ps");} catch (FileNotFoundException ffne) {}if (psStream == null) {re...

weixin_39886956的博客 200

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3516

java平台下经过jacob对excel_word进行打印等操作_jacob操作word的例子

jacob大全_计算机软件及应用_IT/计算机_专业资料。综合jacob文档大全,包含jacob操作word的最好例子。 通过Java 调用 OCX 控件有几种方法,JNI、JACOB、Jawin 等 1.......(e); } } 4.java jacob 操作 word 文档 进行写操作,如生成表格,添加 图片 jacob-1.15-M3-x86.dll copy 到 c://windows...

weixin_36013428的博客 371

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

wsrjzhsy0493的博客 314

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java平台下经过jacob对excel_word进行打印等操作_整理关于Java进行word文档的数据动态数据填充...

JAVA生成word优缺点对比所用技术优点缺点Jacob功能强大代码量大,设置样式繁琐;需要windows平台支持,无法跨平台Apache POI读写excel功能强大、操作简单一般只用它读取word,能够创建简单的word,不能设置样式,功能太少Java2word功能强大,操作简单能满足一般要求,不支持07格式,国人开发的,参考资料较多,需要windows平台支持iText功能全,能满足一般要求...

weixin_35886058的博客 315

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

12、借助Jacob实现Java打印报表(Excel、Word)

12、使用Jacob来处理文档   Word或Excel程序是以一种COM组件形式存在的。如果能够在Java中调用相应组件,便能使用它的方法来获取文档中的文本信息。Jacob是一个JAVA到微软的COM接口的桥梁。Jacob允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果要对 MS Word、Excel 进行处理,Jacob 是一个好的选择。 12.1、Jaco

YGingko的专栏 1906

java打印excel

java默认打印API打印时不支持打印Excel、word的,所以就只能另寻它径了。 网上搜了一下,有两种方式。一种是用JCom 组件,另一种用的是jacob组件。、 下面所述的是用jacob组件实现的。jcom没有尝试过,有兴趣的可以测试下。      首先去官网下载开发jar包  http://danadler.com/jacob/   What Is JACOB?

qq1761310972 5103

jacob java excel_12、借助Jacob实现Java打印报表(Excel、Word)

12、使用Jacob来处理文档Word或Excel程序是以一种COM组件形式存在的。如果能够在Java中调用相应组件,便能使用它的方法来获取文档中的文本信息。Jacob是一个JAVA到微软的COM接口的桥梁。Jacob允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果要对 MS Word、Excel 进行处理,Jacob 是一个好的选择。12.1、Jacob的下载Jaco...

weixin_30382147的博客 412

使用jacob打印word或excel

使用jacob打印word或excel

懒人的博客 5213

java 横向输出_java jacob调用打印,word,excel横向打印

public static booleanprintOfficeFile(File f) {if (f != null &&f.exists()) {String fileNameString=f.getName();String postfixString=Utils.getPostfix(fileNameString);if (postfixString.equalsIgnor...

weixin_32394247的博客 757
上一篇: hibernate无主键情况下无法更新
下一篇: 体验javaFX 1.0
excellentjava
博客等级 码龄20年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值