Java poi word模板填充数据

1、明细表格式 ${list_xxxxx} 普通格式 ${xxxxxx}

2、replaceInTable方法中 table.removeRow(2); 第三行是明细数据的第一行

工具类

public class WordOperationUtil {public void replaceWordContext(XWPFDocument doc, List<Map<String, Object>> params) throws InvalidFormatException, IOException, XmlException {replaceInHeader(doc, params);replaceInTable(doc, params);replaceInPara(doc, params);}/*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara(XWPFParagraph para, List<Map<String, Object>> params) throws InvalidFormatException, FileNotFoundException {if (this.matcher(para.getParagraphText()).find()) {List<XWPFRun> runs = para.getRuns();if (runs.size() == 0) {return;}String text = "";for (int i = 0; i < runs.size(); i++) {text += runs.get(i).text();}for (int i = 1; i < runs.size(); i++) {para.removeRun(i);}String outStr = getStrings(text, params.get(0));XWPFRun runX = para.getRuns().get(0);runX.setText(outStr, 0);}}/*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInParaList(XWPFParagraph para, String params) throws InvalidFormatException, FileNotFoundException {List<XWPFRun> runs = para.getRuns();if (runs.size() == 0) {return;}for (int i = 1; i < runs.size(); i++) {para.removeRun(i);i--;}XWPFRun runX = para.getRuns().get(0);runX.setText(params, 0);}public String getStrings(String inStr, Map<String, Object> mapvalue) {String outStr = inStr;String regex = "\\$\\{(.*?)\\}";//qq(.*?)qq//\\@(.*?)\\@Pattern p = Pattern.compile(regex);Matcher m = p.matcher(inStr);while (m.find()) {String ppStr = m.group(0);String ppReslutStr = m.group(1);outStr = strReplaceAll(outStr, ppStr, getMapValue(mapvalue, ppReslutStr));}return outStr;}public Map<String, Object> getListStrings(String inStr) {Map<String, Object> outMap = new HashMap<>();boolean out = false;String regex = "\\$\\{list_(.*?)\\}";//qq(.*?)qq//\\@(.*?)\\@Pattern p = Pattern.compile(regex);Matcher m = p.matcher(inStr);while (m.find()) {String ppReslutStr = m.group(1);out = true;outMap.put("filedName", ppReslutStr);}outMap.put("issuccess", out);return outMap;}private String getMapValue(Map<String, Object> mapvalue, String key) {String outStr = key;if (mapvalue.containsKey(key)) {outStr = mapvalue.get(key).toString();}return outStr;}private String strReplaceAll(String inStr, String target, String replacement) {String outStr = inStr;outStr = inStr.replace(target, replacement);if (outStr.contains(target)) {outStr = strReplaceAll(outStr, target, replacement);}return outStr;}/*** 替换表格里面的变量** @param doc    要替换的文档* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInTable(XWPFDocument doc, List<Map<String, Object>> params) throws InvalidFormatException, IOException, XmlException {List<XWPFTable> xwpfTables = doc.getTables();for (XWPFTable table : xwpfTables) {replaceInTable(table, params);}}public void replaceInTable(XWPFTable table, List<Map<String, Object>> params) throws InvalidFormatException, IOException, XmlException {String text = table.getText();boolean islist = (boolean) getListStrings(text).get("issuccess");int i = 0;List<XWPFTableRow> rows = table.getRows();List<String> fileds = new ArrayList<>();if (islist) {for (int t = 0; t < rows.size(); t++) {XWPFTableRow row = rows.get(t);List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {String cellText = cell.getText();boolean isListFiledName = (boolean) getListStrings(cellText).get("issuccess");if (isListFiledName) {String filedName = (String) getListStrings(cellText).get("filedName");fileds.add(filedName);i++;}}if (i > 0) {break;}}for (int j = 0; j < params.size(); j++) {//XWPFTableRow row = rows.get(j + 1);//XmlObject copy = row.getCtRow().copy();//table.addRow(new XWPFTableRow((CTRow) copy, table));//复制表头行的样式CTRow ctrow = CTRow.Factory.parse(table.getRow(2).getCtRow().newInputStream());//重点行XWPFTableRow newrow = new XWPFTableRow(ctrow, table);List<XWPFTableCell> cells = newrow.getTableCells();int t = 0;for (XWPFTableCell cell : cells) {List<XWPFParagraph> paras = cell.getParagraphs();String value = "";for (XWPFParagraph para : paras) {value = params.get(j).get(fileds.get(t)).toString();replaceInParaList(para, value);}//cell.setText(value,0);t++;}table.addRow(newrow);}table.removeRow(2);} else {for (XWPFTableRow row : rows) {List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> paras = cell.getParagraphs();for (XWPFParagraph para : paras) {this.replaceInPara(para, params);}}}}}/*** 替换段落里面的变量** @param doc    要替换的文档* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara(XWPFDocument doc, List<Map<String, Object>> params) throws InvalidFormatException, FileNotFoundException {Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();while (iterator.hasNext()) {XWPFParagraph para = iterator.next();this.replaceInPara(para, params);}}public void replaceInHeader(XWPFDocument doc, List<Map<String, Object>> params) throws InvalidFormatException, IOException, XmlException {List<XWPFHeader> pageHeaders = doc.getHeaderList();for (XWPFHeader pageHeader : pageHeaders) {List<XWPFParagraph> paragraphs = pageHeader.getParagraphs();List<XWPFTable> tables = pageHeader.getTables();for (XWPFParagraph paragraph : paragraphs) {this.replaceInPara(paragraph, params);}for (XWPFTable table : tables) {this.replaceInTable(table, params);}}}/*** 正则匹配字符串** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}/*** 关闭输入流** @param is*/public void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流** @param os*/public void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}/****************************************************************没用到************************************************************//*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara0(XWPFParagraph para, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {if (this.matcher(para.getParagraphText()).find()) {List<XWPFRun> runs = para.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.text();if (matcher(runText).find()) {String outStr = getStrings(runText, params);run.setText(outStr, 0);//XWPFRun runX = para.createRun();//runX.setText(outStr);//setTextStyle(  runX, run);}//para.removeRun(i);}}}private void setTextStyle(XWPFRun runX, XWPFRun replace) {runX.setCapitalized(replace.isCapitalized());//我也不知道这个属性做啥的runX.setTextPosition(replace.getTextPosition());//这个相当于设置行间距的,此元素指定文本应为此运行在关系到周围非定位文本的默认基线升降的量。不是真正意义上的行间距runX.setStrike(replace.isStrike());//---设置删除线的,坑人!!!runX.setStrikeThrough(replace.isStrikeThrough());//也是设置删除线,可能有细微的区别吧runX.setEmbossed(replace.isEmbossed());//变的有重影(变黑了一点)runX.setDoubleStrikethrough(replace.isDoubleStrikeThrough());//设置双删除线runX.setColor(replace.getColor());//---设置字体颜色runX.setFontFamily(replace.getFontFamily());//runX.setFontFamily("cursive");//---设置ASCII(0 - 127)字体样式runX.setBold(replace.isBold());//加粗runX.setFontSize(replace.getFontSize());//---字体大小runX.setImprinted(replace.isImprinted());//感觉与setEmbossed(true)类似,有重影runX.setItalic(replace.isItalic());//---文本会有倾斜,是一种字体?runX.setShadow(replace.isShadowed());//---文本会变粗有重影,与前面两个有重影效果的方法感觉没什么区别runX.setSmallCaps(replace.isSmallCaps());//---改变了  英文字母  的格式runX.setSubscript(replace.getSubscript());//---valign垂直对齐的runX.setUnderline(replace.getUnderline());//--填underline type设置下划线}/*** 替换段落里面的变量** @param para   要替换的段落* @param params 参数* @throws FileNotFoundException* @throws InvalidFormatException*/public void replaceInPara2(XWPFParagraph para, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {if (this.matcher(para.getParagraphText()).find()) {List<XWPFRun> runs = para.getRuns();String text = "";for (int i = 0; i < runs.size(); i++) {text += runs.get(i).toString();}String outStr = getStrings(text, params);if (text.contains("$")) {Object[] runArr = runs.toArray();int $Index = 0;for (int j = 0; j < runArr.length; j++) {if (runArr[j].toString().contains("$")) {$Index = j;break;}}int startIn = $Index;while (startIn < runs.size()) {para.removeRun(startIn);}para.createRun().setText(outStr);}}}}

2、方法调用

public static void main(String[] args) throws IOException, InvalidFormatException, XmlException {List<Map<String, Object>> maplists =new ArrayList<>();Map<String, Object> params0 = new HashMap<>();params0.put("orderno", "1");maplists.add(params0);InputStream is   = new FileInputStream(new File("C:\\Users\\xxxxx\\Desktop\\word\\temp.docx"));XWPFDocument doc= new XWPFDocument(is);WordOperationUtil   wordOperationUtil = new WordOperationUtil();wordOperationUtil.replaceWordContext(doc, maplists);//此处不指定下载目录,默认到用户本地的下载文件下OutputStream os = new FileOutputStream(new File("C:\\Users\\xxxx\\Desktop\\word\\temp2.docx"));doc.write(os);wordOperationUtil.close(os);wordOperationUtil.close(is);os.flush();os.close();System.out.println("word成功生成");//String inStr ="${list_eeertyyu}rrfvvrfrf${list_tttt}kkkkkk${list_cddddddddd}";//getListStrings(  inStr,new HashMap<>());}

模板格式

Java poi word模板填充数据、复制行删除行相关推荐

  1. Java根据word模板填充数据(使用poi-tl)

    poi-tl 是Word模板引擎,使用Word模板和数据创建Word文档. 文档地址: Poi-tl Documentation 里面详细说明了如何使用,已在项目中实践过,确实很好用的一个插件. 依赖 ...

  2. 利用poi向word模板填充数据

    java基于POI实现向word模板填充数据 在做项目的时候遇到需要将多张表单导出为word,就想到了这个方法. 注意:XWPFDocument不支持doc类型文档,做模板的时候要另存为docx. 示 ...

  3. java如何根据模板填充数据生成word文档

    java根据模板填充数据生成word文档 这篇文章干什么? 思路总览 1.准备word模板 2.转换文件格式 3.编写代码 补充--下载流 这篇文章干什么?   使用代码将word模板内容进行替换,并 ...

  4. vb 变量赋值为当前选定单元格_第7篇:根据Excel选定行对Word模板填充数据(补充修改)...

    题外:由于漏掉了勾选Microsoft Word 16.0 Object Library这个关键步骤(不勾选是无法导出的),故修改后再次发出.本期我是从知乎上的郭大牛老师那里学的,非常建议大家去阅读, ...

  5. word模板填充数据

    1.首先创建word模板文件aaa.docx 需要填充的字段用如下方式表示 2.导入依赖 <dependency><groupId>com.deepoove</group ...

  6. Python 使用Word模板填充数据

    工作需要使用Word模板,生成报告,安装pip install docxtpl. 首先挖出需要填充数据的地方,设计好数据返回的架构template_path为模板绝对路径: resulte_conte ...

  7. java读取excrl模板填充数据,spring mvc 读取excel模板填充数据下载

    需求: 将订单信息导出到excel中,存在excel模板,需要向其中添加数据. 技术选型: 对于excel操作,使用apache poi包.到maven repository找poi最新的发行包. 搜 ...

  8. Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题。

    Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题. 适用场景: 1.固定格式的W ...

  9. java 解析word模板为xml, 动态填充数据到xml,最后输出word文档

    java 解析word模板为xml, 动态填充数据到xml,最后输出word文档 在项目中, 一开始是使用java Apache poi 根据word模板生成word报表, 后面发现框架有个低版本的p ...

最新文章

  1. 软件测试实验--性能测试工具LoadRunner
  2. vs debug 模式生成的exe 另一台电脑_C++利用spdlog生成日志
  3. 主页被挟持 火狐浏览器_看过来!关于IE、360浏览器访问学校部分网站的设置说明在这里...
  4. perl的安装和版本切换工具-perlbrew
  5. mysql从库同步delete不动了_MySQL主从同步报错故障处理集锦
  6. JEPaas【按钮隐藏】根据单据状态值决定【添加明细】【删除】按钮的隐藏和显示
  7. springaop事务逻辑原理_搞懂Spring AOP,这一篇就够了
  8. webservice生成客户端的方法
  9. 如何获取filecoin_获得Filecoin币有哪些条件?
  10. python中threading模块中的Join类
  11. 是什么构成了“人工智能”热潮?
  12. LeetCode题解之Single Number
  13. 吊打本地搜索神器everthing,最快 最强的电脑本地搜索神器!
  14. TWS耳机什么值得买?入耳式蓝牙耳机排行榜10强!
  15. 电脑常用快捷键的使用
  16. 新能源汽车车载智能终端t-box
  17. openstack compute service list报错(HTTP 503)
  18. org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold
  19. Jmeter实现多用户压测
  20. 彻底搞懂ResNet50

热门文章

  1. 浏览器jsp、html之间的关系
  2. 二维数组作为函数参数的调用
  3. 【日常代码记录】如何实现一个beancopier的工具类?
  4. vue移除事件绑定 Orz
  5. position:ablosute和position:relative的简单理解
  6. 致“圆锥角膜”患者们的一封信,愿我和孩子的事能帮助到你们
  7. Shader Graph 呼吸灯设置
  8. hallway vs corridor
  9. mac os 录屏快捷键_一睹win、Mac常用录屏软件!
  10. 修正 SEIR传染病动力学模型应用于冠状病毒病( COVID-19) 疫情预测和评估