<!--阿里easyExcel工具包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.2</version>
</dependency>
对应工具类
/**
* @author yy
* @version 2.0
* @date 2019/7/30 16:27
* @deprecated 版本升级为对应的2.0.0以上
* 性能更加高效 导出数据更加稳定
* 支持 64M内存1分钟内读取75M(46W行25列)
**/
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 Object> data,
String fileName, String sheetName, Class model) throws Exception {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//设置表头居中对齐
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//设置内容靠左对齐
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(getOutputStream(fileName, response), model)
.excelType(ExcelTypeEnum.XLSX)
.sheet(sheetName)
.registerWriteHandler(horizontalCellStyleStrategy)
//最大长度自适应 目前没有对应算法优化 建议注释掉不用 会出bug
// .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.doWrite(data);
}
/**
* 导出文件时为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);
}
}
实体类映射Excelproperty 对应导出Excel表头
@Data
@ColumnWidth(22)
@ContentRowHeight(15) //由于新版本并没有对单元格设置默认值
所以需要手动对单元格进行赋值
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;
}
测试。。
public void class 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,"测试","测试sheet",user.getClass());
}