源碼地址:https://github.com/alibaba/easyexcel
一、jar包依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beta5</version>
</dependency>
本版本是阿里beta測試版 目前網絡上有關阿里easyExcel的介紹和demo基本都是這個版本或以下
下面就是demo工具類
public class ExcelUtil {
/**
* 導出 Excel :一個 sheet,帶表頭.
*
* @param response HttpServletResponse
* @param list 數據 list,每個元素爲一個 BaseRowModel
* @param fileName 導出的文件名
* @param sheetName 導入文件的 sheet 名
* @param model 映射實體類,Excel 模型
* @throws Exception 異常
*/
public static void writeExcel(
HttpServletResponse response, List<? extends BaseRowModel> list,
String fileName, String sheetName, BaseRowModel model) throws Exception {
ExcelWriter writer =
new ExcelWriter(null,getOutputStream(fileName, response), ExcelTypeEnum.XLSX,true,new StyleExcelHandler());
Sheet sheet = new Sheet(1, 0, model.getClass());
sheet.setSheetName(sheetName);
writer.write(list, sheet);
writer.finish();
}
/**
* 導出文件時爲Writer生成OutputStream.
*
* @param fileName 文件名
* @param response 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);
}
}
樣式類 在網上拷貝過來的樣式類的基礎上進行了內存優化 速度優化
public class StyleExcelHandler implements WriteHandler {
// 把樣式提出來防止重複new
private CellStyle cellStyle;
@Override
public void sheet(int i, Sheet sheet) {
Workbook workbook = sheet.getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
this.cellStyle = createStyle(cellStyle);
}
@Override
public void row(int i, Row row) {
}
@Override
public void cell(int i, Cell cell) {
// 從第二行開始設置格式,第一行是表頭 從0行開始
if (cell.getRowIndex() > 0) {
cell.getRow().getCell(i).setCellStyle(cellStyle);
}
}
/**
* 實際中如果直接獲取原單元格的樣式進行修改,
* 最後發現是改了整行的樣式, 因此這裏是新建一個樣式
*/
private CellStyle createStyle(CellStyle cellStyle) {
// 下邊框
cellStyle.setBorderBottom(BorderStyle.THIN);
// 左邊框
cellStyle.setBorderLeft(BorderStyle.THIN);
// 上邊框
cellStyle.setBorderTop(BorderStyle.THIN);
// 右邊框
cellStyle.setBorderRight(BorderStyle.THIN);
// 水平對齊方式
cellStyle.setAlignment(HorizontalAlignment.LEFT);
// 垂直對齊方式
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
return cellStyle;
}
實體映射Excelproperty 對應導出Excel表頭
@Data
public class User extends BaseRowModel implements Serializable {
/**
* value: 表頭名稱
* index: 列的號, 0表示第一列
*
*/
/**
* 入庫時間
*/
@ExcelProperty(value = "姓名", index = 0)
private String name;
/**
* 供應商
*/
@ExcelProperty(value = "年齡", index = 1)
private String age;
/**
* 紙筒編號
*/
@ExcelProperty(value = "性別", index = 2)
private String sex;
}
測試demo
public void test(){
List<User > list = new HashList<>();
for(int i=0;i<10000;i++){
User user = new User();
user.setName( UUID.randomUUID().toString());
user.setAge("10");
user.setSex("男");
list.add(user);
}
ExcelUtil.writeExcel(response,list,"test","testsheet",user.getClass());
}
雖然是阿里的插件 但還是建議使用正式版 不要使用beta版本 難免會有其他的問題
正式版 2.0.2 版本介紹鏈接:https://blog.csdn.net/weixin_42083036/article/details/102802644