Wir haben eine vorgefertigte Excel-Datei mit ausgefallenen Diagrammen und Formeln, die Querverweise auf Blätter enthalten. Sie enthält auch Makros. Die Quelldaten sollen in ein Blatt kopiert werden, und der Rest der Arbeitsmappe füllt sich selbst aus der bereits vorhandenen Verdrahtung.
Anmerkung: Es ist mir wirklich egal, ob ich andere Blätter in dieser Arbeitsmappe lese oder ändere, ich muss mir nur die Mühe ersparen, die Rohdaten jedes Mal in dieses Datenblatt in dieser Arbeitsmappe zu kopieren und einzufügen.
Ich verwende Apache POI und versuche, eine XSSFWorkbook-Instanz aus dieser "Vorlage"-Excel-Datei zu erstellen. Es dauert jedoch sehr lange (fast eine Minute bei mehreren Durchläufen), bis dieses Objekt erstellt ist. Die Exceldatei selbst ist nur etwa 400 KB groß, also keine große Datei. Ich habe mit jconsole ein Profil erstellt, und es scheint, dass es weder durch CPU noch durch Heap begrenzt ist - es werden nur etwa 90 MB Heap-Speicher verwendet (ich hatte es mit 2 GB gebundenem Heap gestartet) und etwa 52 % CPU.
Es dauert nur sehr kurz, das Datenblatt mit Rohdaten zu füllen und die endgültige aktualisierte Datei zu schreiben (etwa 3-4 Sekunden). Hier ist mein Startup-Code:
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..");
}
Ich dachte daran, dieses TEMPLATE_WORKBOOK einmal zu laden und dann das gleiche Handle wiederzuverwenden, um neue Daten für jede nachfolgende Anforderung zu schreiben - ich simulierte dies mit einem sleep und einem forever-while in meiner Hauptklasse. Aber anscheinend kann ich das nicht, ich habe eine Ausnahme "Exception in thread "main" org.apache.xmlbeans.impl.values.XmlValueDisconnectedException". Das TEMPLATE_WORKBOOK-Objekt ist nicht wiederverwendbar.
Ich sehe, dass es eine ereignisbasierte API gibt, aber bevor ich darauf eingehe, wollte ich sehen, ob ich hier etwas übersehe! Nochmals, Speicher / CPU ist kein Problem hier, wir haben viel Heap zu ersparen. Ich versuche, Zeit zu reduzieren.
P.S.: Ich habe die Tipps hier ausprobiert: XSSFWorkbook benötigt viel Zeit zum Laden - Sie haben die Startzeit nicht verkürzt.