目录

alibaba-EasyExcel的使用说明

alibaba EasyExcel的使用说明

核心方法的执行顺序和规则

1. invokeHead (可选)

触发条件 :解析到 Excel 的 表头行 (第一行)。

用途 :获取表头数据(例如动态列名)。

示例

override fun invokeHead(headMap: Map<Int, String>, context: AnalysisContext) {
    println("表头数据: $headMap")
}
2. invoke

触发条件 :每解析成功一行数据后触发。

用途 :处理单行数据(例如保存到数据库)。

注意 :此方法必须实现。

示例

override fun invoke(user: User, context:AnalysisContext) {
    println("处理数据: $user")
}
3. doAfterAllAnalysed

触发条件 :整个 Sheet 解析完成 后触发。

用途 :收尾操作(例如关闭资源、提交事务)。

注意 :此方法在 EasyExcel 3.3+ 中默认空实现,需手动覆盖。

示例

override fun doAfterAllAnalysed(context:AnalysisContext) {
    println("所有数据解析完成")
}
4. onException

触发条件 :解析过程中 发生异常 时触发(例如数据类型不匹配)。

用途 :自定义异常处理逻辑(例如记录错误日志)。

注意 :如果不覆盖此方法,默认会抛出异常并终止解析。

示例

override fun onException(exception: Exception, context:AnalysisContext) {
    println("解析异常: ${exception.message}")
    throw exception // 可选择终止或忽略
}

完整的执行流程图

以下是解析一个 3 行数据 (含表头)的 Excel 时的典型流程:

EasyExcel.read(inputStream, User::class.java, listener)
    .sheet()
    .doRead()

流程步骤:

  1. invokeHead → 解析表头(如果覆盖了该方法)。
  2. invoke → 解析第一行数据。
  3. invoke → 解析第二行数据。
  4. invoke → 解析第三行数据。
  5. doAfterAllAnalysed → 整个 Sheet 解析完成。
  6. onException → 如果中间某行解析失败,会直接跳转到这里。

高级场景:异常处理逻辑

如果某行数据解析失败(例如字段类型不匹配):

  1. onException 被触发,处理异常。
  2. doAfterAllAnalysed 仍然会被调用(即使中途出错)。
  3. 后续行解析终止 (默认行为,可通过 context.interrupt() 显式控制)。

Kotlin 代码实战示例

监听器完整实现
class UserDataListener : ReadListener<User> {
    override fun invokeHead(headMap: Map<Int, String>, context: AnalysisContext) {
        println("表头: ${headMap.values}")
    }

    override fun invoke(user: User, context: AnalysisContext) {
        println("处理数据: $user")
        // 业务逻辑:保存到数据库等
    }

    override fun doAfterAllAnalysed(context: AnalysisContext) {
        println("解析完成,释放资源")
    }

    override fun onException(exception: Exception, context: AnalysisContext) {
        println("第 ${context.readRowHolder().rowIndex} 行解析失败: ${exception.message}")
        // 继续解析后续行(不抛出异常)
        // context.interrupt() // 强制终止解析
    }
}
控制解析行为

终止解析 :在 onException 中调用 context.interrupt()

忽略错误继续解析 :在 onException 中不抛出异常。


性能优化建议

  1. 批量处理 :在 invoke 中不要逐条操作数据库,改为批量提交。
  2. 内存控制 :通过 ReadCache 管理缓存数据(默认 100 条)。
  3. 异步处理 :在 invoke 中将数据发送到队列,由后台线程处理。

通过以上规则,你可以精准控制 Excel 解析的生命周期,确保数据处理的可靠性和高性能。