1

私は次のことをする必要があります

1)1400*1400の巨大なエクセルファイルをコピーしてコピーする。

2)コピーしたファイルを読み込み、新しい列と行を追加し、同時に編集も行います。

3)これは、サーバー上ではなく、スタンドアロン プログラムになります。メモリ使用量が少なく、パフォーマンスが速いという制限があります。

私はいくつかの読書をして、次のことを見つけました

1)巨大なファイルをsucgコピーするAPIがない

2) SXSSF は書き込みには使用できますが、読み取りには使用できません

3) XSSF と SAX (イベント API) は読み取りには使用できますが、編集には使用できません。読み取りとオブジェクトとして再度保存しようとすると、メモリの問題が発生します。

どうすればこれを行うことができますか?

4

3 に答える 3

1

メモリ サイズが XSSF/SAX を使用して読み取り、SXSSF を書き込みに使用するのに十分な大きさであると仮定すると、次の解決策を提案させてください。

1) XSSF/SAX を使用してファイルを読み取ります。行ごとに、行データを使用してオブジェクトを作成し、すぐに ObjectOutputStream またはその他の便利な出力形式を使用してファイルに書き込みます。行ごとに個別のファイルを作成します。また、各行のデータを使用して同じオブジェクトを変更し続けることができるため、メモリには行オブジェクトが 1 つだけ存在します。

2) 必要な変更を行います。変更が必要な行については、対応するファイルを行オブジェクトに読み戻し、必要に応じて変更して、書き戻します。新しい行の場合は、行オブジェクトにデータを設定し、それを新しいファイルに書き出すだけです。

3) SXSSF を使用して、一度に 1 つの行オブジェクト ファイルを読み取り、それを出力スプレッドシートに保存することで、スプレッドシートを再構築します。

そうすれば、一度に 1 行しかメモリに保持されません。

于 2013-06-04T18:45:43.877 に答える
0

ご指摘のレコード数 (つまり 1400*1400 ) の処理でメモリに問題がある場合は、XML データを取得して処理することが解決策になる可能性があります。私はそれが最善の解決策ではないかもしれないことを知っていますが、それはあなたが持っている低メモリ要件に確実に対処します. POI サイトでさえ、この解決策を示しています。

「メモリ フットプリントが問題になる場合は、XSSF を使用して、基礎となる XML データを取得し、それを自分で処理できます。これは、.xlsx ファイルの低レベルの構造を少しだけ学習したい中級の開発者を対象としています。 Java で XML を処理することに満足している人. 使用するのは比較的簡単ですが、ファイル構造の基本的な理解が必要です. 提供される利点は、比較的小さなメモリ フットプリントで XLSX ファイルを読み取ることができることです."

ソース: http://poi.apache.org/spreadsheet/how-to.html

于 2013-06-04T19:20:36.367 に答える