# myexcel
返回开源分支:java-实用工具 | 返回:java导出 | github | wiki
# MyExcel概述
MyExcel,是一个集导入、导出、加密Excel等多项功能的工具包
- 导入:提供简便的API,读取Excel内容,并转化为List< Bean >。
- 导出:可快速导出海量数据的简单列表,可生成高复杂度布局的Excel,复杂布局指的是包含多种不规则合并单元格、背景色、字体大小、斜体、下拉列表等,可自动划分Excel生成zip压缩包
# MyExcel优势
- 可生成任意复杂表格:本工具使用迭代单元格方式进行Excel绘制,可生成任意复杂度Excel,提供多种宽度策略;
- 零学习成本:使用Html作为模板,学习成本几乎为零;
- 支持常用背景色、边框、字体等样式设置:具体参见菜单样式支持部分;
- 支持.xls、.xlsx、.csv:支持生成.xls、.xlsx后缀的Excel以及.csv文件;
- 支持公式导出:支持Excel模板中设置公式,降低服务端的计算量;
- 支持低内存SXSSF模式:支持低内存的SXSSF模式,可利用极低的内存生成.xlsx;
- 支持生产者消费者模式导出:支持生产者消费者模式导出,无需一次性获取所有数据,分批获取数据配合SXSSF模式实现真正意义上海量数据导出;
- 支持多种模板引擎:已内置Freemarker、Groovy、Beetl、Thymeleaf等常用模板引擎Excel构建器(详情参见文档Getting started),推荐使用Beetl模板引擎(Beetl文档);
- 提供默认Excel构建器,直接输出简单Excel:无需编写任何Html,已内置默认模板,可直接根据POJO数据列表输出;
- 支持一次生成多sheet:以table作为sheet单元,支持一份Excel文档中多sheet导出;
- 支持Excel容量设定:支持设定Excel容量,到达容量后自动新建Excel,可构建成zip压缩包导出;
# 更新日志
- MyExcel 3.6.0
- 重构模板构建器ExcelBuilder,使用TemplateHandler处理模板解析;
- DefaultStreamExcelBuilder支持模板追加;
- 新增MyExcelConfiguration,支持对MyExcel进行全局设置,如自定义临时文件目录;
- 优化ExcelBuilder资源处理,提升模板构建效率;
- 重命名@ExcelModel等注解对应配置类名称,易于理解;
- 优化单元测试文件存放目录,避免clone后无法直接执行单元测试问题;
# 导入示例
导入分为一般导入、sax导入,二者的区别在于sax导入更关注内存,内存使用更少,其他二者接口是一致的,建议使用sax方式导入(可读取公式值)。
URL htmlToExcelEampleURL = this.getClass().getResource("/templates/read_example.xlsx");
Path path = Paths.get(htmlToExcelEampleURL.toURI());
// 方式一:全部读取后处理,SAX模式,避免OOM,建议大量数据使用
List<ArtCrowd> result = SaxExcelReader.of(ArtCrowd.class)
.sheet(0)
.rowFilter(row -> row.getRowNum() > 0)
.charset("GBK") // 目前仅.csv文件有效,设置当前文件的编码
.beanFilter(ArtCrowd::isDance)
.read(path.toFile());
// 方式二:读取一行处理一行,可自行决定终止条件,SAX模式,避免OOM
// readThen有两种重写接口,返回Boolean型接口允许在返回False情况下直接终止读取
SaxExcelReader.of(ArtCrowd.class)
.sheet(0)
.rowFilter(row -> row.getRowNum() > 0)
.charset("GBK") // 目前仅.csv文件有效,设置当前文件的编码
.beanFilter(ArtCrowd::isDance)
.readThen(path.toFile() ,artCrowd -> {System.out.println(artCrowd.getName);});
public class ArtCrowd {
// index代表列索引,从0开始
@ExcelColumn(index = 0)
private String name;
@ExcelColumn(index = 1)
private String age;
@ExcelColumn(index = 2,dateFormatPattern="yyyy-MM-dd")
private Date birthday;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Excel导出
默认导出采用普通方式导出List< Bean >,适合小数据量场景,如数据量很大-10万+,建议使用DefaultStreamExcelBuilder,避免内存占用过多。
文件导出示例:
List<ArtCrowd> dataList = this.getDataList();
Workbook workbook = DefaultExcelBuilder.of(ArtCrowd.class)
.build(dataList);
FileExportUtil.export(workbook, new File("/User/demo.xlsx"));
1
2
3
4
2
3
4
数据获取:
private List<ArtCrowd> getDataList() {
List<ArtCrowd> dataList = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) {
ArtCrowd artCrowd = new ArtCrowd();
artCrowd.setName("Tom");
artCrowd.setAge(18);
artCrowd.setGender("Woman");
artCrowd.setPaintingLevel("一级证书");
artCrowd.setDance(true);
artCrowd.setAssessmentTime(LocalDateTime.now());
artCrowd.setHobby("钓鱼");
dataList.add(artCrowd);
}
return dataList;
}
@ExcelTable(sheetName = "艺术生")
public class ArtCrowd {
@ExcelColumn(order = 0, title = "姓名")
private String name;
@ExcelColumn(order = 1, title = "年龄")
private Integer age;
@ExcelColumn(order = 2, title = "性别")
private String gender;
@ExcelColumn(order = 3,title = "绘画等级")
private String paintingLevel;
@ExcelColumn(order = 4, title = "是否会跳舞")
private boolean dance;
@ExcelColumn(order = 5, title = "考核时间", dateFormatPattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime assessmentTime;
@ExcludeColumn
private String hobby;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34