需求:
从数据库查到数据,以给定样式的excel做原型参考,写一个导出excel的接口。(即:传参发送请求->返回文件流->点击链接下载)
代码详解:
//调用同类下接口获取数据的过程,可以忽略
RestResult<List<Map<String,Object>>> ret = new RestResult<>();
ret = stats_reports(checkParam);
List<Map<String,Object>> list =new ArrayList<>();
//当前原始数据以map的形式放在list中,生成表格后存在数据消失问题,只有表头没有数据。
list =ret.getData();
//ExportExcelUtils.transFormation为集合转换方法,目的是将map数据放到实体类中,解决读不到数据的问题。也可以从数据库取出来时直接用List<实体类>存储。TimeReportRe是自己的实体类
List<TimeReportRe> reslist =ExportExcelUtils.transFormation(list);
//生成文件流,返回给浏览器,可实现文件自动下载,目前测试只有用浏览器调用该方法才能正常生成文件,其他方式(postman生成文件名为乱码,内容正常、swagger均为乱码),所以目前只能用get请求(若大佬们知道原由,还请告知,感谢)
//用代码获取response来替代方法参数中的response,解决response.getOutputStream()已经存在的问题,修改后需要在方法上增加注解@ResponseBody
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
// fileName为文件名,URLEncoder.encode防止中文乱码
String fileName = URLEncoder.encode("测试表格", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
OutputStream outputStream= response.getOutputStream();
//sheet()中为表格中sheet名,ExportExcelUtils.head()为表头样式方法,具体讲解和代码在下面的代码块中,通过EasyExcel.head()方法可以看出这里需要一个List<List<String>>类型的参数
EasyExcel.write(outputStream).sheet("测试").head(ExportExcelUtils.head())
.doWrite(reslist);
//自定义表格头
public static List <List<String>> head(){
List<List<String>> headTitles = Lists.newArrayList();
//一个list<String>代表一列,每一个String代表这一列中的一行,按顺序从上到下,相邻相同内容的单元格自动合并
headTitles.add( Lists.newArrayList("所属区域编码","所属区域编码","所属区域编码") );
headTitles.add( Lists.newArrayList("地区编码","地区编码","地区编码") );
headTitles.add( Lists.newArrayList("地区名称","地区名称","地区名称") );
return headTitles;
}
示例如下:
?相关依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.3</version>
</dependency>
解决问题:
文件流怎么写,或者怎么能调用接口直接下载文件,而不是后台写死一个下载路径自动下载
报错response.getOutputStream()已经存在,已经加了response.reset();还是报错
导出的表头数据对应哪里,或者怎么自定义表头
导出的表格为什么只有表头没有数据
补充:
最新测试发现当postman调用get请求时返回的文件流名字是乱码,实际打开后内容正常。??
一个奈斯的easyExcel文档:?EasyExcel · 语雀
|