2017-12-12 10 views
0

をgarblendあり私のプロジェクトでは、次の、私はExcelなど、それをエクスポートするように、データレポート: enter image description here しかし、奇妙なことは、時にはそれが正常にエクスポートすることで、時々失敗した。私は何度も試してみましたが、エクセルシートが17行以上になると、次のようになります:Spring MVCの輸出Excelは、時には失敗し、データ表示がページ上

  1. このページはガーベンドデータを持つ新しいページにリダイレクトされます。
  2. 投稿要求が取得要求に変更されました。

enter image description here

それは私がそれをディスクにwritedして、ファイルをチェックしているので、それは、失敗した場合でも、輸出エクセルが正常に作成されていることを確認します。以下はコントローラです、私に間違っていますか?

@RequestMapping("/download") 
    public void download(HttpServletRequest request, HttpServletResponse response, ReportCondition condition){ 
     try { 
      List<HashMap<String, String>> mapList = reportFormService.find(condition); 
      if(mapList == null || mapList.size() == 0){ 
       logger.info("No reports..."); 
      } 

      Map<String, Date> dateMap = DateConditionUtil.getStartEndDate1(condition.getStartDate(), condition.getEndDate()); 
      String startDate = DateFormatUtils.format(dateMap.get("startDate"), "yyyyMMdd"); 
      String endDate = DateFormatUtils.format(dateMap.get("endDate"), "yyyyMMdd"); 
      String[] titleArr = new String[]{"序号","日期","应用系统","短信服务商","请求发送总数","请求成功数量","实际短信条数","实际成功条数","费用","失败数量","成功率"}; 
      String[] fieldArr = new String[]{"ID","RECORDDATE","APPNAME","PROVIDERNAME","SENDCOUNT","SUCCESSCOUNT","SENDSUM","SUCCESSSUM","TOTALFEE","FAILURECOUNT","SUCCESSRATE"}; 

      ByteArrayOutputStream os = new ByteArrayOutputStream(); 
      WorkBookUtil.createExcel(titleArr, fieldArr, mapList, os); 

      try(BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(os.toByteArray())); 
       BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())){ 
       byte[] buff = new byte[1024]; 
       int bytes; 
       while (-1 != (bytes = bis.read(buff, 0, buff.length))) { 
        bos.write(buff, 0, bytes); 
       } 
       bos.flush(); 
      }catch (Exception e){ 
       logger.error(e); 
      } 

      response.setCharacterEncoding("utf-8"); 
      response.setHeader("content-disposition", "attachment;filename=" + String.format("%s-%s.xls", startDate, endDate)); 
      response.setContentType("application/vnd.ms-excel;charset=utf-8"); 

     } catch (IOException e){ 
      logger.error("Export failed", e); 
     } 
    } 

答えて

0

バイトをユーザーに書き出す前に、応答ヘッダーを追加してみてください。コンテンツの長さのヘッダーも追加すると便利です。 createExcelに電話をした後、os.toByteArray().lengthでそれを得ることができます。さらに、flush()の後にbosclose()をお送りします。

+0

ビンゴ。ところで、私は 'try-with-resource'機能を使っているので、' bos'はjvmによって自動的に閉じられます。 –

関連する問題