シートを相互参照する優れたチャートと数式で事前に作成された 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: ここでヒントを試してみました。