[alibaba/easyexcel]EasyExcel 一定要用到实体类吗

2024-05-11 244 views
7

看到导出的例子都有实体类,如果只是单纯将数据库查询到的数据,可以不通过实体类放到Excel里面吗?

回答

2

这时候你可能需要另一个Excel工具EEC,它除了支持对象数组,也直接支持StatementSheet和ResultSetSheet,这里有详细例子数据源为关系型数据库

7

如果是导入不经过实体类,可以实现吗 @wangguanquan

7

@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();
    }
}
1

ok,thank you @wangguanquan

6

Map<String, List> rows = reader.sheet(0) .dataRows().collect(Collectors.groupingBy(row -> row.getString("事业部"))); 以上面这种方式做分组,拿到的是分组数据都是excel表格中最后一行的数据, 这个能帮忙看下吗 @wangguanquan

5

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

5

我就导出个文件,要引用一万个jar包,太难了

9

哈哈哈,现在java生态的碎片化比较严重,不过eec 只引入了dom4j和logback两个三方包,所以还是较轻量的。@caifenglin