官网
这个是1.9.X版本的,官网还有其他版本,这个不是最新的,自己选用版本。
依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
表格行循环
模板
{{goods}}
和{{labors}}
标签对应的数据分别是货物集合和人工费集合,如果集合为空则会删除循环行。这里是从官网截取的,根据实际进行使用。
示例
word中可能会存在不需要循环的数据/字段,可以将数据放到MAP容器中进行处理,如下:
Map<String, Object> map = new HashMap<>();
// 我的数据List中放的不是实体类,可以根据自己的业务情况选择
// 在这里 List中是实体类或者容器没有区别,在高版本中会有些差异
List<Map<String, Object>> list = new ArrayList<>();
// 下面这个是数据演示,这里用到了对图片的处理
// 图片在模板上定义的方式为 : {{@png}} png为具体字段 {{@}}
URL url = new URL("图片链接");
BufferedImage read = ImageIO.read(url);
map.put("png", Pictures.ofUrl(url.toString(), PNG).size(read.getWidth(),read.getHeight()).create());
// 将list集合放到map中,这里的list你可以看着是有数据的,我没有写
map.put("list", list);
// 读取模板 static/test.docx
ClassPathResource classPathResource = new ClassPathResource("在resource文件夹下的word路径");
try (InputStream inputStream = classPathResource.getInputStream()) {
ByteArrayOutputStream byteArrayOutputStreamMain = new ByteArrayOutputStream();
//渲染表格 动态行
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.builder()
.bind("list", policy).build();// 这里的list要和你放到map容器中的key要相同
NiceXWPFDocument template = XWPFTemplate.compile(inputStream,
config).render(map).getXWPFDocument();
// 输出
template.write(OutputStream);
}catch (Exception e) {
log.info("word Export one table error: {}", e.getMessage());
}
表格列循环
总结
列循环和行循环的写法是相同的,使用的是 LoopColumnTableRenderPolicy 插件;
行循环插件:HackLoopTableRenderPolicy
列循环插件:LoopColumnTableRenderPolicy