お世話になっております。
poiでエクセルに書き込み(wb.write(out))を行った際の処理が
非常に重く、30秒以上かかっております。
コードは以下になりますが、高速化させることはできませんでしょうか。
protected void doDownload(HttpServletResponse response) { String filePath = getServletContext().getRealPath("/WEB-INF/excel/donwload.xlsx"); ZipSecureFile.setMinInflateRatio(0); try { wb = new XSSFWorkbook(filePath); } catch (IllegalStateException e) { System.out.println("テンプレートのエクセル読み込み時に例外が発生しました。エクセルファイル名が間違っている可能性があります。"); } catch (IOException e) { e.printStackTrace(); } sheet = wb.getSheet(getSheetName()); response.setContentType("application/octet-stream"); String fileName = null; try { fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\""); response.setHeader("Cache-Control", "public"); response.setHeader("Pragma", "public"); try { OutputStream out = new BufferedOutputStream(response.getOutputStream()); wb.write(out); } catch (IOException e) { e.printstactrace(); } finally { try { wb.close(); } catch (IOException e) { e.printstactrace(); } } }
追記
(1)ボトルネック部分ですが、上記コードのwb.write(out)の部分となります。それ以外は、時間はかかっていない状況となります。
なお、wb.write(out)はローカルにあるファイルをローカルにダイアログでダウンロードで返しています。
(2)ローカルでホストはMacゲストがWin7の64bit メモリ8Gで動作させていてます。
(3)jvmのヒープヒープサイズは以下に設定しております。
-Xmx2g
-Xms2048m
-Xmx4098m
(4)該当のエクセルファイルは3M程度のエクセルを読み込みこむ形となります。
そのファイルに対して、データを横10列のものもあれば、150列のものもあり、行数は、数千行~数万行を、書き込む形となります。
当該重いのは、行数は、数千行ですが、横が150列程度あります。
数式が多く設定されていまして、また細部にこだわる仕様のため、書式も多く設定されております。
追記2
CPU/memory監視状況を添付します。
メモリなど多めに割り当てているため、
マシンに負荷はかかっていないですが、
エクセルへの書き込みとそのダウンロードが非常に重い状況です。

回答4件
あなたの回答
tips
プレビュー