Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
PivotTable.refreshData() als veraltet markiert und sollte durch die effizienteren, cache-bewussten APIs ersetzt werden, die in diesem Artikel beschrieben werden.
Das Aktualisieren einer Pivot-Tabelle ist selten ein einzelner Vorgang. Im Hintergrund pflegt Aspose.Cells eine mehrschichtige Datenkette, die Ihre ursprünglichen Quelldaten mit den gerenderten Werten verbindet, die Sie im Arbeitsblatt sehen. Diese Kette zu verstehen, ist der Schlüssel zur Wahl der richtigen Aktualisierungs-API für jede Situation. Die vierschichtige Datenkette ist:
PivotCache aufgebaut; hier werden alle Daten gesammelt und aggregiert.PivotTable liest nur aus ihrem PivotCache, niemals direkt aus der Datenquelle.Cells des Arbeitsblatts, in die die PivotTable ihre berechneten Werte und Stile rendert.PivotCache.getSourceType() (Enum PivotTableSourceType) gibt an, woher die Cache-Daten stammen. Ab v26.7 unterstützt PivotCache.refresh() nur die Quellentypen Sheet und Consolidation – also Daten, die in Arbeitsblattbereichen liegen. Externe Quellen (Datenbanken, externe Verbindungen usw.) sind über die Cache-API noch nicht aktualisierbar.
Aufgrund dieser Kette gibt es in Aspose.Cells zwei grundlegende Aktualisierungspfade:
PivotTable.calculateData() – berechnet die Anzeige einer einzelnen PivotTable aus bereits zwischengespeicherten Daten neu, ohne einen Roundtrip zur Datenquelle.
Alle Szenarien in diesem Artikel verwenden Arbeitsblattzellen als Quelldaten, sodass der Quellentyp Sheet ist und die Aktualisierungsvorgänge wie beschrieben funktionieren.Wenn Sie nur den kürzest möglichen Code benötigen, der jede Pivot-Tabelle in der Arbeitsmappe aktualisiert, reicht ein einziger Aufruf:
import com.aspose.cells.*;
// Eine neue Arbeitsmappe erstellen
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.getWorksheets().get(0);
// Kopfzeile in die Zellen A1:C1 schreiben
worksheet.getCells().get("A1").putValue("Fruit");
worksheet.getCells().get("B1").putValue("Year");
worksheet.getCells().get("C1").putValue("Amount");
// Datenzeilen in die Zellen A2:C9 schreiben (8 Zeilen mit Fruchtdaten für 2020 und 2021)
worksheet.getCells().get("A2").putValue("grape");
worksheet.getCells().get("B2").putValue(2020);
worksheet.getCells().get("C2").putValue(50);
worksheet.getCells().get("A3").putValue("blueberry");
worksheet.getCells().get("B3").putValue(2020);
worksheet.getCells().get("C3").putValue(60);
worksheet.getCells().get("A4").putValue("kiwi");
worksheet.getCells().get("B4").putValue(2020);
worksheet.getCells().get("C4").putValue(70);
worksheet.getCells().get("A5").putValue("cherry");
worksheet.getCells().get("B5").putValue(2020);
worksheet.getCells().get("C5").putValue(80);
worksheet.getCells().get("A6").putValue("grape");
worksheet.getCells().get("B6").putValue(2021);
worksheet.getCells().get("C6").putValue(90);
worksheet.getCells().get("A7").putValue("blueberry");
worksheet.getCells().get("B7").putValue(2021);
worksheet.getCells().get("C7").putValue(100);
worksheet.getCells().get("A8").putValue("kiwi");
worksheet.getCells().get("B8").putValue(2021);
worksheet.getCells().get("C8").putValue(110);
worksheet.getCells().get("A9").putValue("cherry");
worksheet.getCells().get("B9").putValue(2021);
worksheet.getCells().get("C9").putValue(120);
// Eine Pivot-Tabelle hinzufügen: Quellbereich "A1:C9", Zielzelle "E3", Name "Pivot1"
int pivotIndex = worksheet.getPivotTables().add("A1:C9", "E3", "Pivot1");
PivotTable pivotTable = worksheet.getPivotTables().get(pivotIndex);
// Pivot-Felder zuweisen: Fruit zu Zeilen, Year zu Spalten, Amount zu Daten
pivotTable.addFieldToArea(PivotFieldType.ROW, "Fruit");
pivotTable.addFieldToArea(PivotFieldType.COLUMN, "Year");
pivotTable.addFieldToArea(PivotFieldType.DATA, "Amount");
// Mehrere Amount-Werte in den Quelldaten ändern, um Änderungen zu simulieren
worksheet.getCells().get("C2").putValue(55);
worksheet.getCells().get("C5").putValue(85);
worksheet.getCells().get("C9").putValue(125);
// Jede Pivot-Tabelle / jeden Pivot-Cache in der Arbeitsmappe aktualisieren
workbook.refreshAll();
// Die Arbeitsmappe speichern
workbook.save("output.xlsx");
Alles andere in diesem Artikel erläutert, wann stattdessen eine engere API zu wählen ist.
Alle Java-Beispiele in diesem Artikel beginnen mit den folgenden Import-Anweisungen, da die Pivot-Typen im Paket com.aspose.cells.pivot liegen:
import java.lang.System;import com.aspose.cells.Workbook;import com.aspose.cells.pivot.*;Wenn Sie sicherstellen müssen, dass jeder Pivot-Cache und jede Pivot-Tabelle in der Arbeitsmappe die neuesten Quelldaten widerspiegelt, ist die einfachste und umfassendste API Workbook.refreshAll(). Ein einziger Aufruf durchläuft die gesamte Arbeitsmappe – jeder PivotCache wird aus seiner Quelle aktualisiert und anschließend jede abhängige PivotTable neu berechnet. Dies ist der empfohlene Ansatz für allgemeine, vollständige Dokumentaktualisierungen, bei denen die Leistung keine Rolle spielt.
Das folgende Beispiel erstellt eine Arbeitsmappe mit einem Fruit/Year/Amount-Quellbereich, legt eine Pivot-Tabelle an, ändert einige Quellwerte und verwendet dann refreshAll(), um in einem einzigen Aufruf alles auf den neuesten Stand zu bringen.
import com.aspose.cells.*;
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getCells().get("A1").putValue("Fruit");
worksheet.getCells().get("B1").putValue("Year");
worksheet.getCells().get("C1").putValue("Amount");
worksheet.getCells().get("A2").putValue("grape");
worksheet.getCells().get("B2").putValue(2020);
worksheet.getCells().get("C2").putValue(100);
worksheet.getCells().get("A3").putValue("blueberry");
worksheet.getCells().get("B3").putValue(2021);
worksheet.getCells().get("C3").putValue(150);
worksheet.getCells().get("A4").putValue("kiwi");
worksheet.getCells().get("B4").putValue(2020);
worksheet.getCells().get("C4").putValue(200);
worksheet.getCells().get("A5").putValue("cherry");
worksheet.getCells().get("B5").putValue(2021);
worksheet.getCells().get("C5").putValue(120);
worksheet.getCells().get("A6").putValue("grape");
worksheet.getCells().get("B6").putValue(2021);
worksheet.getCells().get("C6").putValue(180);
worksheet.getCells().get("A7").putValue("blueberry");
worksheet.getCells().get("B7").putValue(2020);
worksheet.getCells().get("C7").putValue(130);
worksheet.getCells().get("A8").putValue("kiwi");
worksheet.getCells().get("B8").putValue(2021);
worksheet.getCells().get("C8").putValue(220);
worksheet.getCells().get("A9").putValue("cherry");
worksheet.getCells().get("B9").putValue(2020);
worksheet.getCells().get("C9").putValue(140);
int pivotIndex = worksheet.getPivotTables().add("A1:C9", "E3", "Pivot1");
PivotTable pivotTable = worksheet.getPivotTables().get(pivotIndex);
pivotTable.addFieldToArea(PivotFieldType.ROW, "Fruit");
pivotTable.addFieldToArea(PivotFieldType.COLUMN, "Year");
pivotTable.addFieldToArea(PivotFieldType.DATA, "Amount");
worksheet.getCells().get("C2").putValue(300);
worksheet.getCells().get("C5").putValue(250);
worksheet.getCells().get("C9").putValue(400);
worksheet.refreshPivotTables();
workbook.save("output.xlsx");
Manchmal müssen Sie nur die Pivot-Tabellen aktualisieren, die sich auf einem bestimmten Arbeitsblatt befinden – beispielsweise wenn bekannt ist, dass Pivot-Tabellen auf anderen Arbeitsblättern unabhängig sind und nicht angefasst werden sollen. Für diesen Fall stellt Aspose.Cells Worksheet.refreshPivotTables() bereit, das auf eine einzelne Worksheet-Instanz beschränkt ist.
import com.aspose.cells.*;
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.getWorksheets().get(0);
// Schreibe die Kopfzeile Fruit / Year / Amount
worksheet.getCells().get("A1").putValue("Fruit");
worksheet.getCells().get("B1").putValue("Year");
worksheet.getCells().get("C1").putValue("Amount");
// Schreibe 8 Datenzeilen (Zeilen 2-9, passend zum Quellbereich A1:C9)
worksheet.getCells().get("A2").putValue("Grape");
worksheet.getCells().get("B2").putValue(2020);
worksheet.getCells().get("C2").putValue(100);
worksheet.getCells().get("A3").putValue("Blueberry");
worksheet.getCells().get("B3").putValue(2020);
worksheet.getCells().get("C3").putValue(200);
worksheet.getCells().get("A4").putValue("Kiwi");
worksheet.getCells().get("B4").putValue(2020);
worksheet.getCells().get("C4").putValue(300);
worksheet.getCells().get("A5").putValue("Cherry");
worksheet.getCells().get("B5").putValue(2020);
worksheet.getCells().get("C5").putValue(400);
worksheet.getCells().get("A6").putValue("Grape");
worksheet.getCells().get("B6").putValue(2021);
worksheet.getCells().get("C6").putValue(150);
worksheet.getCells().get("A7").putValue("Blueberry");
worksheet.getCells().get("B7").putValue(2021);
worksheet.getCells().get("C7").putValue(250);
worksheet.getCells().get("A8").putValue("Kiwi");
worksheet.getCells().get("B8").putValue(2021);
worksheet.getCells().get("C8").putValue(350);
worksheet.getCells().get("A9").putValue("Cherry");
worksheet.getCells().get("B9").putValue(2021);
worksheet.getCells().get("C9").putValue(450);
// Füge eine Pivot-Tabelle namens "Pivot1" hinzu, platziert in der Zielzelle E3, mit Quelle A1:C9
int pivotIndex = worksheet.getPivotTables().add("A1:C9", "E3", "Pivot1");
PivotTable pivotTable = worksheet.getPivotTables().get(pivotIndex);
// Felder zuweisen: Fruit zu Zeile, Year zu Spalte, Amount zu Daten
pivotTable.addFieldToArea(PivotFieldType.ROW, "Fruit");
pivotTable.addFieldToArea(PivotFieldType.COLUMN, "Year");
pivotTable.addFieldToArea(PivotFieldType.DATA, "Amount");
// Eine Ansichts-/Layout-Eigenschaft ändern -- dies ist nur eine Darstellungsänderung,
// daher ist es NICHT erforderlich, die Quelldaten über PivotCache.Refresh() erneut einzulesen.
pivotTable.setRefreshDataOnOpeningFile(false);
// calculateData() rendert die Anzeige DIESER Pivot-Tabelle (Daten + Stil) aus den
// Daten neu, die bereits im PivotCache gehalten werden. Da sich die Quelldaten nicht geändert haben,
// wird kein Round-Trip zur Quelle durchgeführt -- nur die zwischengespeicherten Werte werden neu berechnet
// in die Arbeitsblatt-Zellen.
pivotTable.calculateData();
// Speichere die Arbeitsmappe auf der Festplatte
workbook.save("output.xlsx");
Wenn Sie eine feinkörnige Kontrolle über eine einzelne Pivot-Tabelle wünschen, bietet Ihnen die cache-basierte API zwei Optionen. Die Wahl zwischen ihnen hängt davon ab, was sich tatsächlich geändert hat: die zugrunde liegenden Quelldaten oder nur die Ansichts-/Layouteinstellungen der Pivot-Tabelle selbst.
PivotCache.refresh() verwendenWenn sich die zugrunde liegenden Quelldaten geändert haben, ist der richtige Einstiegspunkt pivotTable.getPivotCache().refresh(). Dieser Aufruf liest die Quelldaten erneut in den Cache ein und berechnet anschließend jede PivotTable neu, die von diesem Cache abhängt.
calculateData() verwendenWenn sich die Quelldaten nicht geändert haben, sondern nur die Ansichts- oder Layouteinstellungen der Pivot-Tabelle geändert wurden (zum Beispiel wurde ein Feld in einen anderen Bereich verschoben oder eine Aktualisierungs-beim-Öffnen-Einstellung umgeschaltet), ist kein Roundtrip zur Datenquelle erforderlich. Der Cache enthält bereits die richtigen Daten; nur die gerenderte PivotTable muss neu berechnet werden. In diesem Fall ist pivotTable.calculateData() die richtige Wahl.
Das folgende Beispiel ändert eine Eigenschaft der Pivot-Tabelle, die nicht die Quelle betrifft, und ruft anschließend calculateData() auf, um sie aus dem bestehenden Cache neu zu rendern.
Eine Arbeitsmappe enthält häufig viele Pivot-Tabellen, die alle auf einem gemeinsam genutzten Cache sitzen. Um sie aufzulisten – beispielsweise vor einer Stapelaktualisierung oder um die Auswirkungen des gemeinsam genutzten Caches zu diagnostizieren – verwenden Sie PivotCache.getPivotTables(). Diese Methode gibt die Sammlung jeder PivotTable zurück, die von dem angegebenen Cache abhängt.
PivotTable.refreshData()Vor Aspose.Cells for Java v26.7 war die Standardmethode zum Aktualisieren einer Pivot-Tabelle der Aufruf von PivotTable.refreshData() für jede Pivot-Tabelle einzeln. Ab v26.7 ist diese Methode als veraltet markiert und sollte durch die oben beschriebenen cache-bewussten APIs ersetzt werden.
Es gibt zwei Gründe, warum der refreshData()-Ansatz pro Tabelle in realen Arbeitsmappen problematisch ist:
Die folgende Tabelle fasst die verfügbaren Aktualisierungs-APIs zusammen und zeigt, wann welche zu wählen ist.
| Ziel | Empfohlene API | Hinweise |
|---|---|---|
| Alles in der Arbeitsmappe aktualisieren | Workbook.refreshAll() |
Ein Aufruf; deckt alle Caches und Tabellen ab. |
| Nur Pivot-Tabellen in einem einzelnen Blatt aktualisieren | Worksheet.refreshPivotTables() |
Auf ein Arbeitsblatt beschränkt. |
| Quelldaten für einen Cache geändert | pivotTable.getPivotCache().refresh() |
Aktualisiert ALLE Pivot-Tabellen dieses gemeinsam genutzten Caches. |
| Nur Ansichts-/Layouteinstellungen geändert | pivotTable.calculateData() |
Vermeidet unnötigen Quell-Roundtrip. |
| Alle Pivot-Tabellen in einem gemeinsam genutzten Cache auflisten | pivotCache.getPivotTables() |
Vor der Stapelaktualisierung zum Aufzählen verwenden. |
In der Praxis sind die cache-basierten APIs der veralteten refreshData() pro Tabelle vorzuziehen. Sie kennen gemeinsam genutzte Caches, vermeiden redundante Quellabrufe und ermöglichen es Ihnen, den kleinsten Geltungsbereich zu wählen, der Ihre Aktualisierungsanforderung erfüllt. |
PivotCache.Refresh() (oder Workbook.RefreshAll()) vor Workbook.save() auf, da die gespeicherte Datei sonst weiterhin die alten aggregierten Werte enthält.RefreshData() pro Tabelle. In v26.7 ist PivotTable.RefreshData() als veraltet markiert und ruft die Quelle bei jedem Aufruf erneut ab. Bei mehreren Pivot-Tabellen, die sich einen Cache teilen, bedeutet dies N redundante Quellabrufe. Ersetzen Sie dies durch einen einzigen PivotCache.Refresh(), gefolgt von CalculateData() pro Tabelle.ConsolidationFunction usw.), ohne die Quelldaten anzufassen, ist PivotCache.Refresh() unnötig und langsam. Rufen Sie pivotTable.CalculateData() auf, um aus dem bestehenden Cache neu zu rendern.PivotCache.Refresh() nicht unterstützt. Wenn die Quelle der Pivot-Tabelle aus einer externen Verbindung stammt (Datenbank, OLAP-Cube usw.), kann PivotCache.Refresh() sie in v26.7 nicht aktualisieren – es werden derzeit nur die Quellentypen Sheet und Consolidation unterstützt. Für externe Quellen öffnen Sie die Arbeitsmappe erneut oder erstellen Sie den Cache aus der Quelle neu.using Aspose.Cells;
Workbook workbook = new Workbook("input.xlsx");
workbook.RefreshAll();
workbook.Save("output.xlsx");
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.