注意: 基本的にはこのあたりのドキュメントを読めばよい話ですが、自分用に簡単にまとめておきますね(´・ω・`)
- https://poi.apache.org/components/spreadsheet/
- http://poi.apache.org/components/spreadsheet/how-to.html#xssf_sax_api
JavaでExcelを操作するライブラリであるApache POIでは、HSSFとXSSFという2種類に対応しています。ざっくりいうとHSSFは拡張子がxlsのファイル、XSSFは拡張子がxlsxを扱います。Excel 2007以降はxlsxが標準となっているので、ここではXSSF/xlsxについて記述します (新規システム構築でHSSF/xls対応が必要なことはない…よね?)。
さて、XSSF/xlsxの読み書きに際して、Apache POIは大きく分けて3種類のAPIを用意しています。
① User API
読み書き両方が可能。Google検索でよく引っかかるのは大体これ。いかにもJavaらしいオブジェクト指向的なAPIで、わかりやすく使いやすいのですが、読み書きするファイルの中身をすべてメモリ上に展開するため、メモリ消費がかなり激しいです。Out Of Memoryの原因になりがち。
② Streaming Usermodel API (SXSSF)
一応読み込みもできなくはないのですが、実質的には書き込み専用。User API互換で、特徴はメモリ消費量が少ないこと。これは一定量書き込むたびに一時ファイルへ書き出す作りになっているからで、書き込み時にOut Of Memoryなどを起こしている場合には、こちらに切り替えると、問題が解決する場合があります。ただし、一時ファイルに一度書きだした行は読み込みも書き込みもできないなど、若干使い方に癖があるため、ここは注意して使いましょう。
③ Event API
読み込み専用のAPIで、API体系や使い方は上記2つのAPIとは全く違います。名前の通り、イベントドリブン的に処理ができるAPIで、User APIに比べて、メモリ消費量が少なく、高速にxlsxファイルの読み込みが可能です。User APIを使ったExcelの読み込み処理で、Out Of Memoryを起こしている場合の代替案にすることが多いです。デメリットとしては、若干マイナーで、Google検索でもなかなかサンプルが見つからないことでしょうか。一応、公式にサンプルコードは用意されていますが、複雑なことをやろうとすると、サンプルが転がっておらず、途端に難易度が上がります。
個人的な経験では、Apache POIを利用する場合、おうおうにしてメモリ消費が問題となります。Out Of Memoryとの戦いですね。上記3種類のAPIをうまく活用して、開発のしやすさとメモリ消費量の両天秤でうまく開発を進めていきたいものです。