POI 实现Word替换书签
1 Maven依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version></dependency>
2 替换书签
/*** 替换书签** @param document* @param bookTagMap 书签map*/public static void replaceBookTag(XWPFDocument document, Map<String, Object> bookTagMap) {List<XWPFParagraph> paragraphList = document.getParagraphs();for (XWPFParagraph xwpfParagraph : paragraphList) {CTP ctp = xwpfParagraph.getCTP();for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);if (bookTagMap.containsKey(bookmark.getName())) {XWPFRun run = xwpfParagraph.createRun();run.setText(bookTagMap.get(bookmark.getName()).toString());Node firstNode = bookmark.getDomNode();Node nextNode = firstNode.getNextSibling();while (nextNode != null) {// 循环查找结束符String nodeName = nextNode.getNodeName();if (nodeName.equals("w:bookmarkEnd")) {break;}// 删除中间的非结束节点,即删除原书签内容Node delNode = nextNode;nextNode = nextNode.getNextSibling();ctp.getDomNode().removeChild(delNode);}if (nextNode == null) {// 始终找不到结束标识的,就在书签前面添加ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), firstNode);} else {// 找到结束符,将新内容添加到结束符之前,即内容写入bookmark中间ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), nextNode);}}}}}
3 调试代码
/*** 替换书签** @param response*/@GetMapping("/replaceBookTag")public void replaceBookTag(HttpServletResponse response) {try {//读文件ClassPathResource cpr = new ClassPathResource("/doc/模板.docx");XWPFDocument document = new XWPFDocument(cpr.getInputStream());//书签数据Map<String, Object> bookTagMap = new HashMap<>();bookTagMap.put("xudongmaster", "旭东怪");bookTagMap.put("xudongmaster2", "旭东怪2");replaceBookTag(document,bookTagMap);//返回流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 调试结果
注:
(1)出现书签替换失败的情况时,解决办法参考以下博客。
POI XWPFParagraph.getRuns分段混乱问题解决
(2)该书签替换功能有两个问题,第一个是样式会修改,第二个是不支持表格内的书签替换。想要实现完美的文字替换效果请参考以下这篇博客。
POI 实现Word替换文本2种情况(正常文本、表格文本)
POI 实现Word替换书签相关推荐
- poi操作word替换模板向指定位置添加图表
poi操作word替换模板向指定位置添加图表 首先是引入pom文件 <dependency><groupId>org.apache.poi</groupId>< ...
- 踩坑日记--poi操作word替换图片显示问题
说明 最近遇到一个比较坑的问题,就是使用poi操作word文档,通过替换书签的方式替换成图片时,图片在word中显示正常,但是通过libreoffice转成pdf时显示不全.经过测试发现,图片插入到w ...
- POI 实现Word替换文本2种情况(正常文本、表格文本)
1 Maven依赖 <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifa ...
- Java poi 操作word替换模版中固定参数(页眉、段落、表格)
近期碰到一个稍微头疼的需求,将word模版中的参数替换为实际值,其中包括段落.列表(行数不够时自动递增).页眉:本文以docx文档为例,其中代码有其他地方参考,如有冒犯,还请海涵: 模版: 实现效果: ...
- C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签
概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章"C# 如何添加/删除Word书签"中介绍了插入.删除书签的方法,本篇文章将对C# 操作W ...
- word 文档操作类,可以读出word中书签 批量替换内容,直接调用
using System; using System.Collections.Generic; using System.Text; using Word = Microsoft.Office.Int ...
- java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换 springboot项目
本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:h ...
- poi编辑word中的chart,对图表数据替换,并刷新图表
最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候). 而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样. 首先看一下要处理的wo ...
- java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片
介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...
- java操作word,添加页眉,页眉图片,替换书签,添加水印(全)
java操作word文档,添加页眉文本,页眉图片,替换书签,水印 原模板截图: 生成后的文档效果截图: 第一步:引入maven <dependency><groupId>spi ...
最新文章
- 运维日常:群发邮件营销平台--EDM
- python3语法错误-关于在python3.7当中的语法错误!
- 如何正确关闭游戏服务器
- Python学习入门基础教程(learning Python)--1.4 Python数据处理基础 .
- 实现先pop后push的效果,如支付成功后的界面
- 查看约束信息_【华智产品汇】育种信息安全的守护者——华智育种管家
- Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数
- 以太坊应用网络项目LUKSO通过可逆ICO筹集1800万美元
- 产业区块链:新基建中的底层技术基座,各行业资深人士应积极参与建设
- 网页设计中时尚​​的下拉菜单案例
- python歌词统计单词词频_python词频统计
- VHDL 仿真出现 UUUUUUUU 红线
- kali 改root_linux切换到root用户,kali怎么切换root身份运行
- 网工软考中级数据通信技术
- 点赋科技:本地生活,如何开启复苏之路
- magicmatch java_签名图片一键批量生成 使用Java的Webmagic爬虫实现
- 访客模式 无痕模式 区别_模式:访客模式
- item_search_img-按图搜索1688商品(拍立淘)接口的接入参数说明
- EXFO 730C光时域反射计只有iOLM光眼升级OTDR(开通otdr权限)
- docker-前端部署
热门文章
- jQuery将json对象转为字符串,将json字符串转为对象
- Java JDK中文帮助文档免费下载,百度网盘下载。
- mysql sqlyog讲解_MySQL与sqlyog安装教程图文详解
- 第三章 PCB 封装库绘制
- python 培训 邹博
- spring源码下载安装,导入idea以及编译报错问题详细解决过程
- oracle安装sqluldr2,Oracle sqluldr2工具使用方法
- bp神经网络预测模型原理,神经网络模型怎么预测
- JSON与JAVA数据的转换。JSONObject.fromObject()和JSONObject.toBean()
- 微型计算机原理目录,微型计算机原理与应用 目录