簡介
EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。在盡可能節約內存的情況下支持讀寫百M的Excel。
准備
引入maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
開始使用
1、創建Excel對應的實體類對象,DemoData
public class DemoData implements Serializable{
/**
* @ExcelProperty({"主標題","編碼"})
* 可以通過 @ExcelProperty 實現多行表頭的讀寫(如:主標題為一級表頭,編碼為二級表頭)
*/
@ExcelProperty({"編碼"})
private Integer id;
@ExcelProperty({ "手機號"})
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
2、創建讀取Excel的回調監聽器,DemoDataListener
public class DemoDataListener extends AnalysisEventListener<DemoData> {
/**
* 每隔5條存儲數據庫,然后清理list,方便內存回收
*/
private static final int BATCH_COUNT = 5;
List<DemoData> list = new ArrayList<DemoData>();
/**
* 自定義service,也可以是dao,處理讀取到的excel數據
*/
private DemoDataService demoDataService;
// 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
public DemoDataListener(DemoDataService demoDataService){
this.demoDataService = demoDataService;
}
// 這個每一條數據解析都會來調用
@Override
public void invoke(DemoData demoData, AnalysisContext analysisContext) {
list.add(demoData);
// 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條放在內存,容易oom
if(list.size() >= BATCH_COUNT){
saveData();
list.clear();
}
}
// 存儲到數據庫
private void saveData(){
log.info("{}條數據,開始存儲數據庫",list.size());
demoDataService.save(list);
log.info("存儲數據成功");
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//這里也要保存數據,確保最后遺留的數據也存儲到數據庫
saveData();
log.info("所有數據解析完成");
}
}
讀Excel-單個sheet
/**
* 1、創建Excel對應的實體類對象,DemoData
* 2、創建讀取Excel的回調監聽器,DemoDataListener
*/
public void read(){
String fileName = filePath + "demo.xlsx";//文件路徑
EasyExcel.read(fileName, DemoData.class, new DemoDataListener(demoDataService)).sheet().doRead();
}
讀Excel-多個sheet
/**
* 1、創建Excel對應的實體類對象,DemoData
* 2、創建讀取Excel的回調監聽器,DemoDataListener
*/
public void repeatRaad(){
String fileName = filePath + "demo.xlsx";//文件路徑
// 讀取部分sheet
ExcelReader excelReader = null;
try {
excelReader = EasyExcel.read(fileName).build();
ReadSheet readSheet1 =
EasyExcel.readSheet(0).head(DemoData.class)
.registerReadListener(new DemoDataListener(demoDataService)).build();
ReadSheet readSheet2 =
EasyExcel.readSheet(1).head(DemoData.class)
.registerReadListener(new DemoDataListener(demoDataService)).build();
excelReader.read(readSheet1, readSheet2);
}finally {
if (excelReader != null){
excelReader.finish();
}
}
}
寫Excel
public void write(){
String fileName = filePath + "demo.xlsx";//文件路徑
List<DemoData> list = demoDataService.select();
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);
}
從數據庫導出Excel,文件下載
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
String fileName = URLEncoder.encode("demo", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<DemoData> list = demoDataService.select();
EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
}
最后
通過 EaseExcel 可以優雅的對Excel進行讀寫操作,方便快捷,簡單好用。本文只是介紹了最簡單的讀寫方法,詳情使用方法請參考EasyExcel使用說明, github地址:https://github.com/alibaba/easyexcel
