问题
java导出Excel乱码,难受!!!!!
解决方案:
引用这位老哥的:https://blog.csdn.net/dunceiam/article/details/43190609
样例:
@RequestMapping("/exportReport")
public void exportReport(HttpServletRequest request , HttpServletResponse response){
String smsCnl = request.getParameter("smsCnl") ; // 渠道ID
String beginTime = request.getParameter("beginTime") ; // 起始时间
String endTime = request.getParameter("endTime") ; // 接收时间
String isp = request.getParameter("isp") ; // 运营商
String area = request.getParameter("area") ; // 地区
String dayFlag = request.getParameter("dayFlag") ; // 日期标识,1为需要日期,0为不需要
Boolean falg = CommonUtil.checkArgs(beginTime,endTime);
logger.info("获取报告,smsCnl:[{}],beginTime:[{}],endTime:[{}],isp:[{}],aera:[{}],falg:[{}],dayFlag:[{}]",smsCnl,beginTime,endTime,isp,area,dayFlag);
if(falg){
Iterator<BasicDBObject> objIterator = this.smsManagerService.getReport(smsCnl,Util.toLong(beginTime),Util.toLong(endTime),isp,area,dayFlag);
final String[] FILE_HEADER = {"账号","日期","成功数量","未知数量","失败数量","发送数量","取消数量","总数","发送次数"};
// 这里显式地配置一下CSV文件的Header,然后设置跳过Header(要不然读的时候会把头也当成一条记录)
CSVFormat format = CSVFormat.DEFAULT.withHeader(FILE_HEADER);
// 这是写入CSV的代码
CSVPrinter printer = null ;
try{
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", "Report_"+System.currentTimeMillis()+".csv"));
response.setHeader("content-type", "text/csv;charset=UTF-8");
response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
PrintWriter outputStream = response.getWriter();
// 解决导出CSV乱码问题
// 对文件添加BOM头,参考https://blog.csdn.net/dunceiam/article/details/43190609
outputStream.write(new String(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF},"UTF-8"));
printer = new CSVPrinter(outputStream, format);
CSVPrinter finalPrinter = printer;
objIterator.forEachRemaining(v->{
List<String> records = Lists.newArrayList();
Map map = v.toMap();
Map map2 = (Map)map.get("value");
records.add(String.valueOf(map2.get("SmsCnl"))); //账号
records.add(String.valueOf(map2.get("t"))); //时间,这个地方未进行reduce会原样输出
records.add(String.valueOf(map2.get("touchNum"))); //成功数量
records.add(String.valueOf(map2.get("unknow"))); //未知数量
records.add(String.valueOf(map2.get("sendErr"))); //发送错误数量,这个是计算出来的 失败量 = 总数 - 触达 - 未知
records.add(String.valueOf(map2.get("sendNum"))); //发送数量
records.add(String.valueOf(map2.get("cancel"))); //驳回数量
records.add(String.valueOf(map2.get("total"))); //发送总数
records.add(String.valueOf(map2.get("count"))); //发送次数
try {
finalPrinter.printRecord(records.stream().map(r -> (r.equals("null")?"":r)).collect(Collectors.toList()));
} catch (Exception e) {
logger.info("获取报告异常,smsCnl:[{}],beginTime:[{}],endTime:[{}],isp:[{}],aera:[{}],falg:[{}],dayFlag:[{}]",smsCnl,beginTime,endTime,isp,area,dayFlag,e);
}
});
printer.close();
}catch(Exception e){
logger.info("获取报告异常,smsCnl:[{}],beginTime:[{}],endTime:[{}],isp:[{}],aera:[{}],falg:[{}],dayFlag:[{}]",smsCnl,beginTime,endTime,isp,area,dayFlag,e);
}
}else{
JsonBean jsonBean = new JsonBean();
jsonBean.setErrorCode(ErrorCode.ERROR);
jsonBean.setMsg("参数校验失败");
JsonInterface.writeJson2(response, jsonBean) ;
}