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

December 17, 2023
测试
测试
测试
测试
5 分钟阅读

前言

最近项目上需要导出一个复杂的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

Map<String, String> staticSource = new HashMap<>();
staticSource.put("title", "poi-excel-template");

然后作为参数调用ExcelTemplateUtil.buildByTemplate

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只有两个属性:

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

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

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

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分别支持不同的重载,以满足大多数场景.

在这里插入图片描述
在这里插入图片描述

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多