下面的代码很简单,替换参数功能很早前有人写过,而且写的还不错,直接贴代码。
import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.poi.POIXMLDocument; 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; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; public class POI_替换word2007参数_S3_Test { public static void main(String[] args) throws Exception { POI_替换word2007参数_S3_Test t = new POI_替换word2007参数_S3_Test(); t.testReplaceValue("f:/saveFile/temp/sys_s_tmp_8.docx"); } public void testReplaceValue(String fileName) throws Exception { XWPFDocument xdoc = new XWPFDocument( POIXMLDocument.openPackage(fileName)); Map<String, String> paramMap = new HashMap<String, String>(); paramMap.put("${vdate}", "2014-11-21"); paramMap.put("${version}", "V1.1"); paramMap.put("${versiondesc}", "仅供参考,From小瓜的博客"); paramMap.put("${v_author}", "小瓜"); paramMap.put("${name_1}", "测试POI替换Word 2007值"); paramMap.put("${s_name}", "小瓜"); paramMap.put("${no}", "" + System.currentTimeMillis()); paramMap.put("${class_name}", "保密"); paramMap.put("${t_name}", "瓜哥"); paramMap.put("${t_level}", "讲师"); paramMap.put("${major_name}", "计科"); paramMap.put("${t_desc}", "满架蔷薇一院香"); paramMap.put("${t_desc_date_1}", "2014-10-1"); paramMap.put("${t_desc_date_2}", "2014-10-1"); paramMap.put("${t_desc_2}", "风过栏杆水不波"); paramMap.put("${t_desc_date_3}", "2014-10-2"); paramMap.put("${t_desc_date_4}", "2014-10-2"); paramMap.put("${t_desc_3}", "此去经年,应是良辰好景虚设"); paramMap.put("${t_desc_date_5}", "2014-10-3"); paramMap.put("${t_desc_date_6}", "2014-10-3"); paramMap.put("${school_name}", "大学中庸"); paramMap.put("${b_j}", "2015"); paramMap.put("${b_name}", "无线路由器"); paramMap.put("${b_marjor}", "接天莲叶无穷碧"); paramMap.put("${b_class}", "无才"); paramMap.put("${b_date}", "二〇一四年十一月二十一日"); paramMap.put("${c_name}", "莫说相公痴"); paramMap.put("${c_add}", "般若波罗蜜多心经"); paramMap.put("${c_mm}", "如梦亦如幻"); paramMap.put("${c_mobile}", "因作如是观"); paramMap.put("${cn_name}", "订单表"); paramMap.put("${en_name}", "oracle_order_table"); paramMap.put("${table_desc}", "订单表测试"); List<List<String>> cellList=generateTestData(8); replaceParagraphValue(xdoc, paramMap); replaceTableValueNoraml(xdoc, paramMap); replaceLastTableValue(xdoc, paramMap, cellList); saveDocument(xdoc, "f:/saveFile/temp/sys_" +System.currentTimeMillis()+ ".docx"); } public List<List<String>> generateTestData(int num) { List<List<String>> resultList = new ArrayList<List<String>>(); for (int i = 1; i <= num; i++) { List<String> list = new ArrayList<String>(); list.add("测试_" + i); list.add("测试2_" + i); list.add("varchar2(60)"); list.add("无"); list.add("String"); list.add("否"); list.add("是"); resultList.add(list); } return resultList; } public void replaceParagraphValue(XWPFDocument xdoc, Map<String, String> paramMap) throws Exception { // 替换段落中的指定文字 List<XWPFParagraph> paragraphList = xdoc.getParagraphs(); if (paragraphList != null && paragraphList.size() > 0) { for (XWPFParagraph paragraph : paragraphList) { List<XWPFRun> runs = paragraph.getRuns(); if (runs == null || runs.size() == 0) { continue; } for (int i = 0, len = runs.size(); i < len; i++) { String oldStr = runs.get(i).getText(0); if(oldStr==null){ continue; } for (Entry<String, String> e : paramMap.entrySet()) { oldStr = oldStr.replace(e.getKey(), e.getValue()); } if (oldStr != null) { runs.get(i).setText(new String(oldStr), 0); } } } } } // 不替换最后一个表格 public void replaceTableValueNoraml(XWPFDocument xdoc, Map<String, String> paramMap) throws Exception { // 替换表格中的指定文字 List<XWPFTable> tableList = xdoc.getTables(); // 不替换最后一个表格 for (int i = 0, len = tableList.size() - 1; i < len; i++) { XWPFTable table = tableList.get(i); for (int j = 0, rcount = table.getNumberOfRows(); j < rcount; j++) { XWPFTableRow row = table.getRow(j); List<XWPFTableCell> cells = row.getTableCells(); if (cells == null || cells.size() == 0) { continue; } for (XWPFTableCell cell : cells) { List<XWPFParagraph> cellPList = cell.getParagraphs(); replaceTableCellParagraphValue(xdoc, cellPList, paramMap); } } } } public void replaceTableCellParagraphValue(XWPFDocument xdoc, List<XWPFParagraph> cellPList, Map<String, String> paramMap) throws Exception { // 替换段落中的指定文字 if (cellPList != null && cellPList.size() > 0) { for (XWPFParagraph paragraph : cellPList) { List<XWPFRun> runs = paragraph.getRuns(); if (runs == null || runs.size() == 0) { continue; } for (int i = 0, len = runs.size(); i < len; i++) { String oldStr = runs.get(i).getText(0); if(oldStr==null){ continue; } for (Entry<String, String> e : paramMap.entrySet()) { oldStr = oldStr.replace(e.getKey(), e.getValue()); } if (oldStr != null) { runs.get(i).setText(new String(oldStr), 0); } } } } } //替换最后一个表格值 public void replaceLastTableValue(XWPFDocument xdoc, Map<String, String> paramMap, List<List<String>> resultList) throws Exception { List<XWPFTable> tableList = xdoc.getTables(); if (tableList == null || tableList.size() == 0) { return; } XWPFTable table = tableList.get(tableList.size() - 1); XWPFTableRow row = null; List<XWPFTableCell> cells = null; //替换模版行前面的数据 for (int j = 0, rcount = table.getNumberOfRows() - 1; j < rcount; j++) { row = table.getRow(j); cells = row.getTableCells(); if (cells == null || cells.size() == 0) { continue; } for (int k = 0, len = cells.size(); k < len; k++) { List<XWPFParagraph> cellPList = cells.get(k).getParagraphs(); replaceTableCellParagraphValue(xdoc, cellPList, paramMap); } } int lastRowSize=table.getNumberOfRows() - 1; XWPFTableRow lastRow = table.getRow(lastRowSize); List<XWPFTableCell> tmpCells = lastRow.getTableCells(); if (tmpCells.size() != resultList.get(0).size()) { return; } XWPFTableCell tmpCell = null; for (int i = 0, len = resultList.size(); i < len; i++) { row = table.createRow(); row.setHeight(lastRow.getHeight()); List<String> list = resultList.get(i); cells = row.getTableCells(); // 插入的行会填充与表格第一行相同的列数 for (int k = 0, klen = cells.size(); k < klen; k++) { tmpCell = tmpCells.get(k); XWPFTableCell cell = cells.get(k); setCellText(tmpCell, cell, list.get(k)); } // 继续写剩余的列 for (int j = cells.size(), jlen = list.size(); j < jlen; j++) { tmpCell = tmpCells.get(j); XWPFTableCell cell = row.addNewTableCell(); setCellText(tmpCell, cell, list.get(j)); } } //删除模版行 table.removeRow(lastRowSize); } //非完全复制样式(只复制简单的样式) public void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text) throws Exception { CTTc cttc2 = tmpCell.getCTTc(); CTTcPr ctPr2 = cttc2.getTcPr(); CTTc cttc = cell.getCTTc(); CTTcPr ctPr = cttc.addNewTcPr(); cell.setColor(tmpCell.getColor()); cell.setVerticalAlignment(tmpCell.getVerticalAlignment()); if (ctPr2.getTcW() != null) { ctPr.addNewTcW().setW(ctPr2.getTcW().getW()); } if (ctPr2.getVAlign() != null) { ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal()); } if (cttc2.getPList().size() > 0) { CTP ctp = cttc2.getPList().get(0); if (ctp.getPPr() != null) { if (ctp.getPPr().getJc() != null) { cttc.getPList().get(0).addNewPPr().addNewJc() .setVal(ctp.getPPr().getJc().getVal()); } } } if (ctPr2.getTcBorders() != null) { ctPr.setTcBorders(ctPr2.getTcBorders()); } XWPFParagraph tmpP = tmpCell.getParagraphs().get(0); XWPFParagraph cellP = cell.getParagraphs().get(0); XWPFRun tmpR = null; if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) { tmpR = tmpP.getRuns().get(0); } XWPFRun cellR = cellP.createRun(); cellR.setText(text); // 复制字体信息 if (tmpR != null) { cellR.setBold(tmpR.isBold()); cellR.setItalic(tmpR.isItalic()); cellR.setStrike(tmpR.isStrike()); cellR.setUnderline(tmpR.getUnderline()); cellR.setColor(tmpR.getColor()); cellR.setTextPosition(tmpR.getTextPosition()); if (tmpR.getFontSize() != -1) { cellR.setFontSize(tmpR.getFontSize()); } if (tmpR.getFontFamily() != null) { cellR.setFontFamily(tmpR.getFontFamily()); } if (tmpR.getCTR() != null) { if (tmpR.getCTR().isSetRPr()) { CTRPr tmpRPr = tmpR.getCTR().getRPr(); if (tmpRPr.isSetRFonts()) { CTFonts tmpFonts = tmpRPr.getRFonts(); CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR .getCTR().getRPr() : cellR.getCTR().addNewRPr(); CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr .getRFonts() : cellRPr.addNewRFonts(); cellFonts.setAscii(tmpFonts.getAscii()); cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme()); cellFonts.setCs(tmpFonts.getCs()); cellFonts.setCstheme(tmpFonts.getCstheme()); cellFonts.setEastAsia(tmpFonts.getEastAsia()); cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme()); cellFonts.setHAnsi(tmpFonts.getHAnsi()); cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme()); } } } } // 复制段落信息 cellP.setAlignment(tmpP.getAlignment()); cellP.setVerticalAlignment(tmpP.getVerticalAlignment()); cellP.setBorderBetween(tmpP.getBorderBetween()); cellP.setBorderBottom(tmpP.getBorderBottom()); cellP.setBorderLeft(tmpP.getBorderLeft()); cellP.setBorderRight(tmpP.getBorderRight()); cellP.setBorderTop(tmpP.getBorderTop()); cellP.setPageBreak(tmpP.isPageBreak()); if (tmpP.getCTP() != null) { if (tmpP.getCTP().getPPr() != null) { CTPPr tmpPPr = tmpP.getCTP().getPPr(); CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP .getCTP().getPPr() : cellP.getCTP().addNewPPr(); // 复制段落间距信息 CTSpacing tmpSpacing = tmpPPr.getSpacing(); if (tmpSpacing != null) { CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr .getSpacing() : cellPPr.addNewSpacing(); if (tmpSpacing.getAfter() != null) { cellSpacing.setAfter(tmpSpacing.getAfter()); } if (tmpSpacing.getAfterAutospacing() != null) { cellSpacing.setAfterAutospacing(tmpSpacing .getAfterAutospacing()); } if (tmpSpacing.getAfterLines() != null) { cellSpacing.setAfterLines(tmpSpacing.getAfterLines()); } if (tmpSpacing.getBefore() != null) { cellSpacing.setBefore(tmpSpacing.getBefore()); } if (tmpSpacing.getBeforeAutospacing() != null) { cellSpacing.setBeforeAutospacing(tmpSpacing .getBeforeAutospacing()); } if (tmpSpacing.getBeforeLines() != null) { cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines()); } if (tmpSpacing.getLine() != null) { cellSpacing.setLine(tmpSpacing.getLine()); } if (tmpSpacing.getLineRule() != null) { cellSpacing.setLineRule(tmpSpacing.getLineRule()); } } // 复制段落缩进信息 CTInd tmpInd = tmpPPr.getInd(); if (tmpInd != null) { CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd() : cellPPr.addNewInd(); if (tmpInd.getFirstLine() != null) { cellInd.setFirstLine(tmpInd.getFirstLine()); } if (tmpInd.getFirstLineChars() != null) { cellInd.setFirstLineChars(tmpInd.getFirstLineChars()); } if (tmpInd.getHanging() != null) { cellInd.setHanging(tmpInd.getHanging()); } if (tmpInd.getHangingChars() != null) { cellInd.setHangingChars(tmpInd.getHangingChars()); } if (tmpInd.getLeft() != null) { cellInd.setLeft(tmpInd.getLeft()); } if (tmpInd.getLeftChars() != null) { cellInd.setLeftChars(tmpInd.getLeftChars()); } if (tmpInd.getRight() != null) { cellInd.setRight(tmpInd.getRight()); } if (tmpInd.getRightChars() != null) { cellInd.setRightChars(tmpInd.getRightChars()); } } } } } public void saveDocument(XWPFDocument document, String savePath) throws Exception { FileOutputStream fos = new FileOutputStream(savePath); document.write(fos); fos.close(); } }
模版见附件.
结果为:
替换后:
替换后:
转载请注明原处,原文链接:http://53873039oycg.iteye.com/blog/2159102,谢谢。
全文完。
相关推荐
有了这么一个管理器,平时可以将自己辛苦写出来的代码片段或算法记录下来。实际上这只是个支持语法着色的简单代码编辑器,带了一点文件管理功能。 更新日志在http://blog.sina.com.cn/s/blog_6204ca300100lh20.html...
精选的 PHP 代码片段可以让您在30秒内快速学习和了解 PHP 编程。这些精彩的片段涵盖了各种主题,从字符串操作到数组处理,再到文件操作和数据库连接,无所不包。只需阅读简短的代码示例,您就能快速掌握 PHP 的基础...
此均个人实践后,将原子化的代码片段,记录于此。日后简单拼接,更为实用。 创建:2020年4月5日。 更新:2020年4月5日。 1 目录及文件操作 1.1 遍历多层级目录 os.walk() ''' 注意:自带递归,无限遍历。每次的 ...
有了这么一个管理器,平时可以将自己辛苦写出来的代码片段或算法记录下来。实际上这只是个支持语法着色的简单代码编辑器,带了一点文件管理功能。 更新日志在http://blog.sina.com.cn/s/blog_6204ca300100lh20.html...
.neter在编码时,敲Try 然后连按两次Tab键盘,然后VisualStudio自动帮我们补上完整try语句的代码;在这个过程中,其实Visual Studio是调用了try.snippet代码片段。我们通过此工具可以编写属于自己的代码片段
根据自定义功能块配合代码片段来实现快捷输入以致对编程简单化、快捷化、标准化
DevChat 旨在超越简单的代码自动完成和对代码片段的有限操作。DevChat 为开发人员提供了一种非常实用和有效的方式来与大型语言模型 (LLM) 进行交互和协作。AI编码助手通过手动控制生效。没有过度的自动化,...
有时候,我们需要测试一些代码片段,而电脑中没有安装针对该语言的运行环境,没关系,你可以在线测试它们。 本文为你带来 8 款非常好用的代码片段在线工具,帮助你快速、方便地测试、编辑代码片段。 1. ideone ...
本文主要介绍了使用C#开发winform进行简单的模拟登陆抓取网页源码(注:本文只有重要片段代码!)
一个简单的react组件来编写代码片段 安装 npm install cn-react-coda 发展 测试 npm run test 建造 npm run build 皮棉 npm run lint 如何使用? import React from "react" import { Coda } from "cn-react-coda"...
Free Pascal AVR 微控制器代码片段、示例和库的集合。 结构 src 文件夹 垃圾桶 用于 avr 的 Linux-64 位编译的 gdb 8.0,包括用于调试程序内存的补丁。 例子 姓名 描述 眨眼1 一个使用繁忙延迟函数的简单闪烁示例...
我一直在各处使用的小片段和有用的代码片段。 太简单了,无法成为图书馆。 只需剪切并粘贴。 跨平台C / C ++。 公共区域。 片段 语 领域 C ++ ARC4流密码 C / C ++ 旧的assert()宏具有新的技巧 C atoi...
qmui-ios-codesnippets是一个QMUI团队日常工作中整理出来的Xcode的iOS通用代码片段集,其中也包含多个专用于iOS的QMUI框架的代码片段。 整理这个代码片段集的初衷有以下几点: 我们发现由于Xcode本身的功能不足,...
简单片段 简单片段的代码,简单的问答
片段 日常工作的简单代码片段
SEMCS:简单的嵌入式Markdown代码片段 用于从源文件中在Markdown文档中指定,生成和插入Markdown代码段的工具。 使用此工具,您可以根据Markdown文档中源文件中的函数名称指定代码段,并在输出文档中生成内联代码段...
抵制重构将带来技术麻烦:忘记代码片段的功能、创建无法测试的代码等等。 而有了重构,使用单元测试、共享代码以及更可靠的无BUG的代码这些最佳实践就显得简单多了。 《31天重构速成》该系列文章通过31个示例介绍了...
等等,通过简单设置组件的属性自动生成代码片段,默认使用的是最新版的jquery mobile 1.4.3版本。 jquery mobile代码助手包含了对JQuery Mobile中的所有组件属性的详细介绍。对于JQuery Mobile的初学者,可以通过...
适用于使用Electron&Vue.js构建的开发人员的简单代码段和要点管理器 :rocket: 总览 该项目的目的是通过提供一个非常酷的工具来使我们更加高效:一种用于代码的记事本 :grinning_face_with_big_eyes: :memo: 演示版 ...