1

数年前から開発者がこの問題を抱えているのを見てきました。私は多くのフォーラムと公式の POI ドキュメントを研究しました。それにもかかわらず、私はまだ答えを見つけていません。だから問題は..次の2つのスニペットを試しました:

Workbook wb = WorkbookFactory.create(new File("spreadsheet.xlsx"));

File file = new File("C:\\spreadsheet.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

また、どちらのアプローチでも、単純でかなり小さなスプレッドシートの .xlsx ファイル (200 KB) を処理するのに約 5 ~ 6 分かかります (アプリケーションのメモリが不足していない場合)。

これを修正するにはどうすればよいですか? (Apache POI 3.9 を使用しています)

/*****************************/

次の場所では、処理に時間がかかります。

public class XSSFSheet extends POIXMLDocumentPart implements Sheet{
...
protected void read(InputStream is) throws IOException {
    try {
      -->>> worksheet = WorksheetDocument.Factory.parse(is).getWorksheet();
    } catch (XmlException e){
        throw new POIXMLException(e);
    }
}
...

これ以上デバッグできません。VisualVM も同じことを言っています..!

4

1 に答える 1

1

ロード時間の原因となる要因の 1 つは、使用される範囲にすべての行が含まれるようにデータがワークシートに貼り付けられていることです。起こりますが、ワークブックをロードする前に、いくつかのvbaスクリプトを使用してワークブックを「クリーニング」する中間ステップを実行する必要があることがわかりました。ワークブックには、それぞれ約 5000 行の約 20 シートがあり、それぞれがビジネスのさまざまな部分によって記入されており、読み込みにかなり長い時間 (おそらく 4 分) かかりますが、この場合は許容範囲内です。クリーニング ステージを追加する前は、30 分以上実行されていましたが、これは許容できませんでした....

ユーザーは、私が参照しているプロセスを実行し、2 つのボタンを押します。1 つ目はクリーンアップを行い、2 つ目は残りを行います。最初のプロセスは Runtime.getruntime.exec を使用してトリガーされ、テスト ファイルが存在しない限り 2 番目のプロセスが実行されない空のテキスト ファイルを作成します。

于 2015-03-16T00:40:44.370 に答える