实战案例分享:POI根据模板导出Excel(代码已开源 - 通用)

2 篇文章 1 订阅


前言

最近项目上需要导出一个复杂的Excel,有特殊符号,有合并单元格,还有各种字体颜色的样式设置等,考虑到全部使用POI生成的话,一是费时费力,二是以后有类似需求难道还要再干一遍?这显然不符合咱们程序员的思维,所以为了一劳永逸,实现了根据模板导出Excel的通用功能,功能很强大,代码很简洁可控,覆盖大部分场景,您只需要把Excel模板定义好,内容可以采用静态填充,也可以采用动态填充,再也不用为了导出复杂Excel发愁啦,推荐大家使用POI导出Excel时,如果有类似需求可以使用,文末附开源地址哦!
项目案例不能公开,模拟做了一个简单的效果如下:
在这里插入图片描述


原理

总体原理就是使用占位符进行文本替换。

  1. 静态填充. 占位符格式{{key}} ,例如:在Map里增加keynamevalue天罡,那么excel中所有的{{name}},都会被替换成天罡
  2. 动态填充. 占位符格式{{row.key}} , 动态填充是指填充一个List,只需要在excel里定义一行模板行,就可以动态填充List的N行数据,这个N行就是List.size()行,生成后还是对N行根据静态填充的规则进行文本替换.

快速上手

1、静态填充

  • 定义一个Excel模板文件, 包括占位符{{title}}
    在这里插入图片描述
  • 在Java代码中构建一个Map:
Map<String, String> staticSource = new HashMap<>();
staticSource.put("title", "poi-excel-template");
  • 调用ExcelTemplateUtil.buildByTemplate,将Map模板流作为参数传入
InputStream templateStream = SimpleDemo.class.getClassLoader().getResourceAsStream("simple-template.xlsx");

// 这里的excel模板 以 Stream类型参数传入
Workbook workbook = ExcelTemplateUtil.buildByTemplate(templateStream, staticSource, null);

ExcelTemplateUtil.save(workbook, "D:\\simple-poi-excel-template.xlsx");
  • 替换后的效果:
    在这里插入图片描述

另外:静态填充在一个单元格内也支持放置多个占位符,例如:hello {{name}},我今年{{age}}岁了 ,这样就达到通用的目的。

2、动态填充

  • 在模板文件中, 增加动态模板行,就是下图的第4行:占位符{{p.id}}那一行
    在这里插入图片描述

  • 在Java代码中准备一个List<DynamicSource>,DynamicSource类定义如下:

    private String id;
    private List<Map<String, String>> dataList;
    

    id字段 是为了支持定义多个模板行
    dataList字段 是实际数据的列表,List<Map<String, String>>就是多行多列的数据.

  • 我们模拟构建这个List<DynamicSource>

    int rows = 10; // 模拟10行
    List<Map<String, String>> dataList = new ArrayList<>();
    for (int i = 1; i <= rows; i++) {
        // 一行
        Map<String, String> rowMap = new HashMap<>();
        rowMap.put("id", "" + i);
        rowMap.put("name", "name" + i);
        rowMap.put("price", "" + (i * 100));
        rowMap.put("unit", "unit" + i);
        rowMap.put("discount", "" + i);
        rowMap.put("sellingPrice", "" + (i * 100 - 10));
        dataList.add(rowMap);
    }
    // 可以创建多个id,这里只创建1个示例
    List<DynamicSource> dynamicSourceList = DynamicSource.createList("p", dataList);
    
  • 调用ExcelTemplateUtil.buildByTemplate,将List模板流作为参数传入

    InputStream resourceAsStream = DynamicDemo.class.getClassLoader().getResourceAsStream("dynamic-template.xlsx");
    Workbook workbook = ExcelTemplateUtil.buildByTemplate(resourceAsStream, staticSource, dynamicSourceList);
    ExcelTemplateUtil.save(workbook, "D:\\dynamic-poi-excel-template.xlsx");
    
  • 替换后的效果:
    在这里插入图片描述

同样:动态填充也支持放置多个占位符


其它说明

buildByTemplate和save分别支持不同的重载,以满足大多数场景.
在这里插入图片描述


开源地址

https://github.com/tiangang168/poi-excel-template


  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天罡gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值