前言
由於apache poi和jxl,excelPOI都有一個嚴重的問題,就是非常消耗內存,特別處理數據量多時,速度慢並且時有異常發生,
所以改用由阿里研發的easyExcel更可靠一些,它的官方建議對於1000行以內的采用原來poi的寫法一次讀寫,對於1000行以上的數據,
有用了一行行進行解析的方案,這樣避免了內存的溢出。
easyExcel主要功能:
1.支持Excel導入與導出,同時支持xls和xlsm,即07版本和03版本(官方建議03版本不要超過2000行)的Excel文件格式。
2.支持pojo注釋時,映射成為java實體模型。
3.支持多個sheet,同時一個sheet支持多張表。
4.支持自定義Excel樣式:字體,加粗,表頭顏色,數據內容顏色等。
5.可以設置是否需要寫表頭。
寫Excel
實體Dto
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
import java.util.Date;
@Data
public class TestDto {
@ExcelProperty(value = { "列1", "字符串標題" }, index = 0)
private String string;
@DateTimeFormat("yyyy-MM-dd")
@ExcelProperty(value = { "列1", "日期標題" }, index = 1)
private Date date;
@ExcelProperty(value = { "列1", "數字標題" }, index = 2)
private Double doubleData;
/**
* 忽略這個字段
*/
@ExcelIgnore
private String ignore;
}
自定義工具類ExcelUtil
import cn.sipaote.human.excel.dto.TestDto;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
public class ExcelUtil {
/**已過時!!!
* 導出 Excel :一個 sheet,帶表頭
* @param response HttpServletResponse
* @param list 數據 list,每個元素為一個 BaseRowModel
* @param fileName 導出的文件名
* @param sheetName 導入文件的 sheet 名
* @param model 映射實體類,Excel 模型
*/
public static void write2Excel(HttpServletResponse response, List<? extends BaseRowModel> list,
String fileName, String sheetName, BaseRowModel model)throws Exception {
ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);
Sheet sheet = new Sheet(1, 0, model.getClass());
sheet.setSheetName(sheetName);
writer.write(list, sheet);
writer.finish();
}
/**2.*版本更新代碼
* excel的 pojo 實體類取消了 繼承BaseRowModel.
*
*/
public static void writeExcel(HttpServletResponse response, List<?> list, String fileName, String sheetName)throws Exception {
EasyExcel.write(getOutputStream(fileName,response), TestDto.class)
.sheet(sheetName)
.doWrite(list);
}
/**
* 導出文件時為Writer生成OutputStream
* @param fileName
* @param response
* @return
*/
private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "max-age=0");
return response.getOutputStream();
} catch (IOException e) {
throw new Exception("導出excel表格失敗!", e);
}
}
}
接口調用
@RequestMapping("/exportTest")
public void exportEnterpriseBillV2(HttpServletResponse response) throws Exception {
//模模擬sql查出的數據
TestDto testDto = new TestDto();
testDto.setDate(new Date());
testDto.setDoubleData(2.232);
testDto.setIgnore("哈哈哈");
testDto.setString("easyExcel測試1");
TestDto testDto2 = new TestDto();
testDto2.setDate(new Date());
testDto2.setDoubleData(1.111);
testDto2.setIgnore("啦啦啦");
testDto2.setString("easyExcel測試2");
List<TestDto> list = new ArrayList<>();
list.add(testDto);
list.add(testDto2);
ExcelUtil.writeExcel(response,list,"導出測試","sheet單1");
}
導出效果展示

具體方法查看官網:
https://www.yuque.com/easyexcel/doc/easyexcel