簡體   English   中英

如何下載大數據量的excel文件?

[英]How to download excel file with large amount of data?

有一個 API 可以下載 Excel 文件。 每當我們點擊“下載 excel 報告”按鈕時,它就會調用這個 API,它從數據庫中獲取數據,將其傳輸到 Excel 文件並下載它。

excelName = key + ".xlsx";

response.setHeader("Content-Disposition", "attachment; filename=" + excelName);
    
ByteArrayInputStream in = getDownloadBusinessAnalysisKey(key, customerScopeId, response, getBusinessKeyResult, sheetName);
    
response.setHeader("Content-Length", String.valueOf(in.available()));
try {
  FileCopyUtils.copy(in, response.getOutputStream());
} catch (IOException e) {
  logger.error("Error in report " + e.getLocalizedMessage());
}

當有大約 10,000 條記錄(或接近它)時,它可以正常下載。

但是,當有大約 100,000 條記錄時,它就不會下載。 我沒有得到端點的響應。 當嘗試通過本地數據庫中的 Postman 下載相同的文件時,它可以工作。

下載大小有限制嗎? 這是瀏覽器、Tomcat 服務器還是 HTTP header 問題?

當您使用ByteArrayInputSteam時,您會將整個數據加載到 memory 中。 需要做的是讓getDownloadBusinessAnalysisKey存儲到一個可以stream的地方,通常是一個文件。 然后使用FileInputStream讀取文件並將其寫入響應 output stream。

根據您使用 API 下載 Excel 文件的聲明,我假設它沒有在您當前的JVM中完成(否則我會建議您重新考慮一下代碼它工作。

從您的代碼示例中,您似乎也在使用基於 setHeader 的 Servlet setHeader 所以這里有一些代碼可以建立一個獲取連接並或多或少地代理它。 如果只是直接通過,則不需要臨時文件,也不需要緩沖,除非您可以確認 servlet 引擎沒有為您提供緩沖數據。

protect void doGet(
    HttpServletRequest req, 
    HttpServletResponse response)
  throws ServletException, IOException {
  var url = new URL("http://myapi");
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setRequestMethod("GET");
  int responseCode = con.getResponseCode();
  int len = con.getHeaderFieldInt("Content-Length",-1);
  int contentType = con.getHeaderField("Content-Type", "application/octet-stream");

  assert responseCode == 200

  response.setIntHeader("Content-Length", len);
  response.setHeader("Content-Type", contentType);
  try (
    InputStream is = con.getInputStream();
    OutputStream os = response.getOutputStreeam();
  ) {  
    int c = is.read();
    while (c != -1) {
      os.write(c);
      c = is.read();
    }
  }
}

這可以通過使用 Async Servlet API 來優化,以減少在處理大量連接時需要的阻塞 I/O。

我認為從數據庫獲取數據並提取到 excel 的過程需要很長時間,並且比服務器的最大響應時間長。 您應該調整從 db 獲取數據並提取到 excel 的過程,它將解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM