首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[poi-excel-template] 开源分享:根据模板导出Excel的类库(通用)

[poi-excel-template] 开源分享:根据模板导出Excel的类库(通用)

作者头像
天罡gg
发布2022-12-02 15:29:35
发布2022-12-02 15:29:35
2.1K0
举报
文章被收录于专栏:天罡gg天罡gg

前言

最近项目上需要导出一个复杂的excel, 完全使用poi生成比较费时,也不易维护,所以本着偷懒的思维,实现了一套根据模板导出Excel的通用功能,现将它开源,与大家分享!


开源地址

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


原理

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

  1. 静态替换. 格式{{key}} 例如:在map里增加title的key,那么excel中所有{{title}}的占位符都会被文本替换成map中title对应的value。
  2. 动态替换. 格式{{rowid.key}} , 我们只需要在excel里定义模板行这一行,生成时会根据实际rowid的list.size()动态生成N行,然后再对N行根据文本替换.

快速上手

1、静态替换

  1. 定义一个Excel模板文件, 包括占位符{{title}}
  1. 然后调用ExcelTemplateUtil.buildByTemplate即可

为了达到这个效果,我们只需要构建一个Map: staticSource

代码语言:javascript
复制
Map<String, String> staticSource = new HashMap<>();
staticSource.put("title", "poi-excel-template");

然后作为参数调用ExcelTemplateUtil.buildByTemplate

代码语言:javascript
复制
InputStream resourceAsStream = SimpleDemo.class.getClassLoader().getResourceAsStream("simple-template.xlsx");
Workbook workbook = ExcelTemplateUtil.buildByTemplate(resourceAsStream, staticSource, null);
ExcelTemplateUtil.save(workbook, "D:\\simple-poi-excel-template.xlsx");

特别说明:静态替换在一个单元格内是支持放置多个占位符的,以达到通用的目的。

2、动态替换

  1. 在静态替换的Excel模板文件基础上, 增加占位符{{p.id}}等,如下图
  1. 程序中会动态生成相关行,如下图

为了达到这个效果,我们还需要构建一个List:dynamicSourceList,每个DynamicSource会有一个id和N行的Map,因为DynamicSource只有两个属性:

代码语言:javascript
复制
private String id;
private List<Map<String, String>> dataList;

接下来我们构建一个这个List

代码语言:javascript
复制
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

代码语言:javascript
复制
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");

特别说明:动态替换也支持一个单元格内多个占位符. 另外,还支持多个动态id.


其它说明

buildByTemplate和save分别支持不同的重载,以满足大多数场景.


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 前言
  • 开源地址
  • 原理
  • 快速上手
    • 1、静态替换
    • 2、动态替换
  • 其它说明
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档