新聞中心
一、簡介
在實際的業(yè)務系統(tǒng)開發(fā)過程中,操作 Excel 實現(xiàn)數(shù)據(jù)的導入導出基本上是個非常常見的需求。

之前,我們有介紹一款非常好用的工具:EasyPoi,有讀者提出在數(shù)據(jù)量大的情況下,EasyPoi 會占用內(nèi)存大,性能不夠好,嚴重的時候,還會出現(xiàn)內(nèi)存異常的現(xiàn)象。
今天我給大家推薦一款性能更好的 Excel 導入導出工具:EasyExcel,希望對大家有所幫助!
easyexcel 是阿里開源的一款 Excel導入導出工具,具有處理速度快、占用內(nèi)存小、使用方便的特點,底層邏輯也是基于 apache poi 進行二次開發(fā)的,目前的應用也是非常廣!
相比 EasyPoi,EasyExcel 的處理數(shù)據(jù)性能非常高,讀取 75M (46W行25列) 的Excel,僅需使用 64M 內(nèi)存,耗時 20s,極速模式還可以更快!
廢話也不多說了,下面直奔主題!
二、實踐
在 SpringBoot 項目中集成 EasyExcel 其實非常簡單,僅需一個依賴即可。
com.alibaba
easyexcel
3.0.5
EasyExcel 的導出導入支持兩種方式進行處理
- 第一種是通過實體類注解方式來生成文件和反解析文件數(shù)據(jù)映射成對象
- 第二種是通過動態(tài)參數(shù)化生成文件和反解析文件數(shù)據(jù)
下面我們以用戶信息的導出導入為例,分別介紹兩種處理方式。
簡單導出
首先,我們只需要創(chuàng)建一個UserEntity用戶實體類,然后添加對應的注解字段即可,示例代碼如下:
public class UserWriteEntity {
@ExcelProperty(value = "姓名")
private String name;
@ExcelProperty(value = "年齡")
private int age;
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "操作時間")
private Date time;
//set、get...
}
然后,使用 EasyExcel 提供的EasyExcel工具類,即可實現(xiàn)文件的導出。
public static void main(String[] args) throws FileNotFoundException {
List dataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
UserWriteEntity userEntity = new UserWriteEntity();
userEntity.setName("張三" + i);
userEntity.setAge(20 + i);
userEntity.setTime(new Date(System.currentTimeMillis() + i));
dataList.add(userEntity);
}
//定義文件輸出位置
FileOutputStream outputStream = new FileOutputStream(new File("/Users/panzhi/Documents/easyexcel-export-user1.xlsx"));
EasyExcel.write(outputStream, UserWriteEntity.class).sheet("用戶信息").doWrite(dataList);
}
運行程序,打開文件內(nèi)容結(jié)果!
簡單導入
這種簡單固定表頭的 Excel 文件,如果想要讀取文件數(shù)據(jù),操作也很簡單。
以上面的導出文件為例,使用 EasyExcel 提供的EasyExcel工具類,即可來實現(xiàn)文件內(nèi)容數(shù)據(jù)的快速讀取,示例代碼如下:
首先創(chuàng)建讀取實體類
/**
* 讀取實體類
*/
public class UserReadEntity {
@ExcelProperty(value = "姓名")
private String name;
/**
* 強制讀取第三個 這里不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配
*/
@ExcelProperty(index = 1)
private int age;
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "操作時間")
private Date time;
//set、get...
}
然后讀取文件數(shù)據(jù),并封裝到對象里面
public static void main(String[] args) throws FileNotFoundException {
//同步讀取文件內(nèi)容
FileInputStream inputStream = new FileInputStream(new File("/Users/panzhi/Documents/easyexcel-user1.xls"));
List list = EasyExcel.read(inputStream).head(UserReadEntity.class).sheet().doReadSync();
System.out.println(JSONArray.toJSONString(list));
}
運行程序,輸出結(jié)果如下:
[{"age":20,"name":"張三0","time":1616920360000},{"age":21,"name":"張三1","time":1616920360000},{"age":22,"name":"張三2","time":1616920360000},{"age":23,"name":"張三3","time":1616920360000},{"age":24,"name":"張三4","time":1616920360000},{"age":25,"name":"張三5","time":1616920360000},{"age":26,"name":"張三6","time":1616920360000},{"age":27,"name":"張三7","time":1616920360000},{"age":28,"name":"張三8","time":1616920360000},{"age":29,"name":"張三9","time":1616920360000}]
動態(tài)自由導出導入
在實際使用開發(fā)中,我們不可能每來一個 excel 導入導出需求,就編寫一個實體類,很多業(yè)務需求需要根據(jù)不同的字段來動態(tài)導入導出,沒辦法基于實體類注解的方式來讀取文件或者寫入文件。
因此,基于EasyExcel提供的動態(tài)參數(shù)化生成文件和動態(tài)監(jiān)聽器讀取文件方法,我們可以單獨封裝一套動態(tài)導出導出工具類,省的我們每次都需要重新編寫大量重復工作,以下就是小編我在實際使用過程,封裝出來的工具類,在此分享給大家!
- 首先,我們可以編寫一個動態(tài)導出工具類
public class DynamicEasyExcelExportUtils {
private static final Logger log = LoggerFactory.getLogger(DynamicEasyExcelExportUtils.class);
private static final String DEFAULT_SHEET_NAME = "sheet1";
/**
* 動態(tài)生成導出模版(單表頭)
* @param headColumns 列名稱
* @return excel文件流
*/
public static byte[] exportTemplateExcelFile(List headColumns){
List> excelHead = Lists.newArrayList();
headColumns.forEach(columnName -> { excelHead.add(Lists.newArrayList(columnName)); });
byte[] stream = createExcelFile(excelHead, new ArrayList<>());
return stream;
}
/**
* 動態(tài)生成模版(復雜表頭)
* @param excelHead 列名稱
* @return
*/
public static byte[] exportTemplateExcelFileCustomHead(List> excelHead){
byte[] stream = createExcelFile(excelHead, new ArrayList<>());
return stream;
}
/**
* 動態(tài)導出文件(通過map方式計算)
* @param headColumnMap 有序列頭部
* @param dataList 數(shù)據(jù)體
* @return
*/
public static byte[] exportExcelFile(LinkedHashMap headColumnMap, List
- 然后,編寫一個動態(tài)導入工具類
/**
* 創(chuàng)建一個文件讀取監(jiān)聽器
*/
public class DynamicEasyExcelListener extends AnalysisEventListener


咨詢
建站咨詢
