碰到一个需求,要将多个POI生成的XWPFDocument合并成一个word导出。原先使用的通过两个文档的CTBody合并的方法,在处理100个文档的时候,就发生了内存了溢出的情况无法进行了。后来在网上搜索各种第三方的导出方案,发现POI-TL处理这方面的需求比较高效。
①引入Maven依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
②生成NiceXWPFDocument列表。NiceXWPFDocument是XWPFDocument的子类,可以直接使用POI的各种操作方法。
List<NiceXWPFDocument> docList = new ArrayList();
for(PersonInfo personInfo:personInfoList){
NiceXWPFDocument document = new NiceXWPFDocument();
DocUtil.parse(document,personInfo);
docList.add(document);
}
③合并文档,并输出
NiceXWPFDocument document = docList.get(0);
docList.remove(document);
NiceXWPFDocument combine = document.merge(docList, document.getXWPFDocument().createParagraph().createRun());
document.close();
docList.forEach(doc-> {
try {
doc.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
});
combine.write(response.getOutputStream()); //HttpResponse
combine.close();
至此合并完成。