EasyExcel导出文件基本流程
方式一:导出到 HTTP 响应
获取数据
首先获得需要导出的文件的数据内容,用一个 list
保存
List<SysStudent> list = sysStudentService.queryList(sysStudent);
定义文件名
给导出的文件定义一个名字,可以添加日期或者根据输入添加其他信息,保证文件名唯一
String fileName = "学生信息列表" + System.currentTimeMillis() + ".xlsx";
设置响应头
- 设置响应的内容类型为
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- 设置响应的字符编码为
UTF-8
- 设置响应头
Content-disposition
为attachment
,表示文件将以附件形式下载,并指定文件名编码为UTF-8
ContentType有很多不同的类型,要根据数据类型改变
- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:Excel 文件(.xlsx)
- application/vnd.ms-excel:Excel 文件(.xls)
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));
easyexcel执行导出
使用 EasyExcel 库将数据写入 Excel 文件
response.getOutputStream()
获取响应的输出流SysStudent.class
指定数据模型类sheet("学生信息列表")
设置工作表的名称doWrite(list)
将数据写入工作表
EasyExcel.write(response.getOutputStream(), SysStudent.class).sheet("学生信息列表").doWrite(list);
方式二:导出到本地文件
获取数据
与方式一相同,这里省略
定义文件名
与方式一相同,这里省略
easyexcel执行导出
- 创建一个Excel写入对象excelWriter,指定文件名和数据类型
- 构建一个工作表对象writeSheet,并设置表名
- 使用excelWriter将列表list中的数据写入到writeSheet
- 完成写操作并关闭资源。
ExcelWriter excelWriter = EasyExcel.write(fileName, SysStudent.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("学生信息列表").build();
excelWriter.write(list, writeSheet);
excelWriter.finish();
例子
这里实现了一个学生信息列表导出的接口,根据以上步骤完成导出
方式1
@PostMapping("/export")
@ResponseBody
public void export(HttpServletResponse response, SysStudent sysStudent) throws IOException {
// 1.获取数据
List<SysStudent> list = sysStudentService.queryList(sysStudent);
// 2.定义文件名
String fileName = "学生信息列表" + System.currentTimeMillis() + ".xlsx";
// 3.设置相应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''"
+ URLEncoder.encode(fileName, "UTF-8"));
// 4.easyexcel执行文件导出
EasyExcel.write(response.getOutputStream(), SysStudent.class).sheet("学生信息列表")
.doWrite(list);
}
方式2
@PostMapping("/export")
@ResponseBody
public void export(HttpServletResponse response, SysStudent sysStudent) throws IOException {
// 1.获取数据
List<SysStudent> list = sysStudentService.queryList(sysStudent);
// 2.定义文件名
String fileName = "学生信息列表" + System.currentTimeMillis() + ".xlsx";
// 3.easyexcel执行文件导出
ExcelWriter excelWriter = EasyExcel.write(fileName, SysStudent.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("学生信息列表").build();
excelWriter.write(list, writeSheet);
excelWriter.finish();
}
常见问题(持续更新)
EasyExcel导出文件名乱码
出现这个问题通常有以下几个原因:
- 文件名编码不正确
- 使用 URLEncoder.encode 并确保编码为 UTF-8。
- 替换空格为
%20
如:.replaceAll("\\+", "%20")
- 响应头设置不正确,检查一下
Content-Type
和Content-Disposition
- 浏览器兼容性问题
postman中测试没有问题,但是在浏览器中下载会出现问题,是因为不同浏览器对Content-Disposition
的处理方式不同,需要根据浏览器类型设置不同的Content-Disposition
postman测试没有返回附件
- 检查 easyexcel的依赖是否正确,与项目的jdk版本是否一致
- 检查是否采用http响应方式通过附件下载excel,否则应该检查文件名所以定义的位置是否存在。默认会在项目同级子目录下。