Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
PivotTable.RefreshData() è contrassegnato come obsoleto e deve essere sostituito con le API più efficienti e consapevoli della cache descritte in questo articolo.
L’aggiornamento di una tabella pivot è raramente una singola operazione. Dietro le quinte, Aspose.Cells mantiene una catena di dati stratificata che collega i dati originali ai valori visualizzati nel foglio di lavoro. Comprendere questa catena è la chiave per scegliere l’API di aggiornamento giusta per ogni situazione.
La catena dei dati a quattro livelli è:
PivotCache; è qui che tutti i dati vengono raccolti e aggregati.PivotTable legge esclusivamente dal proprio PivotCache, mai direttamente dall’origine dati.Cells del foglio di lavoro in cui la PivotTable rende i valori calcolati e gli stili.Un concetto particolarmente importante è la cache condivisa. Quando più tabelle pivot nella cartella di lavoro fanno riferimento allo stesso intervallo di origine, condividono una sola istanza di PivotCache. Un singolo PivotCache può essere referenziato da molte tabelle pivot, e aggiornare quella cache aggiorna contemporaneamente ogni PivotTable dipendente.
PivotCache.SourceType (enum PivotTableSourceType) indica da dove provengono i dati della cache. A partire dalla v26.7, PivotCache.Refresh() supporta solo i tipi di origine Sheet e Consolidation, ovvero dati che risiedono in intervalli del foglio di lavoro. Origini esterne (database, connessioni esterne, ecc.) non sono ancora aggiornabili tramite l’API della cache.
A causa di questa catena, esistono due percorsi fondamentali di aggiornamento in Aspose.Cells:
PivotCache.Refresh() — ricarica origine → cache E ricalcola tutte le PivotTable dipendenti in una singola operazione.PivotTable.CalculateData() — ricalcola la visualizzazione di una PivotTable dai dati già memorizzati nella cache, senza tornare all’origine dati.Tutti gli scenari in questo articolo utilizzano dati di origine provenienti da celle del foglio di lavoro, quindi il tipo di origine è Sheet e le operazioni di aggiornamento si comportano come descritto.
Tutti gli esempi C++ di questo articolo iniziano con le seguenti direttive di inclusione degli header e di namespace perché i tipi delle pivot risiedono nel namespace Aspose::Cells::Pivot:
#include <system/object.h>#include "Aspose.Cells.h"using namespace Aspose::Cells;using namespace Aspose::Cells::Pivot;Quando è necessario garantire che ogni cache pivot e ogni tabella pivot nella cartella di lavoro riflettano i dati di origine più recenti, l’API più semplice e completa è Workbook.RefreshAll(). Una singola chiamata attraversa l’intera cartella di lavoro, aggiornando ogni PivotCache dalla propria origine e ricalcolando poi ogni PivotTable dipendente. Questo è l’approccio consigliato per gli aggiornamenti generali e completi del documento, quando le prestazioni non sono un problema.
L’esempio seguente crea una cartella di lavoro con un intervallo di origine Frutto/Anno/Importo, crea una tabella pivot, modifica alcuni valori di origine e poi utilizza RefreshAll() per portare tutto aggiornato in una singola chiamata.
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
using namespace Aspose::Cells::Pivot;
int main() {
Aspose::Cells::Startup();
Workbook wb;
Worksheet worksheet = wb.GetWorksheets().Get(0);
Cells cells = worksheet.GetCells();
cells.Get(u"A1").PutValue(U16String("Fruit"));
cells.Get(u"B1").PutValue(U16String("Year"));
cells.Get(u"C1").PutValue(U16String("Amount"));
cells.Get(u"A2").PutValue(U16String("grape"));
cells.Get(u"B2").PutValue(2020);
cells.Get(u"C2").PutValue(50);
cells.Get(u"A3").PutValue(U16String("blueberry"));
cells.Get(u"B3").PutValue(2020);
cells.Get(u"C3").PutValue(60);
cells.Get(u"A4").PutValue(U16String("kiwi"));
cells.Get(u"B4").PutValue(2020);
cells.Get(u"C4").PutValue(70);
cells.Get(u"A5").PutValue(U16String("cherry"));
cells.Get(u"B5").PutValue(2020);
cells.Get(u"C5").PutValue(80);
cells.Get(u"A6").PutValue(U16String("grape"));
cells.Get(u"B6").PutValue(2021);
cells.Get(u"C6").PutValue(90);
cells.Get(u"A7").PutValue(U16String("blueberry"));
cells.Get(u"B7").PutValue(2021);
cells.Get(u"C7").PutValue(100);
cells.Get(u"A8").PutValue(U16String("kiwi"));
cells.Get(u"B8").PutValue(2021);
cells.Get(u"C8").PutValue(110);
cells.Get(u"A9").PutValue(U16String("cherry"));
cells.Get(u"B9").PutValue(2021);
cells.Get(u"C9").PutValue(120);
int pivotIndex = worksheet.GetPivotTables().Add(u"A1:C9", u"E3", u"Pivot1");
PivotTable pivotTable = worksheet.GetPivotTables().Get(pivotIndex);
pivotTable.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable.AddFieldToArea(PivotFieldType::Data, u"Amount");
cells.Get(u"C2").PutValue(55);
cells.Get(u"C5").PutValue(85);
cells.Get(u"C9").PutValue(125);
pivotTable.CalculateData();
wb.Save(u"output.xlsx");
Aspose::Cells::Cleanup();
return 0;
}
A volte è necessario aggiornare solo le tabelle pivot che si trovano su un foglio di lavoro specifico, ad esempio quando le tabelle pivot presenti su altri fogli di lavoro non sono correlate e non devono essere toccate. Per questo caso, Aspose.Cells fornisce Worksheet.RefreshPivotTables(), che ha come ambito una singola istanza di Worksheet.
Questo è più selettivo rispetto a Workbook.RefreshAll(): vengono aggiornate solo le tabelle pivot presenti sul foglio di lavoro interessato, lasciando inalterate le tabelle pivot sugli altri fogli.
L’esempio seguente popola gli stessi dati di origine Frutto/Anno/Importo, aggiunge una tabella pivot sul primo foglio di lavoro, modifica alcuni valori di origine e poi aggiorna solo le tabelle pivot presenti su quel foglio.
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
int main() {
Aspose::Cells::Startup();
Workbook workbook;
Worksheet worksheet = workbook.GetWorksheets().Get(0);
worksheet.GetCells().Get(u"A1").PutValue(u"Fruit");
worksheet.GetCells().Get(u"B1").PutValue(u"Year");
worksheet.GetCells().Get(u"C1").PutValue(u"Amount");
worksheet.GetCells().Get(u"A2").PutValue(u"grape");
worksheet.GetCells().Get(u"B2").PutValue(2020);
worksheet.GetCells().Get(u"C2").PutValue(100);
worksheet.GetCells().Get(u"A3").PutValue(u"blueberry");
worksheet.GetCells().Get(u"B3").PutValue(2021);
worksheet.GetCells().Get(u"C3").PutValue(150);
worksheet.GetCells().Get(u"A4").PutValue(u"kiwi");
worksheet.GetCells().Get(u"B4").PutValue(2020);
worksheet.GetCells().Get(u"C4").PutValue(200);
worksheet.GetCells().Get(u"A5").PutValue(u"cherry");
worksheet.GetCells().Get(u"B5").PutValue(2021);
worksheet.GetCells().Get(u"C5").PutValue(120);
worksheet.GetCells().Get(u"A6").PutValue(u"grape");
worksheet.GetCells().Get(u"B6").PutValue(2021);
worksheet.GetCells().Get(u"C6").PutValue(180);
worksheet.GetCells().Get(u"A7").PutValue(u"blueberry");
worksheet.GetCells().Get(u"B7").PutValue(2020);
worksheet.GetCells().Get(u"C7").PutValue(130);
worksheet.GetCells().Get(u"A8").PutValue(u"kiwi");
worksheet.GetCells().Get(u"B8").PutValue(2021);
worksheet.GetCells().Get(u"C8").PutValue(220);
worksheet.GetCells().Get(u"A9").PutValue(u"cherry");
worksheet.GetCells().Get(u"B9").PutValue(2020);
worksheet.GetCells().Get(u"C9").PutValue(140);
int pivotIndex = worksheet.GetPivotTables().Add(u"A1:C9", u"E3", u"Pivot1");
PivotTable pivotTable = worksheet.GetPivotTables().Get(pivotIndex);
pivotTable.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable.AddFieldToArea(PivotFieldType::Data, u"Amount");
worksheet.GetCells().Get(u"C2").PutValue(300);
worksheet.GetCells().Get(u"C5").PutValue(250);
worksheet.GetCells().Get(u"C9").PutValue(400);
worksheet.RefreshPivotTables();
workbook.Save(u"output.xlsx");
Aspose::Cells::Cleanup();
return 0;
}
Quando si desidera un controllo a granularità fine su una singola tabella pivot, l’API basata sulla cache offre due opzioni. La scelta tra esse dipende da cosa è effettivamente cambiato: i dati di origine sottostanti, oppure solo le impostazioni di vista/layout della tabella pivot stessa.
PivotCache.Refresh()Se i dati di origine sottostanti sono cambiati, il punto di ingresso corretto è pivotTable.GetPivotCache().Refresh(). Questa chiamata rilegge i dati di origine nella cache e poi ricalcola ogni PivotTable che dipende da quella cache.
PivotCache, chiamare PivotCache.Refresh() ricalcola tutte le tabelle pivot costruite su quella stessa cache, non solo quella a cui si fa riferimento. Se due tabelle pivot condividono lo stesso intervallo di origine, aggiornare una cache aggiorna entrambe.
L’esempio seguente crea due tabelle pivot sullo stesso intervallo di origine per dimostrare questo comportamento di cache condivisa, modifica alcuni valori di origine e poi aggiorna tramite un riferimento a una cache.
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
int main() {
Aspose::Cells::Startup();
Workbook workbook;
Worksheet worksheet = workbook.GetWorksheets().Get(0);
Cells cells = worksheet.GetCells();
// Riga di intestazione: Frutta / Anno / Importo
cells.Get(u"A1").PutValue(u"Fruit");
cells.Get(u"B1").PutValue(u"Year");
cells.Get(u"C1").PutValue(u"Amount");
// Righe di dati
cells.Get(u"A2").PutValue(u"Grape");
cells.Get(u"B2").PutValue(2020);
cells.Get(u"C2").PutValue(100);
cells.Get(u"A3").PutValue(u"Blueberry");
cells.Get(u"B3").PutValue(2020);
cells.Get(u"C3").PutValue(200);
cells.Get(u"A4").PutValue(u"Kiwi");
cells.Get(u"B4").PutValue(2020);
cells.Get(u"C4").PutValue(300);
cells.Get(u"A5").PutValue(u"Cherry");
cells.Get(u"B5").PutValue(2020);
cells.Get(u"C5").PutValue(400);
cells.Get(u"A6").PutValue(u"Grape");
cells.Get(u"B6").PutValue(2021);
cells.Get(u"C6").PutValue(500);
cells.Get(u"A7").PutValue(u"Blueberry");
cells.Get(u"B7").PutValue(2021);
cells.Get(u"C7").PutValue(600);
cells.Get(u"A8").PutValue(u"Kiwi");
cells.Get(u"B8").PutValue(2021);
cells.Get(u"C8").PutValue(700);
cells.Get(u"A9").PutValue(u"Cherry");
cells.Get(u"B9").PutValue(2021);
cells.Get(u"C9").PutValue(800);
// Aggiungi la prima tabella pivot "Pivot1" ancorata alla cella E3, intervallo di origine A1:C9
int pivotIndex1 = worksheet.GetPivotTables().Add(u"A1:C9", u"E3", u"Pivot1");
PivotTable pivotTable1 = worksheet.GetPivotTables().Get(pivotIndex1);
// Assegna i campi per Pivot1
pivotTable1.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable1.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable1.AddFieldToArea(PivotFieldType::Data, u"Amount");
// Aggiungi una SECONDA tabella pivot "Pivot2" ancorata a E15 utilizzando lo STESSO intervallo di origine A1:C9
int pivotIndex2 = worksheet.GetPivotTables().Add(u"A1:C9", u"E15", u"Pivot2");
PivotTable pivotTable2 = worksheet.GetPivotTables().Get(pivotIndex2);
// Assegna gli stessi campi per Pivot2
pivotTable2.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable2.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable2.AddFieldToArea(PivotFieldType::Data, u"Amount");
// Modifica diversi valori delle celle Importo nei dati di origine per simulare una modifica dei dati
cells.Get(u"C2").PutValue(150);
cells.Get(u"C4").PutValue(350);
cells.Get(u"C7").PutValue(650);
// Aggiorna la PivotCache condivisa aggiornando i dati della tabella pivot
pivotTable1.RefreshData();
// Salva la cartella di lavoro
workbook.Save(u"output.xlsx");
Aspose::Cells::Cleanup();
return 0;
}
CalculateData()Se i dati di origine non sono cambiati ma sono state modificate solo le impostazioni di vista o layout della tabella pivot (ad esempio, un campo è stato spostato in un’area diversa, o un’impostazione di aggiornamento all’apertura è stata attivata/disattivata), non è necessario tornare all’origine dati. La cache contiene già i dati corretti; deve essere ricalcolata solo la PivotTable visualizzata. In questo caso, pivotTable.CalculateData() è la scelta giusta.
In questo modo si evita un recupero non necessario dei dati di origine ed è significativamente più veloce quando molte tabelle pivot condividono la stessa cache.
L’esempio seguente modifica una proprietà non di origine della tabella pivot e poi chiama CalculateData() per renderizzarla di nuovo dalla cache esistente.
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
int main() {
Aspose::Cells::Startup();
Workbook workbook;
Worksheet worksheet = workbook.GetWorksheets().Get(0);
// Scrivi la riga di intestazione Frutto / Anno / Importo
worksheet.GetCells().Get(u"A1").PutValue(u"Fruit");
worksheet.GetCells().Get(u"B1").PutValue(u"Year");
worksheet.GetCells().Get(u"C1").PutValue(u"Amount");
// Scrivi 8 righe di dati (righe 2-9, adattandosi all'intervallo di origine A1:C9)
worksheet.GetCells().Get(u"A2").PutValue(u"Grape");
worksheet.GetCells().Get(u"B2").PutValue(2020);
worksheet.GetCells().Get(u"C2").PutValue(100);
worksheet.GetCells().Get(u"A3").PutValue(u"Blueberry");
worksheet.GetCells().Get(u"B3").PutValue(2020);
worksheet.GetCells().Get(u"C3").PutValue(200);
worksheet.GetCells().Get(u"A4").PutValue(u"Kiwi");
worksheet.GetCells().Get(u"B4").PutValue(2020);
worksheet.GetCells().Get(u"C4").PutValue(300);
worksheet.GetCells().Get(u"A5").PutValue(u"Cherry");
worksheet.GetCells().Get(u"B5").PutValue(2020);
worksheet.GetCells().Get(u"C5").PutValue(400);
worksheet.GetCells().Get(u"A6").PutValue(u"Grape");
worksheet.GetCells().Get(u"B6").PutValue(2021);
worksheet.GetCells().Get(u"C6").PutValue(150);
worksheet.GetCells().Get(u"A7").PutValue(u"Blueberry");
worksheet.GetCells().Get(u"B7").PutValue(2021);
worksheet.GetCells().Get(u"C7").PutValue(250);
worksheet.GetCells().Get(u"A8").PutValue(u"Kiwi");
worksheet.GetCells().Get(u"B8").PutValue(2021);
worksheet.GetCells().Get(u"C8").PutValue(350);
worksheet.GetCells().Get(u"A9").PutValue(u"Cherry");
worksheet.GetCells().Get(u"B9").PutValue(2021);
worksheet.GetCells().Get(u"C9").PutValue(450);
// Aggiungi una tabella pivot denominata "Pivot1" posizionata nella cella di destinazione E3, con origine da A1:C9
int pivotIndex = worksheet.GetPivotTables().Add(u"A1:C9", u"E3", u"Pivot1");
PivotTable pivotTable = worksheet.GetPivotTables().Get(pivotIndex);
// Assegna i campi: Frutto a Riga, Anno a Colonna, Importo a Dati
pivotTable.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable.AddFieldToArea(PivotFieldType::Data, u"Amount");
// Modifica una proprietà di visualizzazione/layout — si tratta di una modifica solo di presentazione,
// quindi NON richiede la rilettura dei dati di origine tramite PivotCache.Refresh().
pivotTable.SetRefreshDataOnOpeningFile(false);
// CalculateData() ridisegna la visualizzazione di QUESTA tabella pivot (dati + stile) dai
// dati già presenti nella PivotCache. Poiché i dati di origine non sono cambiati,
// non viene eseguito alcun round-trip all'origine — vengono ricalcolati solo i valori memorizzati nella cache
// nelle celle del foglio di lavoro.
pivotTable.CalculateData();
// Salva la cartella di lavoro su disco
workbook.Save(u"output.xlsx");
Aspose::Cells::Cleanup();
return 0;
}
Una cartella di lavoro spesso contiene molte tabelle pivot che si appoggiano tutte a una cache condivisa. Per enumerarle, ad esempio prima di eseguire un aggiornamento in batch, o per diagnosticare l’impatto della cache condivisa, utilizzare PivotCache.GetPivotTables(). Questo metodo restituisce l’insieme di ogni PivotTable che dipende dalla cache fornita.
Questo è anche il modo più diretto per confermare che due tabelle pivot condividono effettivamente la stessa istanza di PivotCache: è possibile confrontare i riferimenti alla cache, oppure semplicemente iterare l’insieme restituito da GetPivotTables() e osservare quali tabelle pivot vi compaiono.
L’esempio seguente crea due tabelle pivot sullo stesso intervallo di origine, verifica che condividano la stessa istanza di cache e poi enumera le tabelle pivot della cache.
PivotTable.RefreshData()Prima di Aspose.Cells for C++ v26.7, il modo standard per aggiornare una tabella pivot era chiamare PivotTable.RefreshData() su ogni tabella pivot individualmente. A partire dalla v26.7, quel metodo è contrassegnato come obsoleto e deve essere sostituito con le API consapevoli della cache descritte sopra.
Ci sono due motivi per cui l’approccio per tabella RefreshData() è problematico nelle cartelle di lavoro reali:
RefreshData() per ogni tabella pivot fa sì che la stessa cache venga recuperata più e più volte, il che è molto lento.Le sostituzioni consigliate sono:
workbook.RefreshAll();pivotTable.GetPivotCache().Refresh(); per una cache. Poiché la cache è condivisa, questa singola chiamata aggiorna ogni tabella pivot costruita sopra quella cache. Le altre tabelle pivot che si appoggiano a una cache già aggiornata possono essere tranquillamente saltate.pivotTable.CalculateData(); per renderizzare di nuovo dalla cache esistente senza alcun round-trip verso l’origine.L’esempio seguente dimostra il nuovo schema efficiente per cartelle di lavoro con più tabelle pivot che condividono una singola cache.
#include "Aspose.Cells.h"
using namespace Aspose::Cells;
using namespace Aspose::Cells::Pivot;
int main() {
Aspose::Cells::Startup();
Workbook wb;
Worksheet sheet = wb.GetWorksheets().Get(0);
sheet.GetCells().Get(u"A1").PutValue(u"Fruit");
sheet.GetCells().Get(u"B1").PutValue(u"Year");
sheet.GetCells().Get(u"C1").PutValue(u"Amount");
sheet.GetCells().Get(u"A2").PutValue(u"Grape"); sheet.GetCells().Get(u"B2").PutValue(2020); sheet.GetCells().Get(u"C2").PutValue(1000);
sheet.GetCells().Get(u"A3").PutValue(u"Blueberry"); sheet.GetCells().Get(u"B3").PutValue(2020); sheet.GetCells().Get(u"C3").PutValue(2000);
sheet.GetCells().Get(u"A4").PutValue(u"Kiwi"); sheet.GetCells().Get(u"B4").PutValue(2020); sheet.GetCells().Get(u"C4").PutValue(1500);
sheet.GetCells().Get(u"A5").PutValue(u"Cherry"); sheet.GetCells().Get(u"B5").PutValue(2020); sheet.GetCells().Get(u"C5").PutValue(2500);
sheet.GetCells().Get(u"A6").PutValue(u"Grape"); sheet.GetCells().Get(u"B6").PutValue(2021); sheet.GetCells().Get(u"C6").PutValue(3000);
sheet.GetCells().Get(u"A7").PutValue(u"Blueberry"); sheet.GetCells().Get(u"B7").PutValue(2021); sheet.GetCells().Get(u"C7").PutValue(1800);
sheet.GetCells().Get(u"A8").PutValue(u"Kiwi"); sheet.GetCells().Get(u"B8").PutValue(2021); sheet.GetCells().Get(u"C8").PutValue(2200);
sheet.GetCells().Get(u"A9").PutValue(u"Cherry"); sheet.GetCells().Get(u"B9").PutValue(2021); sheet.GetCells().Get(u"C9").PutValue(2700);
int idx1 = sheet.GetPivotTables().Add(u"A1:C9", u"E3", u"Pivot1");
PivotTable pivotTable1 = sheet.GetPivotTables().Get(idx1);
pivotTable1.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable1.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable1.AddFieldToArea(PivotFieldType::Data, u"Amount");
int idx2 = sheet.GetPivotTables().Add(u"A1:C9", u"E15", u"Pivot2");
PivotTable pivotTable2 = sheet.GetPivotTables().Get(idx2);
pivotTable2.AddFieldToArea(PivotFieldType::Row, u"Fruit");
pivotTable2.AddFieldToArea(PivotFieldType::Column, u"Year");
pivotTable2.AddFieldToArea(PivotFieldType::Data, u"Amount");
sheet.GetCells().Get(u"C2").PutValue(5000);
sheet.GetCells().Get(u"C5").PutValue(7500);
sheet.GetCells().Get(u"C9").PutValue(9500);
pivotTable2.CalculateData();
wb.Save(u"output.xlsx");
Aspose::Cells::Cleanup();
return 0;
}
La tabella seguente riassume le API di aggiornamento disponibili e quando scegliere ciascuna di esse.
| Obiettivo | API consigliata | Note |
|---|---|---|
| Aggiornare tutto nella cartella di lavoro | Workbook.RefreshAll() |
Una sola chiamata; copre tutte le cache e tutte le tabelle. |
| Aggiornare solo le tabelle pivot su un singolo foglio | Worksheet.RefreshPivotTables() |
Ambito limitato a un foglio di lavoro. |
| Dati di origine modificati per una cache | pivotTable.GetPivotCache().Refresh() |
Aggiorna TUTTE le tabelle pivot su quella cache condivisa. |
| Sono cambiate solo le impostazioni di vista/layout | pivotTable.CalculateData() |
Evita il round-trip non necessario verso l’origine. |
| Elencare tutte le tabelle pivot su una cache condivisa | pivotCache.GetPivotTables() |
Da usare per enumerare prima di un aggiornamento massivo. |
In pratica, preferire le API basate sulla cache rispetto al metodo obsoleto per tabella RefreshData(). Sono consapevoli delle cache condivise, evitano recuperi ridondanti dei dati di origine e consentono di scegliere il più piccolo ambito che soddisfi la propria esigenza di aggiornamento.
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.