文章目录
- 前言
- 参考目录
- 框架集成
- 1、Maven
- 2、框架集成模块 `ruoyi-common-excel`
- 2.1、自定义转换器 `ExcelDictConvert`
- 2.2、自定义转换器注解 `ExcelDictFormat`
- 2.3、Excel 工具类 `ExcelUtil`
- 3、测试方法
- 3.1、用户导入
- 3.2、用户导出
- 3.3、测试调用流程说明
- 执行流程分析
- 1、用户导出流程分析
- 1.1、方法调用链
- 1.2、性别字段转换分析(使用字典解析)
- 1.3、用户状态字段转换分析(使用表达式解析)
- 1.4、导出结果
- 2、用户导入流程分析
- 2.1、方法调用链
- 2.2、性别字段转换分析(使用字典解析)
- 2.3、用户状态字段转换分析(使用表达式解析)
- 1.5、导入结果
前言
在前两天测试新的 Easy Excel 自定义转换器 ExcelEnumConvert 时才发现之前没有分析过这一部分的功能,所以本篇来介绍一下框架中另外一个比较有代表性的自定义转换器 ExcelDictConvert。
自定义转换器在实际应用中也比较常见。举个栗子,某些字段值在数据库中使用诸如 0,1,2 这样的枚举值进行存储,而在 Excel 导入导出功能中,则需要对这些特定的字段进行转换,这时就需要使用自定义转换器进行转换,解析出所需要的值。
下面本文就以导入导出为例对这一功能进行说明,其他的自定义转换器也是类似的实现方式,感兴趣的朋友可以自行研究。
参考目录
- Easy Excel 官方文档 - 自定义转换器
框架集成
1、Maven
- 框架分支:
5.X
(注:在框架4.X(dev)分支也有该功能,只是文件目录不同) - Easy Excel 版本:
V3.2.0 - poi 版本:
V5.2.3
2、框架集成模块 ruoyi-common-excel
由于在框架 5.X 分支中对框架目录进行了重构,所以与 Excel 相关的功能被单独抽成了一个公共模块,方便使用。

关于本文自定义转换器功能所涉及的类分别是:
- 核心实现类
ExcelDictConvert - 注解类
ExcelDictFormat - 工具类
ExcelUtil
2.1、自定义转换器 ExcelDictConvert

实现字典值转换功能的核心类,实现了 Easy Excel 的 com.alibaba.excel.converters.Converter 接口。
按照官方文档,要实现自定义转换器的功能很简单,只需要实现 Converter 接口并实现指定类即可。

com.alibaba.excel.converters.Converter

由上图源码,右侧黄色背景的类都是 Easy Excel 已经实现的转换器,都是常见类型的转换器。
需要实现的方法如下:
com.alibaba.excel.converters.Converter#convertToJavaData

com.alibaba.excel.converters.Converter#convertToExcelData

框架中的实现方法如下:

2.2、自定义转换器注解 ExcelDictFormat

通过在对象字段上标注该注解实现转换功能,框架中定义了两种解析方式:字典类型解析 以及 表达式解析,后者可以自定义分隔符。
2.3、Excel 工具类 ExcelUtil
在之前的导入分析文章中也有涉及到这个类,这个类封装了常用的 Excel 处理方法,本文涉及到的方法有两个:convertByExp 以及 reverseByExp。这两个方法逻辑类似,理解了其中一个,另一个也能够理解。
ExcelUtil#convertByExp

ExcelUtil#reverseByExp

3、测试方法
3.1、用户导入
SysUserController#importData

SysUserImportVo

3.2、用户导出
SysUserController#export

SysUserExportVo

3.3、测试调用流程说明
本文的测试流程如下:
- 由于转换器的实现方法分别对应
读 Excel(导入)和写 Excel(导出),所以分两次进行调用。 - 调用导出方法。
- 使用导出方法得到的 Excel 表格结果进行修改后,调用导入方法。
- 为了更好地说明不同的解析方法,所以对于相关转换字段的导入导出方法都进行了分析。
- 导入导出方法的转换功能差异不大,所以只要理解了一个,另一个也能够理解。
执行流程分析
本文的分析重点集中在实现方法的核心类,对于中间的调用流程不会展开详细说明。
1、用户导出流程分析

SysUserController#export

ExcelUtil#exportExcel

ExcelUtil#exportExcel

ExcelWriterSheetBuilder#doWrite

1.1、方法调用链
从框架工具类到转换器经过的调用链如下:

然后就是核心方法 ExcelDictConvert#convertToExcelData。
1.2、性别字段转换分析(使用字典解析)
ExcelDictConvert#convertToExcelData

该方法的主要逻辑如下图:

SysDictTypeServiceImpl#getDictLabel

1.3、用户状态字段转换分析(使用表达式解析)
ExcelDictConvert#convertToExcelData

ExcelUtil#convertByExp

解析的结果:

1.4、导出结果

2、用户导入流程分析
P.S. 对于导入流程,在之前的文章中分别以 Excel 2003 版本 以及 2007 版本 为例进行了详细说明,感兴趣的朋友可以回头看看。
导入的数据:(根据前面导出的结果简单修改)

导入操作:


SysUserController#importData

ExcelUtil#importExcel

2.1、方法调用链

2.2、性别字段转换分析(使用字典解析)
ExcelDictConvert#convertToJavaData

SysDictTypeServiceImpl#getDictValue

最终转换结果:

2.3、用户状态字段转换分析(使用表达式解析)
ExcelDictConvert#convertToJavaData

ExcelUtil#reverseByExp


1.5、导入结果

用户列表:

用户详情:

以上是关于自定义转换器的流程分析。
(完)


















