MyExcel,是一个集导入、导出、加密Excel等多项功能的Java工具包。
MyExcel采用声明式语法来构建、读取Excel,屏蔽POI的具体操作细节(对POI无感知),以开发常用的技术替代,使得构建(从简单到高度复杂Excel)以及读取Excel变得极为便利,且构建、读取性能极为优异,占用内存极低(参见下方读取性能评测)。
如导入:
List<ArtCrowd> result = SaxExcelReader.of(ArtCrowd.class)
.sheet(0) // 0代表第一个,如果为0,可省略该操作,也可sheet("名称")读取
.rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
.beanFilter(ArtCrowd::isDance) // bean过滤
.read(path.toFile());
本次更新点如下:
- 修复CsvBuilder线程安全问题;
- CsvBuilder与DefaultExcelBuilder统一模型,便于源码阅读以及统一升级;
- 延迟CsvBuilder临时文件创建时机,仅在有数据时创建;
- CsvBuilder支持Map导出,csv/excel对Map导出时无需指定fieldDisplayOrder,采用Map默认顺序;
- Csv导出Bigdecimal时,支持格式化;
- 大幅优化海量数据Excel读取时的内存占用,平均内存占用大约在75兆;
- 支持无ExcelColumn注解读取,此时默认对所有字段按默认顺序读取;
- 导出时数据转换添加转换器缓存,以提升导出性能;
- 支持全局设置时间、数值格式化,对于多时间属性或数值属性,不必一一设置格式化;
- 新增ExcelModel注解代替ExcelTable注解,新增IgnoreColumn代替ExcludeColumn注解,增强语义、识别度;
- 代码优化,删除冗余代码以及语义不详代码;
- DefaultExcelBuilder、DefaultStreamExcelBuilder支持公式导出;
- 统一.xlsx、.xls、.csv SAX方式读取模型;
具体请参见文档:文档
应各位使用者的要求,本次提供了MyExcel的读取性能测试,具体如下:
测试环境:MAC AIR 8G内存 1.8 GHz 双核Intel Core i5
测试文件:.xlsx文件 55万行 10列 / 循环40次导入 程序每读取完一次,休眠5秒,纯读取,不做任何自定义处理
对比方:MyExcel V3.4.0.RC2 VS 阿里EasyExcel V2.1.6
先上结果,具体参数请移步最后!!!
MyExcel:平均占用内存75M,40次总用时12分钟,数据增加内存占用基本无变化
阿里EasyExcel:平均占用内存300M,15分钟未执行完毕
脚本:
public static void main(String[] args) throws Exception {
URL htmlToExcelEampleURL = App.class.getResource("/big_build.xlsx");
Path path = Paths.get(htmlToExcelEampleURL.toURI());
for (int i = 0; i < 40; i++) {
SaxExcelReader.of(TestDO.class).readThen(path.toFile(), c -> {
// System.out.println(c.birthday);
});
// 替换为阿里EasyExcel
// EasyExcel.read(path.toFile(), TestDO.class,new DemoDataListener()).sheet().doRead();
Thread.sleep(5000);
}
}
public class TestDO {
@ExcelColumn(title = "姓名", index = 0)
String name;
@ExcelColumn(title = "姓名", index = 1)
String dance;
@ExcelColumn(title = "金钱", index = 2)
String money;
@ExcelColumn(title = "生日", index = 3)
String birthday;
@ExcelColumn(title = "当前日期", index = 4)
String localDate;
@ExcelColumn(title = "当前时间", index = 5)
String localDateTime;
@ExcelColumn(title = "小猫数目", index = 6)
String cats;
@ExcelColumn(title = "小狗数目", index = 7)
String dogs;
@ExcelColumn(title = "考拉数目", index = 8)
String kos;
@ExcelColumn(title = "考拉数目", index = 9)
String jos;
}
List<DemoData> data = data();
for (int i = 0; i < 10; i++) {
Workbook workbook = DefaultExcelBuilder.of(DemoData.class).sheetName("sheet").build(data);
FileExportUtil.export(workbook, new File("D:/dev/" + i + ".xlsx"));
}
@ExcelColumn(title = "字符串标题")
private String string;
@ExcelColumn(title = "字符串1标题")
private String string1;
@ExcelColumn(title = "字符串2标题")
private String string2;
@ExcelColumn(title = "字符串3标题")
private String string3;
@ExcelColumn(title = "字符串4标题")
private String string4;
@ExcelColumn(title = "字符串5标题")
private String string5;
@ExcelColumn(title = "日期标题")
private Date date;
@ExcelColumn(title = "double标题")
private Double doubleData;
@ExcelColumn(title = "int标题")
private Integer integer;
@ExcelColumn(title = "long标题")
private Long aLong;
用DefaultStreamExcelBuilder导出,,内存就非常低了