解决poi操作docx替换${}或者{{}}占位符不成功的问题

在进行POI操作Word进行字符替换的时候,会出现加了占位符后替换失败的问题(没有加占位符前是能成功替换的);我们将poi读取到的字段打出来是这样,占位符和我们的关键字段被分行读取
例:在这里插入图片描述

解决办法:https://blog.csdn.net/throw404/article/details/107606636

在这之前
1.我们可以先将Word的拼写检查关闭Word的拼写检查
文件 -> 左下角选项 ->校对里关闭
因为我看解决办法的链接里的xml文件进行排查后 发现我的字段定义不规范(直接用的缩写) xml上都会体现 当我关闭拼写检查后再存为xml发现不用改xml的任何东西了 已经没有分割占位符的情况了
在这里插入图片描述

2.还有粘贴占位符的时候 可以先放在记事本然后再粘贴纯文本到Word去(血泪经验)
在这里插入图片描述

在Apache POI 3.7版本中,操作Word文档模板并替换 `${}` 占位符,包括处理页眉,可以按照以下步骤进行: 1. 导入所需库:首先确保已经添加了Apache POI库,特别是`poi`、`poi-ooxml`和`poi-ooxml-schemas`。 ```java import org.apache.poi.xwpf.usermodel.*; ``` 2. 加载模板文件:使用XWPFDocument加载包含页眉的模板。 ```java XWPFDocument template = new XWPFDocument(new FileInputStream("template.docx")); ``` 3. 定义替换规则:创建一个Map,将`${}`占位符映射到实际值。 ```java Map<String, String> placeholders = new HashMap<>(); placeholders.put("${header_text}", "实际页眉内容"); ``` 4. 遍历文档并替换:使用`XWPFParagraph`遍历每个段落查找占位符,然后用实际值替换。 ```java for (XWPFParagraph paragraph : template.getMainDocumentPart().getBody()) { for (XWPFRun run : paragraph.getRuns()) { if (run.getText().contains("${")) { String content = run.getText(); for (String key : placeholders.keySet()) { content = content.replaceFirst("\\$\\{" + key + "\\}", placeholders.get(key)); } run.setText(content); } } } ``` 5. 处理页眉:如果模板中使用的是XML样式(如`<w:hdr>`),你需要找到对应的元素,并用新内容替换。 ```java // 假设页眉在document.xml中 try (InputStream is = template.getDocument().getPackagePart("word/document.xml").getInputStream()) { XMLSlideShow ppt = new XMLSlideShow(is); // 使用XPath或类似的方式查找页眉元素 NodeList headerNodes = XPathFactory.newInstance().newXPath().evaluate("//w:hdr", ppt); for (int i = 0; i < headerNodes.getLength(); i++) { Node node = headerNodes.item(i); // 替换节点文本或其他属性 node.setTextContent(placeholders.get("${header_text}")); } } ``` 6. 保存修改后的文档:最后将处理过的模板保存为新的Word文档。 ```java OutputStream outputStream = new FileOutputStream("output.docx"); template.write(outputStream); outputStream.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值