天天看點

easyExcel 讀取資料為空怎麼辦?

EasyExcel是一個基于Java的簡單、省記憶體的讀寫Excel的開源項目。在盡可能節約記憶體的情況下支援讀寫百M的Excel。 github位址:https://github.com/alibaba/easyexcel 文檔位址:https://www.yuque.com/easyexcel/doc/easyexcel

目錄

1、問題起因

2、源碼片段

3、@Accessors注解的作用

4、解決方法

今天在幫助一位朋友解決easy Excel讀取Excel表格資訊時,程式回報顯示,讀取内容為空,但是經過斷點調試跟蹤排查,發現程式能夠讀取到Excel裡面的表頭,以及行數等資訊,唯一的問題就是讀取到的實體類清單字段熟悉全部都是null,最後經過查閱相關資料得以解決問題。

由于這位朋友為了友善,使用lombok插件,其實本身使用lombok插件是沒有問題的,但是由于使用不當,就有可能造成莫名奇妙的問題。在lombok中有一個注解為<code>@Accessors(chain =</code><code>true</code><code>),</code><code>其中</code>chain的中文含義是鍊式的,設定為true,表示該實體對象支援鍊式程式設計,否則不支援鍊式程式設計。

當Excel每行資料解析後, 會調用 buildStringList 将解析到的資料由Map轉存到Bean中, 關鍵代碼如下:

可見, EasyExcel是使用 <code>net.sf.cglib.beans.BeanMap</code> 工具類拷貝的, 這正是造成 使用<code>@Accessors(chain = true)</code>後, EasyExcel解析不到資料的原因所在.

為什麼使用了<code>@Accessors(chain = true)</code>後, <code>BeanMap</code> 會拷貝不成功呢?

使set方法傳回的不是void, 而是目前對象

可見, 需要使用BeanMap從Map拷貝到Bean, 需要Map 的Key與Bean的變量名一緻, 并有對應的 set方法, 且set方法為 void, 才能拷貝成功。是以目前隻能不使用這個注解即可解決該問題。

繼續閱讀