工作中,我们时常会遇到一些操作文件的操作,比如在线生成合同模板,上传/下载/解析Excel,doc文档转为pdf等操作。本文就已工作中遇到的在线生成合同为例,简要地介绍一种文档替换写法。

本文目的:给出源文件模板,通过程序操作后,替换模板中的指定内容,从而生成固定模板的文件。

使用场景:生成固定格式的合同信息。

原理:给一个文档模板,需要替换的内容以 $$包含,然后,在代码中给需要替换的字段赋值,生成新的文档。

工具包:poi-ooxml-3.10.jar   自己网上下载

代码:

1 packageword2pdf;2

3 importjava.io.FileOutputStream;4 importjava.util.HashMap;5 importjava.util.Iterator;6 importjava.util.List;7 importjava.util.Map;8 importjava.util.Map.Entry;9 importjava.util.Set;10

11 importorg.apache.poi.POIXMLDocument;12 importorg.apache.poi.xwpf.usermodel.XWPFDocument;13 importorg.apache.poi.xwpf.usermodel.XWPFParagraph;14 importorg.apache.poi.xwpf.usermodel.XWPFRun;15 importorg.apache.poi.xwpf.usermodel.XWPFTable;16 importorg.apache.poi.xwpf.usermodel.XWPFTableCell;17 importorg.apache.poi.xwpf.usermodel.XWPFTableRow;18

19 public classDocWriterTest {20

21 public static void searchAndReplace(String srcPath, String destPath, Mapmap) {22 try{23 XWPFDocument document = newXWPFDocument(POIXMLDocument.openPackage(srcPath));24 /**

25 * 替换段落中的指定文字26 */

27 Iterator itPara =document.getParagraphsIterator();28 while(itPara.hasNext()) {29 XWPFParagraph paragraph =(XWPFParagraph) itPara.next();30 Set set =map.keySet();31 Iterator iterator =set.iterator();32 while(iterator.hasNext()) {33 String key =iterator.next().trim();34 List run =paragraph.getRuns();35 int runSize =run.size();36 for (int i = 0; i < runSize; i++) {37 String text = run.get(i).getText(0);38 System.out.println("++++++text++++++:" +text);39 for (Entrye : map.entrySet()) {40 if (text != null &&text.contains(e.getKey())) {41 text =text.replace(e.getKey(), e.getValue());42 System.out.println("++++++text222222222++++++:" +text);43 run.get(i).setText(text, 0);44 }45 }46 }47 }48 }49

50 /**

51 * 替换表格中的指定文字52 */

53 Iterator itTable =document.getTablesIterator();54 while(itTable.hasNext()) {55 XWPFTable table =(XWPFTable) itTable.next();56 int count =table.getNumberOfRows();57 for (int i = 0; i < count; i++) {58 XWPFTableRow row =table.getRow(i);59 List cells =row.getTableCells();60 for(XWPFTableCell cell : cells) {61 for(XWPFParagraph p : cell.getParagraphs()) {62 for(XWPFRun r : p.getRuns()) {63 String text = r.getText(0);64 for (Entrye : map.entrySet()) {65 if (text != null &&text.contains(e.getKey())) {66 text =text.replace(e.getKey(), e.getValue());67 r.setText(text, 0);68 }69 }70 }71 }72

73 }74 }75 }76 FileOutputStream outStream = null;77 outStream = newFileOutputStream(destPath);78 document.write(outStream);79 outStream.close();80 } catch(Exception e) {81 e.printStackTrace();82 }83

84 }85

86 public static void main(String[] args) throwsException {87 Map map = new HashMap();88 map.put("$name$", "coco");89 map.put("$sex$", "女");90 map.put("work", "Java开发");91 String srcPath = "E:\\cocoxu\\test_mode\\sourcefile.docx";92 String destPath = "E:\\cocoxu\\test_mode\\destfile.docx";93 searchAndReplace(srcPath, destPath, map);94 }95 }

调试时遇到的报错:

1.

java.lang.IllegalStateException: Zip File is closed

at org.apache.poi.openxml4j.util.ZipFileZipEntrySource.getEntries(ZipFileZipEntrySource.java:45)

at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:182)

at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:665)

at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:226)

at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:186)

at org.apache.poi.POIXMLDocument.openPackage(POIXMLDocument.java:67)

at word2pdf.DocWriterTest.searchAndReplace(DocWriterTest.java:23)

at word2pdf.DocWriterTest.main(DocWriterTest.java:93)

此类错看似是zip文件被关闭,其实不然。其实是由于文档路径写错,找不到文件导致的。

String srcPath = "E:\\cocoxu\\\test_mode\\sourcefile.docx";

2、没有生产想要的文件:

sourcefile.docx内容:

目的是用代码中的内容,替换文档中的内容,但是我们第一次得到的确实这样的:

在代码中打印日志,可以看到,word文档中的$name$被跨行分开了:

本来是一行的东西,为什么代码执行操作的时候会被分成三行呢?这个就是doc文档操作的问题啦 ,

方法一:操作源文档,对文档中所有拼写语法不合规范的都忽略

方法二:创建一个新文档,在纯英文格式下拼写字段,然后复制带源文件中,即可。

最终得到的目的问题内容:

至此,我们用java操作文档的案例就结束了,实际工作中也可以模仿此类代码去生成哦。

java实现保存合同模板_Java中常用到的文件操作那些事(一)——替换doc文档模板,生成真实合同案例...相关推荐

  1. 使用java对html源代码(拼装、可获取页面源代码)转换为(html页面,doc文档文件,pdf格式),doc文件转换成为pdf,文件的删除、压缩功能

    目录: 1.转换成为html页面 2.html源代码转换成为doc文件 3.html源代码转换成为pdf文件 4.压缩多个文件成为一个zip文件 5.对文件进行删除 实施过程: A.html页面的实现 ...

  2. java数据类型的转换函数_JAVA中常用数据类型转换函数

    JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...

  3. java对象类型有哪些_Java中常用的对象数据类型有哪些?它们分别又占多少个字节呢?...

    CSDN上面有关于数据类型的一篇总结详细的文章,顺便复制过来: 在java中常见的数据类型有哪些 ? 内置数据类型类型名称字节.位数最小值最大值默认值例子 byte字节1字节,8位-128(-2^7) ...

  4. java word标签替换_用java替换word文档模板中的变量

    是的,您可以使用Apache-POI来完成.您的变量名称必须是唯一的.请参阅以下代码 import java.io.FileInputStream; import java.io.FileNotFou ...

  5. 深入浅出MFC文档/视图架构之文档模板

    在"文档/视图"架构的MFC程序中,提供了文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板.我们先看看这个类的声明: / // CDocTemplate m ...

  6. VC++ 多文档模板(添加新文档模板)编程实例

    现在假设要做一个VC++多文档程序,一个文档类型处理txt文件,一个文档类型处理图片文件: 新加一个Img的文档模板类型: 先新建一个多文档工程,名为duodocDemo1: 在菜单选择 插入-类: ...

  7. Apikit 自学日记:API 文档模板

    我们可以通过创建API文档模板,并使用API文档模板来添加API文档,用于实现提高API文档创建效率,规范API文档格式的目的. 该功能是付费版本功能,需要升级为企业版方可使用. 创建API文档模板 ...

  8. java pdf库_Java中常用的操作PDF的类库

    iText iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用 ...

  9. 第十三章_Java中常用集合大整理(含底层数据结构简单介绍)

    第十三章_Java中常用集合大整理 1.集合和数组的区别 集合 既可以存储基本数据类型还可以存储引用数据类型 定长–>是数组最大的特点,也是最大的缺点 数组 只能存储引用数据类型 长度可变 相同 ...

最新文章

  1. 国内ntp时间服务器ip地址
  2. 单片机教学视频讲得好
  3. ipp 实现图像空间的转换
  4. java百度云推送demo_百度云推送java服务端maven安装完整demo
  5. 包含用法 includeFilters
  6. linux - 虚拟机的自动安装与dhcp
  7. 如何估算代码量_没有量杯,没有称,如何估算碳水化合物?
  8. HashiCorp Vault 1.0开源自动解封特性,新增Batch令牌
  9. 我做的第二个正则转换工具
  10. EIGRP and the OSPF redistribute
  11. spring-boot(2)--环境搭建
  12. 腾讯计划对斗鱼进行私有化?斗鱼盘前涨超10%
  13. 知道IP地址如何查看主机名和MAC(网卡)地址
  14. 招聘 集群研发工程师
  15. Java 操作 JSON
  16. 【Linux】Core dump故障分析
  17. 单片机原理及应用程序c语言版题库,单片机原理及应用(C语言版)
  18. STM8L052低功耗模式
  19. arcmap中有火星坐标码_GIS转换之火星坐标系转换
  20. c语言入门经典的作用,C语言入门经典

热门文章

  1. 计算机基础知识理论试题
  2. 肘关节附属运动测试软件,肘关节功能锻炼常用方法
  3. C++ 图像 和 视频 转换
  4. 数据库练习题第二篇(附答案)
  5. windows下gvim打开文件显示乱码的解决
  6. 计算机考试身份证和准考证号
  7. 【Xlinx】【ZynqMP】使用xsdb工具,通过仿真器启动uboot教程
  8. 为什么成为软件工程师的最佳途径是读大学?
  9. 火萤视频桌面|火萤视频桌面下载
  10. impdp导入指定表 oracle_使用impdp数据泵导入并重命名表名