开源"/>
实战案例分享:POI根据模板导出Excel(代码已开源
文章目录
- 前言
- 原理
- 快速上手
- 1、静态填充
- 2、动态填充
- 其它说明
- 开源地址
前言
最近项目上需要导出一个复杂的Excel
,有特殊符号,有合并单元格,还有各种字体颜色的样式设置等,考虑到全部使用POI生成的话,一是费时费力,二是以后有类似需求难道还要再干一遍?这显然不符合咱们程序员的思维,所以为了一劳永逸,实现了根据模板导出Excel的通用功能,功能很强大,代码很简洁可控,覆盖大部分场景,您只需要把Excel模板定义好,内容可以采用静态填充
,也可以采用动态填充
,再也不用为了导出复杂Excel发愁啦,推荐大家使用POI导出Excel时,如果有类似需求可以使用,文末附开源地址哦!
项目案例不能公开,模拟做了一个简单的效果如下:
原理
总体原理就是使用占位符
进行文本替换。
- 静态填充. 占位符格式
{{key}}
,例如:在Map里增加key:name
,value:天罡
,那么excel中所有的{{name}}
,都会被替换成天罡
。 - 动态填充. 占位符格式
{{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分别支持不同的重载,以满足大多数场景.
开源地址
更多推荐
实战案例分享:POI根据模板导出Excel(代码已开源
发布评论