前言
由于公司业务经常需要导出Excel报表,原本都是使用POI,每个报表模板都需要写一个方法,导致每次报表有改动,无论大小,都需要重写方法并重新发布。网上找了一圈,不是收费就是功能太少,无法满足业务需求。唯一找到的一个好久没更新,功能也不全,但基本框架能用得上,网址如下:https://excelutils.sourceforge.net
再次基础上,我重建了一个项目,命名为ExcelUtil,在保留原基本结构的前提下,优化修改了大部分的功能,并加入了自己所需的功能,github地址:https://github.com/xuhai19901018/ExcelUtil
ExcelUtil特色
- 支持xls,xlsx版本的Excel
- 支持循环,且支持循环嵌套,
#foreach
标签 - 支持插入图片,
#img
标签(本项目新增) - 支持设置打印区域,
#print
标签(本项目新增) - 支持公式,
#formula
标签 - 支持条件,
#if
标签 - 根据参数自动设置单元格格式(本项目新增)
- 支持分页,
#page
标签 - 循环中支持条件格式(本项目新增,待完善)
SpringBoot中使用
maven配置
Jar包已上传Maven中央仓库的snapshots中,首先要现在pom中添加以下内容以搜索snapshots库
<repositories>
<repository>
<id>oss-sonatype</id>
<name>oss-sonatype</name>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
再引入Jar
<dependency>
<groupId>io.github.xuhai19901018</groupId>
<artifactId>ExcelUtil</artifactId>
<version>1.0.6-SNAPSHOT</version>
</dependency>
两行代码使用ExcelUtil导出报表
ExcelUtils.addValue(value, 10086);
ExcelUtils.export(模板绝对路径, new FileOutputStream(new File(输出绝对路径)));
实践
Excel模板如下
代码如下
ExcelUtils.addValue(logo, "D:\\home\\logo.png");
List<Object> pages = new ArrayList<Object>();
for (int i = 0; i < 5; i++) {
Map<String, Object> page = new HashMap<String, Object>();
pages.add(page);
page.put(date, 2022-09-18);
page.put(in, 100* Math.random());
page.put(out, 100* Math.random());
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
page.put(rows, rows);
for (int j = 0; j < 10; j++) {
Map<String, Object> row = new HashMap<String, Object>();
rows.add(row);
row.put(value_1, 10* Math.random());
row.put(value_2, 10* Math.random());
row.put(value_3, 10* Math.random());
row.put(value_4, 10* Math.random());
row.put(value_5, 10* Math.random());
row.put(value_6, 10* Math.random());
row.put(value_7, 10* Math.random());
row.put(value_8, 10* Math.random());
}
}
ExcelUtils.addValue(pages, pages);
OutputStream out = new FileOutputStream(new File("D:\\home\\t1.xlsx"));
// 输出Excel
ExcelUtils.export("D:\\home\\s1.xlsx", out);
生成的Excel如下
模板讲解
#foreach page in ${pages}
#foreach
标签表示循环一个列表,这边循环的是pages这个list。#foreach
标签需要和#end
成对使用,#end
标签表示循环结束。page
表示循环中的元素。#img ${logo} 5 2 0 5 0 -5
#img
标签表示这里将插入一张图片,#img
标签带有7个参数,前三个参数为必要参数。第一个参数为图片的本地绝对路径;第二、三个参数表示图片占据的单元格数量,示例中表示横向为5个单元格,纵向为2个单元格;第四、五个参数表示图片相对于左上角的缩进,第六、七个参数表示图片相对于右下角的缩进,后四个参数可不写,默认为0。
注:#img
标签第二、三个参数表示图片占据的单元格数量,这些参数不会受合并单元格影响。${logo} /${page.date}/${page.rows}/${row.value_1}
取值表达式${pageId}/${rowId}
内置变量,循环中的元素+Id表示序号。#page
#page
标签表示插入一个分页符#print 35 1:5
#print
标签表示设置sheet的打印区域,注意:使用#print
标签能设置一个矩形的打印区域。打印的开始行为第一行,结束行为#print
标签所在行,开始列为#print
标签所在列。第一个参数表示打印区域的列数;第二个参数可选,用于设置打印标题行,1:5表示设置1到5行为打印标题行。- 单元格格式
ExcelUtil会根据所传的值自动设置单元格格式,例如某单元格中填入了数字,则会将单元格类型设置为数值型。如在模板中设置了单元格的格式,生成的报表将完美继承格式,例如小数保留位数、日期的格式化等。此外Excel公式也会保留。