天天看點

java EasyExcel內建及工具類使用

EasyExcel簡介

  • easyExcel是阿裡巴巴開源poi插件之一,目前最新版本2.2.5,poi版本3.17,是以,內建時老版本poi需要提升poi版本,或者做版本隔離。
  • 吐槽一下這個版本沒有RELEASE版本
  • 主要解決了poi架構使用複雜,sax解析模式不容易操作,資料量大起來容易OOM,解決了POI并發造成的報錯
  • 主要解決方式:通過解壓檔案的方式加載,一行一行的加載,并且抛棄樣式字型等不重要的資料,降低記憶體的占用
  • 具體實作原理,建議看github上的readme

EasyExcel優勢

  • 注解式自定義操作。
  • 輸入輸出簡單,提供輸入輸出過程的接口
  • 支援一定程度的單元格合并等靈活化操作

EasyExcel劣勢

  • 架構不成熟,1.1.0版本後提供靈活接口的隻剩beta版本
  • 依然存在一些bug
  • 沒有一套完整的api

ExcelUtil快速使用

  • maven引用(版本控制内若存在低版本POI,請更新版本和代碼,官方POI版本3.17):
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>2.2.5</version>
</dependency>           
  • 工具類:

    詳見底部附帶的github位址

  • 實體類繼承BaseRowModel ,對需要導出或者導入的字段增加@ExcelProperty注解,index值為對應excel中的列,value為表頭,format為日期格式化
public class PersonDto {
    /** id */
    @ExcelProperty(index = 0 , value = "id")
    private String id;
    /** 姓名 **/
    @ExcelProperty(index = 1 , value = "姓名")
    private String name;
    /** 生日 **/
    @ExcelProperty(index = 2 , value = "生日" , format = "yyyy-MM-dd")
    private String birth;
}           

導出:

//單sheet輸出
ExcelUtil.writeExcel(response, list, "導出測試", "sheet1", ExcelTypeEnum.XLSX);
//多sheet輸出
ExcelUtil.writeExcel(response, "導出測試", ExcelTypeEnum.XLSX, list, list2);
//或
ExcelUtil.writeExcel(response, "導出測試", ExcelTypeEnum.XLSX, list, list2, list3);           

導入:

List<FundDto> importDtoList = ExcelUtil.readExcel(excelFile,PersonDto .class);           

自定義樣式Sheet名稱注解:

@SheetName("sheet名稱")
@Data
public class ExportTestModel {
    @ExcelProperty(index = 0 ,value = "标題")
    private String title;
}           

Ps.

原引入樣式修改,後更新版本中增加了樣式政策的修改,未引入

目前已知存在問題:

  • 自定義注解目前未經過多種場景的測試,出現問題,需要再修改
  • 導入的實體類中配置了注解的屬性為基本類型時,可能會讀到一部分空行,這個問題目前需要EasyExcel的看看後續版本處理
EasyExcel github位址: https://github.com/alibaba/easyexcel EasyExcelUtils github項目位址: https://github.com/wangxiaoxiongjuly/easy-excel-utils EasyExcelUtils gitee項目位址: https://gitee.com/wang-wen-xuan-july/easy-excel-utils