看到导出的例子都有实体类,如果只是单纯将数据库查询到的数据,可以不通过实体类放到Excel里面吗?
[alibaba/easyexcel]EasyExcel 一定要用到实体类吗
回答
这时候你可能需要另一个Excel工具EEC,它除了支持对象数组,也直接支持StatementSheet和ResultSetSheet,这里有详细例子数据源为关系型数据库
如果是导入不经过实体类,可以实现吗 @wangguanquan
@JasonNum1 可以的,EasyExcel可以使用Map,EEC可以像jdbc一样根据下标和列名取值。
// EEC可以直接用“下标”和“列名”从row对象里获取值
@Test public void testFilter() {
try (ExcelReader reader = ExcelReader.read(Paths.get("充值.xlsx"))) {
String[] games = reader.sheet(0)
.dataRows()
.filter(row -> row.getDouble("金额") >= 100.0D) // 只取充值金额大于100的用户
.map(row -> row.getString("用户")) // 获取用户
.distinct() // 去重
.toArray(String[]::new); // 转数组
print(Arrays.toString(games));
} catch (IOException e) {
e.printStackTrace();
}
}
ok,thank you @wangguanquan
Map<String, List
eec采用的迭代器模式,Row对象在内存中共享,当读取某行数据的时候才会将该行数据写入Row对象中,读取下一行的时就会覆盖上一行的值,所以无法Collect一个内存共享的对象,这也是为什么你总是得到最后一行数据的原因。
你可以使用reader.sheet(0).rows().forEach(System.out::println)
语句输出每行的内容,该语句会输出所有行数据而不是最后一行的数据。
如果你要Collect那么你需要将每行数据转为独立的实体,如定义Item实体,reader.sheet(0).dataRows().map(row -> row.to(Item.class)).collect(Collectors.groupingBy(Item::syb))
eec选择迭代器模式最大的收益是超低内存,无论是xlsx格式还是xls格式,eec都能在10MB以内完成百万行数据读取。@JasonNum1
我就导出个文件,要引用一万个jar包,太难了
哈哈哈,现在java生态的碎片化比较严重,不过eec 只引入了dom4j和logback两个三方包,所以还是较轻量的。@caifenglin