动态导出word文档

官网

Poi-tl Documentation

这个是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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值