在网上查阅了下资料,发现了一个比较好用的框架,如下
<!-- poi-tl-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.11.0</version>
</dependency>
市面上的解决方案如下,方案介绍来源于官网
| 方案 | 移植性 | 功能性 | 易用性 |
|---|---|---|---|
| Poi-tl | Java跨平台 | Word模板引擎,基于Apache POI,提供更友好的API | 低代码,准备文档模板和数据即可 |
| Apache POI | Java跨平台 | Apache项目,封装了常见的文档操作,也可以操作底层XML结构 | 文档不全,这里有一个教程:Apache POI Word快速入门 |
| Freemarker | XML跨平台 | 仅支持文本,很大的局限性 | 不推荐,XML结构的代码几乎无法维护 |
| OpenOffice | 部署OpenOffice,移植性较差 | - | 需要了解OpenOffice的API |
| HTML浏览器导出 | 依赖浏览器的实现,移植性较差 | HTML不能很好的兼容Word的格式,样式糟糕 | - |
| Jacob、winlib | Windows平台 | - | 复杂,完全不推荐使用 |
根据业务需求导出数据到word循环输出,快速入门代码 1.准备相关的word模版 2.根据官网左侧菜单进行选择,文档详细简单 3.完成demo,网上demo并不清晰,这里提供了一个通用的循环输出列表demo
public static Boolean listToWord(String tagName, String templateName, String savePath, List<Object> collection){
//`LoopRowTableRenderPolicy` 是一个特定场景的插件,根据集合数据循环表格行
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder().bind(tagName, policy).build();
InputStream templateFile = ExportWordUtil.class.getClassLoader().getResourceAsStream(templateName);
Map<String,Object> map = new HashMap();
map.put(tagName, collection);
XWPFTemplate template = XWPFTemplate.compile(templateFile,config).render(map);
try {
FileOutputStream outputStream = new FileOutputStream(savePath);
template.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}