源码地址:https://github.com/alibaba/easyexcel
一、jar包依赖
com.alibaba
easyexcel
1.1.2-beta5
本版本是阿里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 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