公司后台管理系统前端用iview做的,最近需要做个导出功能,前后台代码写完后联调,发现前台下载excel后是乱码,以下为解决办法
1、新开页面直接下载excel
由于新开页面链接和前台页面的域名不一样,导致后台拿不到登录token,业务代码会报错,所以放弃了这种方式
如果有人采取这种方式可以参考
controller代码:
@GetMapping(value = "inventoryList")
@ApiOperation(value = "导出库存查询列表", notes = "export")
public void export(HttpServletRequest request, HttpServletResponse response, @Valid QueryBoundReq queryInfoRequest) {
HSSFWorkbook workbook = new HSSFWorkbook();
//通过获取请求头中浏览器信息
String agent = request.getHeader("User-Agent");
//根据浏览器不同将文本进行编码
String fileName = "库存查询"+ (new Date()).getTime() + ".xls";//设置要导出的文件的名字
try {
fileName = FileUtils.encodeDownloadFilename(fileName, agent);
} catch (IOException e) {
e.printStackTrace();
}
//业务代码,主要往workbook里填充数据
exportService.exportList(request,queryInfoRequest,workbook);
response.setContentType("application/octet-stream");
response.setHeader("contentType", "application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
try {
response.flushBuffer();
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
log.error("导出库存查询列表 error:",e);
}
}
FileUtils.java
package com.xxx.utils;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileUtils {
/**
* * 下载文件时,针对不同浏览器,进行附件名的编码
* *
* * @param filename
* * 下载文件名
* * @param agent
* * 客户端浏览器
* * @return 编码后的下载附件名
* * @throws IOException
*
*/
public static String encodeDownloadFilename(String filename, String agent) throws IOException{
if(agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"+ new BASE64Encoder().encode(filename.getBytes("utf-8"))+ "?=";
}else {// IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
return filename;
}
public static String getFileNameWithDate(String namePrefix){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return namePrefix+sdf.format(new Date())+ ".xls";
}
}
service:
public void exportList(HttpServletRequest request, QueryBoundReq query, HSSFWorkbook workbook) {
//headers表示excel表中第一行的表头
String[] headers = {"姓名", "电话", "地址"};
List<Map<Integer, String>> dataMapList = this.getCDataMapList(headers.length, query);
ExportUtils.dealHSSFWorkbook(workbook, headers, "清点单", dataMapList,false);
}
private List<Map<Integer, String>> getCDataMapList(int length, QueryBoundReq query) {
checkInfoListReq.setPageNum(0);
checkInfoListReq.setPageSize(Integer.MAX_VALUE);
//查询数据库获得原始列表数据
List<GetCheckInfoList> list = dataMapper.findInfoList(query);
//在表中存放查询到的数据放入对应的列
List<Map&l