解决poi操作docx替换${}占位符不成功的过程
来源:互联网 发布:python cst时间转换 编辑:程序博客网 时间:2024/06/04 23:27
先贴个代码
public static boolean replaceAndGenerateWord(String srcPath, String destPath, Map<String, String> map) throws IOException { String[] sp = srcPath.split("\\."); String[] dp = destPath.split("\\."); // 判断文件有无扩展名 if (sp.length <= 0 || dp.length <= 0) { return false; } if ( !sp[sp.length - 1].equalsIgnoreCase("docx") && !( sp[sp.length - 1].equalsIgnoreCase("doc") && dp[dp.length - 1].equalsIgnoreCase("doc") ) ) { return false; } // 比较文件扩展名 if (sp[sp.length - 1].equalsIgnoreCase("docx")) { XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath)); // 替换段落中的指定文字 Iterator<XWPFParagraph> itPara = document.getParagraphsIterator(); while (itPara.hasNext()) { XWPFParagraph paragraph = itPara.next(); List<XWPFRun> runs = paragraph.getRuns(); for (XWPFRun run : runs) { String oneparaString = run.getText(run.getTextPosition()); if (StringUtil.isBlank(oneparaString)){ continue; } for (Map.Entry<String, String> entry : map.entrySet()) { oneparaString = oneparaString.replace(entry.getKey(), entry.getValue()); } run.setText(oneparaString, 0); } } // 替换表格中的指定文字 Iterator<XWPFTable> itTable = document.getTablesIterator(); while (itTable.hasNext()) { XWPFTable table = itTable.next(); int rcount = table.getNumberOfRows(); for (int i = 0; i < rcount; i++) { XWPFTableRow row = table.getRow(i); List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) { String cellTextString = cell.getText(); for (Map.Entry<String, String> e : map.entrySet()) { cellTextString = cellTextString.replace(e.getKey(), e.getValue()); } cell.removeParagraph(0); cell.setText(cellTextString); } } } FileOutputStream outStream = new FileOutputStream(destPath); document.write(outStream); outStream.close(); return true; } // doc只能生成doc,如果生成docx会出错 if ((sp[sp.length - 1].equalsIgnoreCase("doc")) && (dp[dp.length - 1].equalsIgnoreCase("doc"))) { HWPFDocument document = new HWPFDocument(new FileInputStream(srcPath)); Range range = document.getRange(); for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText(entry.getKey(), entry.getValue()); } FileOutputStream outStream = new FileOutputStream(destPath); document.write(outStream); outStream.close(); return true; } return false; }
1.在段落替换部分,最小单位是XWPFRun,XWPFRun是一个XML节点,包含了各种样式,属性和文字
2.从XWPFRun中取出文字进行替换,失败的原因就是:${company}被分割在了数个XWPFRun里面,替换失败,看图:
解决办法:修改节点
1.word打开原docx文件,取消各种拼写检查,另存为 xml文件
2.文本编辑器打开xml,找到要替换的属性占位符,处理成如下样子:
3.保存xml,用word打开xml,另存为,docx
4.愉快地跑代码吧!
阅读全文
1 0
- 解决poi操作docx替换${}占位符不成功的过程
- java POI word的docx文档中的文字替换,并把docx转成pdf文档
- POI创建DOCX常用操作
- Java poi 替换 word docx文件
- POI操作word模板并生成新的word.docx
- POI操作word2007(docx)文件的文本和图片
- POI操作word模板并生成新的word.docx
- POI操作word模板并生成新的word.docx
- docx4j 解析docx时 出现占位符分开的情况
- spring的启动过程03.1-占位符替换过程-xml配置的参数
- 简单的string占位符替换
- 简单的string占位符替换
- 简单的string占位符替换
- POI对docx模板进行文字、图片替换
- java 占位符替换
- 替换占位符
- POI读取.doc 和.docx的区别
- FTP操作中关于ftpclient.storeFile不成功的解决.
- css更改select样式关于ie的兼容
- qt5.9 子项目创建及qt项目管理
- Android 7.1 源码下载编译 (Ubuntu 14.0.4 环境下)
- 如何在右击菜单中添加新建项
- navicat报错ora28547
- 解决poi操作docx替换${}占位符不成功的过程
- Android-Crash处理----崩溃后禁止默认重启与崩溃后手动重启
- 欢乐斗地主玩法规则
- 没网?没问题。用Air Gap使用Artifactory
- 菜鸟的第一篇博客
- 程序集、命名空间和类
- c# 嵌套类
- 大数据揭秘:低学历成功逆袭概率多少?结果令人震惊!
- H5游戏将要带来新变局