需求说明:因为项目需求,请求头的内容、列数不确定,请求头随时更改,所以请求头为动态!
先看导出的效果:
1.引入jar包
<!--easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
2.创建工具类
import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
/**
* 导出工具类:可以通过easyUtil方法进行导出
*/
class EasyExcelExportUtils {
/**
*
* [response, fileName:文件名称, heads:excel表头, list:数据体]
*/
public static void easyUtil(HttpServletResponse response, String fileName, List<String> heads, List<Map<String, Object>> list)
throws IOException {
if (StringUtils.isEmpty(fileName)){ //文件名称也可以动态获取
fileName = System.currentTimeMillis() + ".xlsx";
} else {
fileName = fileName + ".xlsx";
}
if(heads == null || heads.size() == 0){
heads = makeHeads();
}
if(list == null || list.size() == 0){
list = makeData();
}
// 调用responseInfo方法
OutputStream os= responseInfo(response, fileName);
List<List<String>> hs = new ArrayList<>();
for (String s : heads) {
hs.add(Arrays.asList(s));
}
List<List<Object>> list2 = new ArrayList<>();
for (Map<String, Object> map : list) {
List<Object> objects = new ArrayList<>();
for (String head : heads) {
Object value = map.get(head);
if (value != null){
objects.add(value.toString());
}else {
objects.add(null);
}
}
list2.add(objects);
}
EasyExcel.write(os).head(hs).sheet("导出的excel文件名称").doWrite(list2);
System.out.println("导出成功");
}
private static List<String> makeHeads() {
return null;
}
private static List<Map<String, Object>> makeData() {
return null;
}
/**
* 功能:公用方法,写回浏览器
*/
public static OutputStream responseInfo(HttpServletResponse response, String fileName) throws IOException {
// 这里注意有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment; filename*=utf-8''" + fileName);
OutputStream os=response.getOutputStream();
return os;
}
/**
* 如果要兼容swagger用这个,上面的注释掉
* 功能:公用方法
* 参数:fileName 文件名称, 如:123.xlsx
public static OutputStream responseInfo(HttpServletResponse response, String fileName) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("APPLICATION/OCTET-STREAM");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream os=response.getOutputStream();
return os;
}
*/
}
3.开始导出
/**
* 动态导出
*/
@GetMapping("toOut")
public void testExcel1(HttpServletResponse response) throws IOException {
//1.设置动态表头
List<String> heads = new ArrayList<>();
heads.add("第一个头");
heads.add("第二个头");
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1= new LinkedHashMap<>();
map1.put("第一个头","AAA");
map1.put("第二个头","BBB");
list.add(map1);
Map<String, Object> map2= new LinkedHashMap<>();
map2.put("第一个头","ccc");
map2.put("第二个头","ddd");
list.add(map2);
EasyExcelExportUtils.easyUtil(response,"导出excel的文件名",heads,list);
}
/**
* 动态导出,兼容swagger,如果使用swagger放开注释,注释掉上面代码
* [response]
* @return {@link }
* @throws
* @author 李庆伟
* @date 2022/5/31 14:43
@GetMapping("toOut")
@ApiOperation(value = "导出全部", notes = "导出全部", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void testExcel1(HttpServletResponse response) throws IOException {
EasyExcelExportUtils.easyUtil(response,"12345",null,null);
}
*/