Web サーバー上に非常に大きな POI ワークブックを作成しています。ワークブック全体をメモリに保持すると、複数の同時リクエストに対応できません。ワークブックをサーブレット出力ストリームに段階的に書き込む方法はありますか。これにより、応答時間が短縮され、プロセスのメモリが効率的になります。
5 に答える
Excel 2007 (xslx) を生成しようとしている場合は、ここで説明されているように、BigGridDemo.java のアプローチを適応させることができます: http://web.archive.org/web/20110821054135/http://www.realdevelopers.com/blog /コード/エクセル
解決策は、POI がコンテナー xslx をテンプレートとしてのみ生成し、実際のスプレッドシート データを XML として zip 出力ストリームにストリーミングできるようにすることです。XML 生成の合理化は、あなた次第です。
残念ながら、シーケンシャルデータの手段がない場合、それは不可能です。CSVやXMLなどの別の形式を探すことをお勧めします。どちらも順番に書き出すことができます。それがDBからのものである場合、まともなDBにはこれらの形式に効率的にエクスポートするための機能が組み込まれているため、より効率的に行うことができます。バイトを一方から他方にストリーミングする必要があります。
HttpServletResponse.getOutputStream() に直接書き込みメソッドを試しましたか?
次の例を見てください。
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
...
OutputStream out = response.getOutputStream();
wb.write(out);
out.close();
JExcelを使用する場合 サーブレットとの間でストリーム コードを読み取るサンプル コードがあります。 http://jexcelapi.sourceforge.net/resources/faq/
この API の唯一の欠点は、Excel 2003 までしかサポートしていないようです。
POI の使用 - ファイルを作成して、ファイルのバイトをサーブレット出力ストリームに提供できませんか?