java实现保存合同模板_Java中常用到的文件操作那些事(一)——替换doc文档模板,生成真实合同案例...
工作中,我们时常会遇到一些操作文件的操作,比如在线生成合同模板,上传/下载/解析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文档模板,生成真实合同案例...相关推荐
- 使用java对html源代码(拼装、可获取页面源代码)转换为(html页面,doc文档文件,pdf格式),doc文件转换成为pdf,文件的删除、压缩功能
目录: 1.转换成为html页面 2.html源代码转换成为doc文件 3.html源代码转换成为pdf文件 4.压缩多个文件成为一个zip文件 5.对文件进行删除 实施过程: A.html页面的实现 ...
- java数据类型的转换函数_JAVA中常用数据类型转换函数
JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...
- java对象类型有哪些_Java中常用的对象数据类型有哪些?它们分别又占多少个字节呢?...
CSDN上面有关于数据类型的一篇总结详细的文章,顺便复制过来: 在java中常见的数据类型有哪些 ? 内置数据类型类型名称字节.位数最小值最大值默认值例子 byte字节1字节,8位-128(-2^7) ...
- java word标签替换_用java替换word文档模板中的变量
是的,您可以使用Apache-POI来完成.您的变量名称必须是唯一的.请参阅以下代码 import java.io.FileInputStream; import java.io.FileNotFou ...
- 深入浅出MFC文档/视图架构之文档模板
在"文档/视图"架构的MFC程序中,提供了文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板.我们先看看这个类的声明: / // CDocTemplate m ...
- VC++ 多文档模板(添加新文档模板)编程实例
现在假设要做一个VC++多文档程序,一个文档类型处理txt文件,一个文档类型处理图片文件: 新加一个Img的文档模板类型: 先新建一个多文档工程,名为duodocDemo1: 在菜单选择 插入-类: ...
- Apikit 自学日记:API 文档模板
我们可以通过创建API文档模板,并使用API文档模板来添加API文档,用于实现提高API文档创建效率,规范API文档格式的目的. 该功能是付费版本功能,需要升级为企业版方可使用. 创建API文档模板 ...
- java pdf库_Java中常用的操作PDF的类库
iText iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用 ...
- 第十三章_Java中常用集合大整理(含底层数据结构简单介绍)
第十三章_Java中常用集合大整理 1.集合和数组的区别 集合 既可以存储基本数据类型还可以存储引用数据类型 定长–>是数组最大的特点,也是最大的缺点 数组 只能存储引用数据类型 长度可变 相同 ...
最新文章
- 国内ntp时间服务器ip地址
- 单片机教学视频讲得好
- ipp 实现图像空间的转换
- java百度云推送demo_百度云推送java服务端maven安装完整demo
- 包含用法 includeFilters
- linux - 虚拟机的自动安装与dhcp
- 如何估算代码量_没有量杯,没有称,如何估算碳水化合物?
- HashiCorp Vault 1.0开源自动解封特性,新增Batch令牌
- 我做的第二个正则转换工具
- EIGRP and the OSPF redistribute
- spring-boot(2)--环境搭建
- 腾讯计划对斗鱼进行私有化?斗鱼盘前涨超10%
- 知道IP地址如何查看主机名和MAC(网卡)地址
- 招聘 集群研发工程师
- Java 操作 JSON
- 【Linux】Core dump故障分析
- 单片机原理及应用程序c语言版题库,单片机原理及应用(C语言版)
- STM8L052低功耗模式
- arcmap中有火星坐标码_GIS转换之火星坐标系转换
- c语言入门经典的作用,C语言入门经典