java导出Excel乱码

问题

   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) ;
         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值