记录下近期业务中使用EasyExcel做相关导出时候的一些问题。项目中 EasyExcel 版本为3.0.5 版本。
🤗 EasyExcel 简介
EasyExcel(EasyExcel 官网文档) 是阿里巴巴开源的基于 Java 的 Excel 处理工具,它的优势在于速度快、代码简洁,并且能高效处理大文件,避免内存溢出问题。传统的 Excel 处理工具在面对大数据量时,常常会因为占用大量内存而导致程序崩溃,而 EasyExcel 的设计使得我们无需考虑性能、内存等复杂问题,能够轻松完成 Excel 的读写操作。
💿 EasyExcel 基础使用方法
使用 EasyExcel 导出数据到 Excel 通常非常简单,下面是几种常见的写入方式,将数据导出本地或者通过网络响应流输出:
📺 业务场景描述
实际业务中,我们遇到了这样一个需求:由于业务的动态性,字段名可能会增加或修改,此时上游服务返回的数据是
com.alibaba.fastjson.JSONObject 的数据,且需要有导出Excel给其他部门同事使用数据的需要。因此,我们希望能够在生成 Excel 时自动生成对应的表头,而不是手动指定固定的表头。这时候,如果使用EasyExcel将数据导出,只是简单将数据类替换为
JSONObject 后,会遇到问题—导出的 Excel 文件内容为空:如果将JSONObject转为Map ,单独设置header,再导出,导出的excel 表头有了,但是内容仍是空的。

🎙 源码分析
通过断点调试,我们可以很容易的分析出 EasyExcel 写入数据时的逻辑。
当传参类型为List<JSONObject> 时,因为 JSONObject 实现 Map<String, Object> ,所以 EasyExcel 写入数据时,在
com.alibaba.excel.write.executor.ExcelWriteAddExecutor 中,会走到doAddBasicTypeToExcel 方法。
当 instanceof 为 Map 时,要求入参是 Map<Interger, ?> 类型,但 JSONObject 是 Map<String, Object> ,数据中也不包含key为数值1,2,3的键值对。
这里Map类型不相等但没有报错,涉及泛型擦除。
Java 的泛型擦除是为了在提供类型安全性的同时保证向后兼容。它在编译时进行类型检查,但在运行时擦除所有泛型信息,这使得泛型类型在运行时不再可见。

当实际获取表数据时,根据数值1,2,3 下标获取数据,自然就获取不到数值,进而导出的excel为空文件。

知道了对于Map数据,EasyExcel 是通过下标数值如1,2,3获取对应的原始值,也就可以理解将List<JSONObject> 转为List<Map<String, Object>>后为什么也没有数据了。 基本的代码路径是一样的。


💡 导出JSONObject
所以为了将List<JSONObject>导出成excel,我们需要将List<JSONObject>转为List<List<Object>>,再导出。 代码参考如下:
最终也是成功实现了导出JSONObject的数据。

⏰ 参考资料
- 作者:Yibin
- 链接:https://yibin.dev/article/10660b50-99a4-8059-bbe6-de554d3747e9
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章





