在工作中遇到一个需求,就是会根据一个模板文件,和项目的集合数据生成多个项目的信息汇总到同一个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();
}
}
如果有其他好的实现方案可以一起探讨交流一下。