都是通过占位符实现的,test方法改成工具类,传入参数就可以直接用了

需要的jar

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

替换文本

    @Testpublic void testInsertText() throws Exception {//获取时间Calendar cal = Calendar.getInstance();int day = cal.get(Calendar.DATE);int month = cal.get(Calendar.MONTH) + 1;int year = cal.get(Calendar.YEAR);int dow = cal.get(Calendar.DAY_OF_WEEK);int dom = cal.get(Calendar.DAY_OF_MONTH);int doy = cal.get(Calendar.DAY_OF_YEAR);//要替换的map,key为占位符,value为要被替换的值Map<String, Object> map = new HashMap<>();map.put("${company}", "金马投资公司");map.put("${name}", "陈玉");map.put("${idNumber}", "642152152542151254");map.put("${phone}", "13358445878");map.put("${address}", "北京市顺义区张家巷14号");map.put("${year}", year);map.put("${month}", month);map.put("${day}", day);map.put("${agent}", "张律师");//读取文件OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\期货委托合同.docx");//加载文档XWPFDocument doc = new XWPFDocument(opcPackage);//获取所有段落List<XWPFParagraph> paragraphList = doc.getParagraphs();for (XWPFParagraph par : paragraphList) {//获取段落的文本对象List<XWPFRun> runs = par.getRuns();for (XWPFRun run : runs) {//获取文本的值String text = run.getText(0);//遍历mapfor (Map.Entry<String, Object> entry : map.entrySet()) {//获取map的keyString key = entry.getKey();//判断文本的值和map的key,文本中是否有和key一样的占位符if (text.indexOf(key) != -1) {//获取对应key的valueObject value = entry.getValue();//把文本的内容,key替换为valuetext = text.replace(key, value.toString());//把替换好的文本内容,保存到当前这个文本对象run.setText(text, 0);}}}}File file = new File("D:\\期货委托合同1.docx");FileOutputStream fileOutputStream = new FileOutputStream(file);doc.write(fileOutputStream);}

${name}没成功是因为我直接在word里面手动输入的,没有被识别为一个文本对象,在其它地方写好${name},然后复制到word中

插入table

    @Testpublic void testInserTable1() throws Exception {//初始化一些数据//表头List<String> row1 = new ArrayList<>();row1.add("时间");row1.add("数量");row1.add("类型");//数据List<String> row2 = new ArrayList<>();row2.add("3-15");row2.add("1");row2.add("A");List<String> row3 = new ArrayList<>();row3.add("3-16");row3.add("3");row3.add("B");//数据List<List<String>>存储,只存数据,不存表头List<List<String>> rowData = new ArrayList<>();rowData.add(row2);rowData.add(row3);//读取文件OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\test.docx");//加载文档XWPFDocument doc = new XWPFDocument(opcPackage);//获取所有段落List<XWPFParagraph> paragraphList = doc.getParagraphs();//遍历段落for (int p=0;p<paragraphList.size();p++) {//获取当前段落的所有文本对象List<XWPFRun> runs = paragraphList.get(p).getRuns();//遍历文本对象for (int r=0;r<runs.size();r++) {//获取文本对象的值String text = runs.get(r).getText(0);if (text!=null){//判断有没有和占位符相同的,如果有if(text.indexOf("${table1}")>=0){//获取光标XmlCursor cursor = paragraphList.get(p).getCTP().newCursor();//插入新表格XWPFTable newTable = doc.insertNewTbl(cursor);//设置格式CTTblPr tblPr = newTable.getCTTbl().getTblPr();tblPr.getTblW().setType(STTblWidth.DXA);tblPr.getTblW().setW(new BigInteger("10000"));//创建好的表格默认有一个单元格,直接赋值newTable.getRow(0).getCell(0).setText(row1.get(0));//设置第一行剩下的值for (int i=1;i<row1.size();i++){newTable.getRow(0).createCell().setText(row1.get(i));}//创建row,rowData.size()判断有几行for (int i=0;i<rowData.size();i++){//创建rowXWPFTableRow row = newTable.createRow();//拿到第一行数据,判断有几列,然后逐列插入单元格的值for (int j=0;j<rowData.get(0).size();j++){row.getCell(j).setText(rowData.get(i).get(j));}}//删除旧的文本对象,就是删除占位符paragraphList.get(p).removeRun(0);}}}}doc.write(new FileOutputStream("D:\\test1.docx"));}

插入图片

    @Testpublic void insertImage() throws Exception {//读取文件OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\test.docx");//加载文档XWPFDocument doc = new XWPFDocument(opcPackage);//获取所有段落List<XWPFParagraph> paragraphList = doc.getParagraphs();//遍历段落for (int p = 0; p < paragraphList.size(); p++) {//获取所有文本对象List<XWPFRun> runs = paragraphList.get(p).getRuns();//遍历所有文本对象for (int r = 0; r < runs.size(); r++) {String text = runs.get(r).getText(0);if (text != null) {//判断文本对象是否包含图片占位符if (text.indexOf("${pic1}") >= 0) {//换行runs.get(r).addBreak();String picPath="D:\\pic.png";runs.get(r).addPicture(new FileInputStream(picPath),Document.PICTURE_TYPE_PNG,picPath, Units.toEMU(450),Units.toEMU(300));runs.get(r).addBreak(BreakType.TEXT_WRAPPING);//删除旧的文本对象,就是删除占位符//paragraphList.get(p).removeRun(0);//插入图片后,图片和占位符变成一个文本对象了,removeRun连图片一起删了,使用setTextruns.get(r).setText("",0);}}}}doc.write(new FileOutputStream("D:\\test1.docx"));}

遇到问题

使用${}字符内容被分割

使用${name}占位替换文字,解析发现被分割成了如下

,导致无法替换,解决方法:在其它地方写好${name},然后复制到word中,再次查看

代码和docx模板

需要全代码示例和模板的私聊

poi替换word内容相关推荐

  1. POI替换word中的指定文字(包含表格,表格中有回车)

    网上可以找到很多POI替换Word中指定文字的代码,然而基本上都没有对文档中的表格中包含的段落(回车)进行处理.自己写了,代码记录如下: /** * *@templetStream 文档的输入流 *@ ...

  2. php 修改word内容,php如何替换word内容

    php替换word内容的方法:首先下载PHPWORD,并解压缩放到项目下的"extend"中:然后加载word文件:最后使用"$loadtemplate->setV ...

  3. python 替换word内容 doc转换成docx

    python 替换word内容 doc转换成docx doc转换成docx 北京市,天津市,上海市,重庆市,河北省,山西省,辽宁省,吉林省,黑龙江省,江苏省,浙江省,安徽省,福建省,江西省,山东省,河 ...

  4. java利用POI替换word文档中的标签

    java利用POI替换word文档中的标签 <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  5. java使用poi替换word模板

    poi 操作word文档 0. 参考文档 感谢大萌音音's B站视频的分享, 如有不懂, 可以去看这个视频 1. poi 依赖 <dependency><groupId>org ...

  6. 使用poi替换XWPFTableCell内容,并设置行间距

    使用poi读取word文档(docx类型),进行数据替换. 另外,为了记录poi设置行间距的api,真是找了好几十分钟才找到啊啊啊啊!!! import org.apache.poi.xwpf.use ...

  7. Using POI to replace elements in WORD(.docx/.doc)(使用POI替换word中的特定字符/文字)【改进】...

    上一篇文章可能有点bug,这个是改进 package com.xfzx.test.POI.main;import java.io.File; import java.io.FileInputStrea ...

  8. python替换word内容,文档翻译-使用python替换word文档中的段落内容

    前段时间遇到一个需求,需要将word文档中的内容进行替换,并且需要保证格式不变.在找了一圈资料后,发现没有现成的api供使用:由于本人做过一段时间文档解析,因此打算从word文档的xml入手,通过py ...

  9. poi处理word内容的公式_利用poi操作word文档

    关键字:POI JAVA 批注 总页数 总字符数 一:认识POI Apache POI是一个开源的利用Java读写Excel.WORD等微软OLE2组件文档的项目.最新的3.5版本有很多改进,加入了对 ...

最新文章

  1. 编码中统一更该变量的快捷键_更多项目想法,以提高您的编码技能
  2. PHP中include和require
  3. 什么是控制单元?—Vecloud微云
  4. python 操作mongodb数据库参考文档
  5. 品味性能之道十一:JAVA中switch和if性能比较
  6. Linux 系统的运行级别(runlevel)
  7. matlab2016以上进行多体动力学不能用joint actuator驱动旋转关节,要用simulink-PS converter
  8. 利用机器学习方法确定各个特征的权重
  9. linux 伪静态 cms,常用CMS建站程序的Nginx伪静态规则大全
  10. sql连表查询、子查询、组合查询
  11. 手机端访问本地编写的html页面【亲测有效】
  12. 京东商品爬虫实战笔记
  13. 安卓图书信息管理系统
  14. MySQL数据库教程之七:MySQL编程基础
  15. c++四种cast的原理和用途
  16. JavaScript设计模式——订阅者-发布者模式简单实现
  17. Android完美解决LaTeX中文显示问题
  18. imac一体机,mac 电脑安装win7双系统
  19. Redis 服务配置 redis.conf 配置文件详解
  20. flink时间窗口无新的数据进来最后一个窗口不关闭

热门文章

  1. 关于AD17 原理图设置差分出现Number of nets in differential pair ** is 1 instead of 2的问题
  2. 浅谈区块链技术对未来行业的影响
  3. 关于UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE
  4. 从零开始研发GPS接收机连载——8、跟踪调试之遇到瓶颈
  5. java常用缩写(pojo、DAO、EAO、DTO)
  6. ipynb转python(.py)
  7. java中上传本地图片
  8. 高中数学基础-2.1.1(1)根式的运算
  9. Linux运维学习路径全解析
  10. cholesky 分解加速求解线性方程组