java根据word模板使用poi生成多条数据,合并在同一个word文件

在工作中遇到一个需求,就是会根据一个模板文件,和项目的集合数据生成多个项目的信息汇总到同一个word文件中独立展示,这里记录一下实现的过程(实现简单,效果也不错)。
先展示一下效果
模板示例:
在这里插入图片描述
生成的word:
在这里插入图片描述

一、引入依赖

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

二、具体实现的demo代码

	@Test
    public void copyWordInfoTest (){
        try {
            String basePath= "src/main/resources/";
            String templatePath =basePath+"project_info.docx";
            String outputPath = basePath+"/输出文件.docx";
            // 读取Word模板
            FileInputStream templateFile = new FileInputStream(templatePath);
            // 创建一个新的Word文档用于追加内容
            XWPFDocument newDoc = new XWPFDocument();
            // 创建项目信息集合
            // 假设Project类有name,scale和summary属性,可根据实际情况调整
            List<Project> projectList = new ArrayList<>();
            projectList.add(new Project("项目1", "规模1", "摘要1"));
            projectList.add(new Project("项目2", "规模2", "摘要2"));
            projectList.add(new Project("项目3", "规模3", "摘要3"));

            // 循环处理每个项目
            for (Project project : projectList) {

                // 复制Word模板
                XWPFDocument copiedTemplate = new MyXWPFDocument(new FileInputStream(templatePath));
                Map<String, Object> map = new HashMap<>();
                map.put("name",project.getName());
                map.put("scale",project.getScale());
                map.put("summary",project.getSummary());
                // 填充项目数据到新文档中
                WordExportUtil.exportWord07(copiedTemplate,map);

                // 追加到同一个Word文档中
                appendDocument(newDoc, copiedTemplate);

                // 关闭复制的模板文档
                copiedTemplate.close();
            }
            // 保存新生成的Word文件
            FileOutputStream out = new FileOutputStream(outputPath);
            newDoc.write(out);
            out.close();
            // 关闭文档
            newDoc.close();
            System.out.println("在同一个Word文件中生成项目信息成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 将一个文档追加到另一个文档的末尾
    private static void appendDocument(XWPFDocument baseDoc, XWPFDocument docToAppend) {
        try {
            for (IBodyElement element : docToAppend.getBodyElements()) {
                if (element instanceof XWPFParagraph) {
                    XWPFParagraph newParagraph = baseDoc.createParagraph();
                    newParagraph.getCTP().set(((XWPFParagraph) element).getCTP());
                } else if (element instanceof XWPFTable) {
                    XWPFTable newTable = baseDoc.createTable();
                    newTable.getCTTbl().set(((XWPFTable) element).getCTTbl());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

如果有其他好的实现方案可以一起探讨交流一下。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值