既存のExcelファイル(xlsx)を更新しようとしています。
以下のようなコンストラクタXSSFWorkbook(java.io.File file)
とは、XSSFWorkbook(OPCPackage pkg)
READ ONLYモードでファイルを開き、変更を許可していません。したがって、使用する必要がXSSFWorkbook(java.io.InputStream is)
あり、メモリのフットプリント(JVMメモリとJavaヒープ)が高すぎます。並列で実行されている他のプログラムのメモリ要件を尊重する必要があるため、VM引数を使用して最大メモリサイズを設定することはできません。
を使用することSXSSFWorkbook
も別のソリューションでしたが、本質的にはラッパーXSSFWorkbook
です。と同じ問題が持続しXSSFWorkbook
ます。
SOの他の投稿に行ったが、関連する回答が見つからなかった。誰かがこれを手伝ってくれませんか?一時ファイルの保存には問題ありません。
あなたの質問は不明確です。実際には「XSSFWorkbook
使用せずに開く方法」ではありませんInputStream
。しかし、「メモリフットプリントを削減する方法はXSSFWorkbook
?」そして、この質問への答えは、apache poi
現在プログラムされているように、減らすことはできません。apache poi
そうでなければ、開発者は、apache poi
特にメモリを浪費するようにプログラムしたのと同じくらい愚かであるに違いありません。彼らはそうではありません。
しかし、使用されている抽象化レベルが多すぎます。
すべてがXMLに基づいています。しかし、プログラミングライブラリのユーザーは、XMLや、特別なリレーションXMLファイルを使用してリンクされているZIPアーカイブ内の複数のファイルに分割されるその種のXMLに煩わされることを望まないでしょう。したがって、XMLの上にはooxml-schemas
、単一ファイルのXMLを使用可能なjava
オブジェクトに取得するライブラリがあります。そしてorg.apache.poi.openxml4j.opc.*
、関係を管理する必要があります。
このすべての利点を得るには、使用可能なすべてのjava
オブジェクト(ワークブック、シート、行、セル、図面、テーブル、ピボットテーブル、グラフなど)とそれらの関係がメモリ内になければ使用できません。または、*.xlsx
ZIPアーカイブから取り出した後、一時ファイルを使用して一時的に保存する必要があります。そのようなタイプのファイルシステムでの変更の動作のため、ZIPファイルシステムで直接作業することは私の意見ではオプションではありません。
ただし、一時ファイルの使用はで提供されていませんapache poi
。SXSSF
ワークシートに一時ファイルのみを使用し*.xlsx
ますが、新しいファイルの書き込みにのみ使用し、そのようなファイルの読み取りと更新には使用しません。
さらに、バイナリBIFF
*.xls
ファイル形式とできるだけ互換性を保つために、別のレベルが追加されています。これは、の高レベルのクラスを提供するSS
and XSSF
レベルですapache poi
。そのため、java
ワークブック、シート、行、セル、図面、テーブル、ピボットテーブル、グラフなどの追加オブジェクトooxml-schemas
がメモリ内の低レベルクラスに追加されています。
したがって、大きな*.xlsx
ファイルに関してはメモリがいっぱいです。;-)
ソリューション?
可能な限りメモリフレンドリーにするために、*.xlsx
ZIPアーカイブを解凍し、その中のXMLを直接操作します。もちろん、これは非常に面倒です。特に、新しいコンテンツを作成したり、関係を考慮に入れる場合はそうです。私はここで私の答えにこれの簡単な例を示しました。例:メモリに問題がある場合に大規模なExcelファイルを変更する方法およびjava + poiを使用してExcelでセルの背景色を設定する方法。
または、apache poi
すべてをメモリに保持する代わりに一時ファイルを使用する拡張機能をプログラミングします。もちろん、これも面倒で、一時ファイルの使用を提供しないシステムには不利です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加