Java使用poi的XWPFDocument 实现word模板动态添加表格行并进行变量替换

Java使用poi的XWPFDocument 实现word模板动态添加表格行并进行变量替换

场景分析

用户在前端页面进行构建理财产品组合时会选择1~N种产品,所以需要word模板对应区域动态生成多行产品行,并将其中内容替换,模板类似下图。
注意!!!!!!模板中的${E1} 这种替换符,一定要从txt等文本中写好再整体粘贴到word模板中,否则可能替换时识别不到完整的替换符。

依赖引入

       <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.9</version>
        </dependency>

代码参考

代码如下(示例):

    public static void main(String[] args) throws Exception {
        //自行放一个word模板
        XWPFDocument document = new XWPFDocument(new FileInputStream("D:\\word\\template.docx"));
        //这里代表获取word里面第一个表格。
        XWPFTable table = document.getTables().get(0);
        //模拟前端数据
        Map<String, String> map = new HashMap<>();
        map.put("${E1}", "张三");
        map.put("${E2}", "6R");
        map.put("${E3}", "均衡型");
        map.put("${E4}", "李丹");

        map.put("${A1}", "15%");
        map.put("${A2}", "6%");
        map.put("${A3}", "3%");

        map.put("${B1}", "理财产品1");
        map.put("${B2}", "pro001");
        map.put("${B3}", "100w");
        map.put("${B4}", "交银");

        map.put("${B5}", "基金产品2");
        map.put("${B6}", "pro002");
        map.put("${B7}", "10w");
        map.put("${B8}", "沃德");

        map.put("${B9}", "保险产品3");
        map.put("${B10}", "pro003");
        map.put("${B11}", "33w");
        map.put("${B12}", "快捷");

        map.put("${C1}", "c1c1c1");
        map.put("${C2}", "c2c2c2");
        map.put("${C3}", "c3c3c3");
        map.put("${C4}", "c4c4c4");
        map.put("${C5}", "c5c5c5");

        map.put("${D1}", "d1d1d1");
        map.put("${D2}", "d2d2d2");
        map.put("${D3}", "d3d3d3");
        map.put("${D4}", "d4d4d4");
        map.put("${D5}", "d5d5d5");
        //前端传入:一共几类产品
        int productCount = 3;
        //模板中的动态表格的变量 ${B?} 从多少开始
        int startIndex = 5;
        //从目标第几行开始插入,索引从0开始
        int newRowIndex = 7;
        //复制第七行表格
        InputStream inputStream = table.getRow(6).getCtRow().newInputStream();
        CTRow ctrow = CTRow.Factory.parse(inputStream);
        //for循环复制第7行表格,添加表格行,并将前端穿的参数变量值直接赋上值
        for (int i = 0; i < productCount - 1; i++) {
            XWPFTableRow row = new XWPFTableRow(ctrow, table);
            for (int j = 0; j < 4; j++) {
                XWPFTableCell cell = row.getCell(j);
                cell.removeParagraph(0);
                cell.setText(map.get("${B" + startIndex++ + "}"));
                //表格样式一致-->没有此段表格会默认左对齐
                //有此段会使表格格式一致
                CTTc cttc = cell.getCTTc();
                CTTcPr ctPr = cttc.addNewTcPr();
                ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
            }
            table.addRow(row,newRowIndex++);

        }

        //将其他变量赋值
        for (int i = 0; i < table.getNumberOfRows(); i++) {
            XWPFTableRow row = table.getRow(i);
            List<XWPFTableCell> tableCells = row.getTableCells();
            for (XWPFTableCell tableCell : tableCells) {
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    if (tableCell.getText().equals(entry.getKey())) {
                        tableCell.removeParagraph(0);
                        tableCell.setText(entry.getValue());
                        //表格样式一致-->没有此段表格会默认左对齐
		                //有此段会使表格格式一致
		                CTTc cttc = cell.getCTTc();
		                CTTcPr ctPr = cttc.addNewTcPr();
		                ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
		                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);

                    }
                }
            }

        }
        //写入另一个word文档中
        File docx = new File("D:\\word\\write.docx");
        FileOutputStream out = new FileOutputStream(docx);
        document.write(out);
        //关闭流
        out.close();
        inputStream.close();
    }

生成word效果如下图

在这里插入图片描述

总结

动态生成的那几行表格 样式有点变了,暂未解决

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用JavaPOI库操作.doc Word模板替换并循环插入表格的步骤如下: 1. 导入POI库的相关依赖,例如Apache POI和Apache POI-OOXML。 2. 创建一个Word文档(.docx),该文档将作为模板使用。 3. 使用Apache POI的XWPFDocument类加载模板文档。 ```java XWPFDocument doc = new XWPFDocument(new FileInputStream("template.docx")); ``` 4. 声明一个XWPFTable对象,用于向文档插入表格。 ```java XWPFTable table; ``` 5. 使用XWPFDocument类的getTables()方法获取文档的所有表格,通常一个模板只有一个表格。 ```java List<XWPFTable> tables = doc.getTables(); table = tables.get(0); // 假设我们要操作的表格是第一个表格 ``` 6. 使用XWPFTable对象的removeRow()方法删除表格的所有,这样就可以将模板删除,以便后面插入新的。 ```java for (int i = table.getRows().size() - 1; i > 0; i--) { table.removeRow(i); } ``` 7. 使用XWPFTable对象的createRow()方法创建新的,并使用XWPFTableRow对象的createCell()方法创建单元格。 ```java for (int i = 0; i < data.size(); i++) { XWPFTableRow newRow = table.createRow(); // 将data的数据添加到新的单元格 for (int j = 0; j < data.get(i).size(); j++) { XWPFTableCell newCell = newRow.getCell(j); newCell.setText(data.get(i).get(j)); } } ``` 8. 将替换表格的文档保存为新的文档。 ```java FileOutputStream out = new FileOutputStream("output.docx"); doc.write(out); out.close(); ``` 这样,你就可以使用JavaPOI库操作.doc Word模板替换表格并循环插入新的表格了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上海下小雨y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值