4

シートを相互参照する優れたチャートと数式で事前に作成された Excel ファイルがあります。マクロも含まれています。ソース データは 1 つのシートにコピー アンド ペーストされ、ワー​​クブックの残りの部分は既存の配線から自動的に取り込まれます。

注:このワークブックの他のシートを読んだり変更したりすることは本当に気にしません。このワークブックのこのデータ シートに毎回生データをコピーして貼り付ける手間を省く必要があるだけです。

私は Apache POI を使用しており、この「テンプレート」Excel ファイルから XSSFWorkbook インスタンスを作成しようとしています。ただし、このオブジェクトの構築には長い時間がかかります (多くの実行で一貫してほぼ 1 分)。Excel ファイル自体は 400 KB 程度で、大きなファイルではありません。jconsole を使用してこれをプロファイリングしました。CPU またはヒープのいずれによっても制限されないようです。約 90 MB のヒープ メモリ (私は 2GB のコミット済みヒープで起動しました) と約 52% の CPU を使用します。

実際にデータ シートに生データを入力し、最終的に更新されたファイルを書き出すのに非常に短い時間 (約 3 ~ 4 秒) しかかかりません。これが私のスタートアップコードです:

public static void startup() throws FileNotFoundException, IOException {
    long start = System.nanoTime();
    System.out.println("Started...");
    TEMPLATE_WORKBOOK = new XSSFWorkbook(new FileInputStream(new File(TEMPLATE)));
    long end = (System.nanoTime() - start) / NANOS;
    System.out.println("It took " + end + " seconds..");
}

この TEMPLATE_WORKBOOK を一度ロードしてから、同じハンドルを再利用して、後続のすべてのリクエストに対して新しいデータを書き込むことを考えました-これを、メインクラスでスリープと永久にシミュレートしました。しかし、明らかにこれを行うことはできません.「スレッド「メイン」org.apache.xmlbeans.impl.values.XmlValueDisconnectedExceptionで例外が発生しました」という例外が発生しました。TEMPLATE_WORKBOOK オブジェクトは再利用できません。

イベントベースの API があることは確かですが、その前に、ここで何か不足していないかどうかを確認したいと思いました。繰り返しますが、ここではメモリ/CPU は問題ではありません。十分なヒープがあります。時間短縮に努めています。

PS: ここでヒントを試してみまし

4

1 に答える 1

1

あなたがやりたいことに対して、あなたは悪い立場にあると思います。私は同じ種類の問題を抱えていましたが (こちらを参照)、残念ながらあなたのケースには解決策がありません.

データシートを正しく表示したい場合でも、それを行う唯一の方法はXSSFWorkbook、イベントベースの API であっても、ファイルを として開くことです。

SXSSFWorkbookFile、InputStream、または OPCPackage からは構築できません。ゼロから、またはXSSFWorkbook.

唯一の本当に恐ろしい時間のかかる可能な解決策 (それが可能かどうかはわかりません) は、読み取りパーサーを使用してデータを入力しようとすることです。つまり、Excel ファイルを自分で xml に解析する必要があります。

私たちの最終的な解決策は、問題の解決策が解決されるのを待っています。

ご希望の回答ができず申し訳ありません。

于 2012-08-24T18:06:00.627 に答える