[转载]java调用PageOffice生成word
一、在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jacob、poi、java2word、itext。jacob要求服务器必须是windows操作系统,服务器上还必须安装office软件,果断放弃!poi需要针对doc和docx两种格式写不同的代码,增加了程序的复杂度。java2doc 是对 jacob 的封装,同样放弃!最后选定了用itext来导出word,网上一些资料说itext导出word功能太简单,通过试用之后,封装工具类,使用起来确实挺方便,但是导出的word文档在细节方面很难达到要求,比如:字体、行距、字体间距、首行缩进等。
二、由于itext导出的word有各种各样的小问题,只能另找其他的解决方案,经过一个朋友推荐,可用PageOffice组件来导出word,其效果能与用户需求的word文档达到完美的一致,而且编程接口简单,调用很方便。总的来说就是制作模板(用PO_开头的书签作为数据占位符),然后编程调用PageOffice接口用真实数据替换模板中的占位符,最后生成word。下面看例子:
1. 制作模板
打开word模板插入书签:PO_Dept、PO_Name、PO_Cause、PO_Num、PO_Date,如下图所示

2. 编写代码
调用PageOffice接口,给word模板填充数据生成word文档:

1 // 声明变量存储从数据库中读取的数据
2 String docName = "", docDept = "", docCause = "", docNum = "", docDate = "";
3 // 数据库数据读取操作(不同的数据库用不同的代码)
4 ResultSet rs = stmt.executeQuery("select * from leaveRecord where ID = " + id);
5 if (rs.next()) {
6 docName = rs.getString("Name");
7 docDept = rs.getString("Dept");
8 docCause = rs.getString("Cause");
9 docNum = rs.getString("Num");
10 docDate = rs.getString("SubmitTime");
11 }
12 rs.close();
13 //创建PageOffice的WordDocument对象,操作Word文件
14 WordDocument doc = new WordDocument();
15 doc.openDataRegion("PO_name").setValue(docName);
16 doc.openDataRegion("PO_dept").setValue(docDept);
17 doc.openDataRegion("PO_cause").setValue(docCause);
18 doc.openDataRegion("PO_num").setValue(docNum);
19 doc.openDataRegion("PO_date").setValue(docDate);
20 //创建PageOfficeCtrl对象打开文件
21 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
22 poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
23 //获取数据对象
24 poCtrl1.setWriter(doc);
25 // 打开文档
26 poCtrl1.webOpen("doc/template.doc", OpenModeType.docReadOnly, "Tom");

3. 生成效果图

三、 源码下载
https://download.csdn.net/download/zi_wu_xian/10399345
[转载]java调用PageOffice生成word的更多相关文章
- [原创]java调用PageOffice生成word
一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...
- [原创]Java调用PageOffice给Word中的Table赋值
Word中的table操作需要借助数据区域(DataRegion)实现的,要求数据区域完整的包含了整个Table的内容,这样才可以通过数据区域控制和操作table.因此,要想使用table,则必须在w ...
- Java利用poi生成word(包含插入图片,动态表格,行合并)
转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...
- JAVA调用 keytool 生成keystore 和 cer 证书
keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体( ...
- java 调用 keytool 生成keystore 和 cer 证书
keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据:密钥实体(K ...
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- [转载] Java开发在线编辑Word同时实现全文检索
一.背景介绍 Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,一般情况下能想到的解决方案是 ...
- java使用freemarker 生成word文档
java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...
- Java使用iText生成word文件的完美解决方案(亲测可行)
JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...
随机推荐
- Event对象、队列、multiprocessing模块
一.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测.如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就 会变得非常棘手.为了解决这些问题, ...
- 从0开始用python实现神经网络 IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION
code地址:https://github.com/dennybritz/nn-from-scratch 文章地址:http://www.wildml.com/2015/09/implementing ...
- mac截屏
shift+command+3 : 截全屏 shift+command+4 : 出现十字架的坐标图标,画框截图
- go——结构
Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体定义需要使用type和struct语句.str ...
- php优化,操作码优化,缓存优化
一.php缓存加速器软件种类 xcache,eaccelerator,zend,apc如何选择:建议xcache,eaccelerator,二选一,首选xcachexcache更快 二.php缓存加速 ...
- hadoop07---synchronized,lock
synchronized 锁是jvm控制的,控制锁住的代码块只能有一个线程进入.线程执行完了锁自动释放,抛出异常jvm会释放锁. synchronized的缺陷 1.如果一个线程被阻塞了,其余的线程 ...
- 20145201 《Java程序设计》第二周学习总结
20145201 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习了课本第三章内容,即JAVA基础语法. 3.1 类型.变量与运算符 基本类型:在java中基本类型主要可区分 ...
- django使用migrations迁移版本和数据库中报错解决方案
1.到数据库表django_migrations中查看app中看看app列 2.到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样 3.找到哪里不一致的文 ...
- Oracle中对现有表增加列
altertable Tablename add(column1 varchar2(20),column2 number(7,2)...) --Oracle中修改列名不可以,但是可以删除列,增加列 a ...
- codeforces 808D
题意:给出一个序列,询问是否能移动一个数(或不操作)使得序列能分为左右两个和相等的子序列. 思路:对每个数处理最左边和最右边出现的位置.设置断点分左右区间,左右区间和差值的一半就是要找的数,进行判断. ...