alibaba/easyexcel

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

Open

#3 912 ouverte le 2 août 2024

Voir sur GitHub
 (5 commentaires) (0 réactions) (0 assignés)Java (7 599 forks)batch import
help wanted

Métriques du dépôt

Stars
 (33 728 stars)
Métriques de merge PR
 (Aucune PR mergée en 30 j)

Description

比如对于实体类

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) 设置的表头。

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

Guide contributeur