1 Maven依赖

        <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version></dependency>

2 POIWordUtil

POI Word工具类。

package com.util;import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;import cn.hutool.core.util.StrUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;/*** poi word工具类*/
public class POIWordUtil {/*** 替换内容** @param textMap 需要替换的信息集合*/public static void replaceWord(XWPFDocument document,Map<String, String> textMap) {//解析替换文本段落对象changeText(document, textMap);//解析替换表格对象changeTable(document, textMap);}/*** 替换段落文本** @param document docx解析对象* @param textMap  需要替换的信息集合*/public static void changeText(XWPFDocument document, Map<String, String> textMap) {//获取段落集合List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {//判断此段落时候需要进行替换String text = paragraph.getText();if (StrUtil.isNotBlank(text) && text.contains("${")) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {//替换模板原来位置String textValue = changeValue(run.toString(), textMap);run.setText(textValue, 0);}}}}/*** 替换表格对象方法** @param document docx解析对象* @param textMap  需要替换的信息集合*/public static void changeTable(XWPFDocument document, Map<String, String> textMap) {//获取表格对象集合List<XWPFTable> tables = document.getTables();for (int i = 0; i < tables.size(); i++) {//只处理行数大于等于2的表格,且不循环表头XWPFTable table = tables.get(i);if (table.getRows().size() > 1) {//判断表格内容是否可以替换String cellText = table.getText();if (StrUtil.isNotBlank(cellText) && cellText.contains("${")){List<XWPFTableRow> rows = table.getRows();//遍历表格,并替换模板eachTable(rows, textMap);}}}}/*** 遍历表格** @param rows    表格行对象* @param textMap 需要替换的信息集合*/public static void eachTable(List<XWPFTableRow> rows, Map<String, String> textMap) {for (XWPFTableRow row : rows) {List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {//判断单元格内容是否可以替换String cellText = cell.getText();if (StrUtil.isNotBlank(cellText) && cellText.contains("${")) {List<XWPFParagraph> paragraphs = cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {run.setText(changeValue(run.toString(), textMap), 0);}}}}}}/*** 匹配传入信息集合与模板** @param value   模板需要替换的区域* @param textMap 传入信息集合* @return 模板需要替换区域信息集合对应值*/public static String changeValue(String value, Map<String, String> textMap) {Set<Entry<String, String>> textSets = textMap.entrySet();for (Entry<String, String> textSet : textSets) {//匹配模板与替换值 格式${key}String key = "${" + textSet.getKey() + "}";if (value.indexOf(key) != -1) {value = value.replace(key, textSet.getValue());}}return value;}
}

3 调试代码

    /*** 替换内容** @param response*/@GetMapping("/replaceContent")public void replaceContent(HttpServletResponse response) {try {//读文件ClassPathResource cpr = new ClassPathResource("/doc/模板2.docx");XWPFDocument document = new XWPFDocument(cpr.getInputStream());//文本数据Map<String, String> contentMap = new HashMap<>();contentMap.put("xudongmaster", "旭东怪");contentMap.put("xudongmaster2", "旭东怪2");contentMap.put("xudongmaster3", "旭东怪3");contentMap.put("tablexudongmaster", "表格旭东怪");contentMap.put("tablexudongmaster2", "表格旭东怪2");contentMap.put("tablexudongmaster3", "表格旭东怪3");//替换内容POIWordUtil.replaceWord(document,contentMap);//返回流response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream;charset=UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + new String("模板.docx".getBytes("utf-8"), "ISO-8859-1"));OutputStream outputStream = response.getOutputStream();document.write(outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {e.printStackTrace();}}

4 模板文件

模板目录:

模板内容:

5 调试结果

注:

出现内容没有替换成功的情况时,解决办法参考以下博客。

POI XWPFParagraph.getRuns分段混乱问题解决

POI 实现Word替换文本2种情况(正常文本、表格文本)相关推荐

  1. poi操作word替换模板向指定位置添加图表

    poi操作word替换模板向指定位置添加图表 首先是引入pom文件 <dependency><groupId>org.apache.poi</groupId>< ...

  2. Java poi 操作word替换模版中固定参数(页眉、段落、表格)

    近期碰到一个稍微头疼的需求,将word模版中的参数替换为实际值,其中包括段落.列表(行数不够时自动递增).页眉:本文以docx文档为例,其中代码有其他地方参考,如有冒犯,还请海涵: 模版: 实现效果: ...

  3. 踩坑日记--poi操作word替换图片显示问题

    说明 最近遇到一个比较坑的问题,就是使用poi操作word文档,通过替换书签的方式替换成图片时,图片在word中显示正常,但是通过libreoffice转成pdf时显示不全.经过测试发现,图片插入到w ...

  4. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  5. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;

    本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533 在参考文章的基础上,增加了扩展.感谢被参考的妹子.另外该博客 ...

  6. java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片

    介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...

  7. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换 springboot项目

    本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:h ...

  8. poi编辑word中的chart,对图表数据替换,并刷新图表

    最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候). 而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样. 首先看一下要处理的wo ...

  9. Java poi之word文本图片内容提取

    目录结构 前言 文档准备 引入Maven依赖 代码块 提取结果验证 孤勇者提取结果 青鸟提取结果对比 前言 应公司需求,需实现以下功能 word文本内容的替换: word文本内容的提取: word文档 ...

最新文章

  1. 企业级UML/MDA工具Trufun 2007系列发布!
  2. 计算两个向量间的欧氏距离_用Numpy实现常见距离度量
  3. xp精简工具_办公人士需要精简Win10吗?
  4. 瑞晟蓝牙来电语音软件下载_拥有无数功能的工具箱软件
  5. 猜数字四个数字不重复C语言,c语言题 猜数字游戏
  6. Maven学习总结(58)—— 常用的 Maven 镜像地址和中央仓库地址汇总
  7. C#多线程学习(三) 生产者和消费者 2
  8. Android中如何Hook住JNI方法
  9. Linux终端控制台console和earlycon分析
  10. 前端取色器 FSCapture
  11. 通过网址获得视频网站的视频信息包括优酷,土豆,56,酷6
  12. 3D打印文件格式:STL、OBJ、AMF、3MF
  13. 利用Python一键爬取上海二手房信息
  14. 拼多多token是什么?如何提取及写入?
  15. python-matplotlib 绘制函数曲线
  16. 电脑和手机好用的播放器
  17. 《用户至上:用户研究方法与实践》用户体验入门
  18. JS获取json子项/数组的个数/长度
  19. 基于PHP的人才招聘网站设计
  20. ORA-01555错误解决

热门文章

  1. depth image
  2. Java:现实世界中最流行的10个Java应用程序示例
  3. wordpress博客搭建-保姆教程
  4. CSDN-Markdown LateX 数学公式
  5. Hive条件在on和where后面区别
  6. 简明 Vim 练级攻略 [转至 酷 壳 – CoolShell.cn]
  7. HDFS(下):NameNode和SecondaryNameNode、HDFS工作机制、故障处理、集群安全模式、服役退役节点、集群黑白名单、DataNode多目录详解、HDFS2.x新特性
  8. 为什么说品牌推广离不开软文营销呢?一文告诉你软文营销的优势
  9. vscode中编写代码时tab键不能用
  10. ES Module 和 Commonjs | require和import的区别