alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

对于一个动态字段数量的实体,即一个实体类中存在以 Map 动态的存储字段的情况,如何优雅的实现导出? #3912

Open LanXiu0523 opened 2 months ago

LanXiu0523 commented 2 months ago

比如对于实体类

public class scoreTable {
    private String studentName;
    private String score;
    private Map<String, Long> subScore;
}

对于每次查询,subScore 的项不一定一样,但可以保证一次查询中每一个实体中的 Map 的 key 都是一样的 如查询某次数学成绩,我的显示:

| 姓名 | 分数 | 选择 | 填空 | 
-------------------------
| 小明 | 90  | 40  |  50  | 

再如查询某次英语成绩,我的显示:

| 姓名 | 分数 | 完形 | 阅读 | 作文 | 
--------------------------------
| 小明 | 70  |  20  | 20  | 30  | 

目前,对于 easyexcel 我并未找到这种通过 Map 实现动态列的表格的导出方式,因此我自定义了工具类,读取表头和每一行数据,然后用一下的方式导出:

List<List<String>> headers = (List<List<String>>) excelExportData.get("headers");
List<List<Object>> rows = (List<List<Object>>) excelExportData.get("rows");

EasyExcel.write(filePath)
        .head(headers)
        .sheet(sheetName)
        .doWrite(rows);

现在的问题是,以上方式没法拿到 scoreTable.class 的信息,因此 转换器注解、格式化注解等注解就无法识别,我只能在 excelExportData.get("rows") 的方法中手动实现 转换器注解、格式化注解的生效,比较麻烦且不能复用 easyexcel 的注解解析能力。 如果以 EasyExcel.write(filePath, scoreTable.class) 的方式 拿到 scoreTable.class 的信息,就又会覆盖掉 head(headers) 设置的表头。

是否有更优雅的方式解决这个问题呢?

Cu1ii commented 1 week ago

同问