Gestisci le cartelle di lavoro dei grafici nelle presentazioni su Android
Panoramica
Questo articolo spiega come lavorare con le cartelle di lavoro dei grafici in Aspose.Slides. Mostra come leggere e scrivere i dati del grafico tramite flussi di cartelle di lavoro, utilizzare le celle della cartella di lavoro come etichette dei dati del grafico, accedere alle collezioni di fogli di lavoro e specificare il tipo di origine dati per i valori del grafico.
Copre anche l’utilizzo di cartelle di lavoro esterne come origini dati per i grafici. Gli esempi mostrano come creare e assegnare una cartella di lavoro esterna, recuperare il percorso di una cartella di lavoro esterna collegata a un grafico e modificare i dati del grafico quando la cartella di lavoro è disponibile.
Leggere e Scrivere Dati del Grafico da una Cartella di Lavoro
Aspose.Slides fornisce i metodi ReadWorkbookStream e WriteWorkbookStream che consentono di leggere e scrivere le cartelle di lavoro dei dati del grafico (contenenti dati del grafico modificati con Aspose.Cells). Nota che i dati del grafico devono essere organizzati nello stesso modo o devono avere una struttura simile a quella della sorgente.
import com.aspose.slides.*;
Presentation pres = new Presentation("chart.pptx");
try {
Chart chart = (Chart) pres.getSlides().get_Item(0).getShapes().get_Item(0);
IChartData data = chart.getChartData();
byte[] stream = data.readWorkbookStream();
data.getSeries().clear();
data.getCategories().clear();
data.writeWorkbookStream(stream);
} finally {
if (pres != null) pres.dispose();
}
Convalidare il Layout del Grafico Dopo la Modifica della Cartella di Lavoro
Quando si sostituisce una cartella di lavoro incorporata con una modificata, il grafico mantiene le collezioni originali di serie e categorie. Questa discrepanza può causare il fallimento di IChart.validateChartLayout con un errore di indice fuori intervallo. È necessario svuotare le serie e le categorie esistenti prima di scrivere la cartella di lavoro aggiornata nel grafico.
// Dopo aver modificato lo stream della cartella di lavoro (ad esempio, usando Aspose.Cells)
byte[] updatedWorkbook = chartData.readWorkbookStream();
// Cancella i riferimenti ai dati esistenti.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(updatedWorkbook);
chart.validateChartLayout();
Svuotare le collezioni garantisce che la struttura dei dati del grafico sia coerente con la nuova cartella di lavoro, consentendo a validateChartLayout di completarsi senza errori.
Impostare una Cella della Cartella di Lavoro come Etichetta dei Dati del Grafico
- Creare un’istanza della classe Presentation .
- Ottenere il riferimento a una diapositiva tramite il suo indice.
- Aggiungere un grafico a bolle con alcuni dati.
- Accedere alla serie del grafico.
- Impostare la cella della cartella di lavoro come etichetta dei dati.
- Salvare la presentazione.
Questo codice Java mostra come impostare una cella della cartella di lavoro come etichetta dei dati del grafico:
import com.aspose.slides.*;
String lbl0 = "Label 0 cell value";
String lbl1 = "Label 1 cell value";
String lbl2 = "Label 2 cell value";
// Istanzia una classe di presentazione che rappresenta un file di presentazione
Presentation pres = new Presentation("chart2.pptx");
try {
ISlide slide = pres.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, true);
IChartSeriesCollection series = chart.getChartData().getSeries();
IDataLabelCollection dataLabelCollection = series.get_Item(0).getLabels();
dataLabelCollection.getDefaultDataLabelFormat().setShowLabelValueFromCell(true);
IChartDataWorkbook wb = chart.getChartData().getChartDataWorkbook();
dataLabelCollection.get_Item(0).setValueFromCell(wb.getCell(0, "A10", lbl0));
dataLabelCollection.get_Item(1).setValueFromCell(wb.getCell(0, "A11", lbl1));
dataLabelCollection.get_Item(2).setValueFromCell(wb.getCell(0, "A12", lbl2));
pres.save("resultchart.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Gestire i Fogli di Lavoro
Questo codice Java dimostra un’operazione in cui il metodo IChartDataWorkbook.Worksheets viene utilizzato per accedere a una collezione di fogli di lavoro:
import com.aspose.slides.*;
Presentation pres = new Presentation();
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 500);
IChartDataWorkbook wb = chart.getChartData().getChartDataWorkbook();
for (int i = 0; i < wb.getWorksheets().size(); i++)
System.out.println(wb.getWorksheets().get_Item(i).getName());
} finally {
if (pres != null) pres.dispose();
}
Specificare il Tipo di Origine Dati
Questo codice Java mostra come specificare un tipo per un’origine dati:
import com.aspose.slides.*;
Presentation pres = new Presentation();
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, true);
IStringChartValue val = chart.getChartData().getSeries().get_Item(0).getName();
val.setDataSourceType(DataSourceType.StringLiterals);
val.setData("LiteralString");
val = chart.getChartData().getSeries().get_Item(1).getName();
val.setData(chart.getChartData().getChartDataWorkbook().getCell(0, "B1", "NewCell"));
pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Rilevare Formati di Cartelle di Lavoro Incorporate Non Supportati
Aspose.Slides non supporta il formato di cartella di lavoro Excel binario (.xlsb) che può essere incorporato in alcuni grafici. È possibile utilizzare il metodo getEmbeddedWorkbookType su IChartData insieme all’enumerazione WorkbookType per rilevare formati non supportati e saltare quei grafici.
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IChart)) continue;
IChart chart = (IChart)shape;
IChartData chartData = chart.getChartData();
if (chartData.getDataSourceType() == ChartDataSourceType.InternalWorkbook &&
chartData.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro) {
// Il workbook incorporato è nel formato .xlsb, che non è supportato.
continue;
}
// Leggi o modifica i dati del workbook del grafico qui.
}
} finally {
presentation.dispose();
}
Cartella di Lavoro Esterna
Aspose.Slides supporta cartelle di lavoro esterne come origine dati per i grafici.
Creare una Cartella di Lavoro Esterna
Utilizzando i metodi readWorkbookStream e setExternalWorkbook, è possibile creare una cartella di lavoro esterna da zero o rendere esterna una cartella di lavoro interna.
Questo codice Java dimostra il processo di creazione di una cartella di lavoro esterna:
import com.aspose.slides.*;
import java.io.FileOutputStream;
import java.io.IOException;
Presentation pres = new Presentation();
try {
final String workbookPath = "externalWorkbook1.xlsx";
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600);
FileOutputStream fileStream = new FileOutputStream(workbookPath);
try {
byte[] workbookData = chart.getChartData().readWorkbookStream();
fileStream.write(workbookData, 0, workbookData.length);
} finally {
if (fileStream != null) fileStream.close();
}
chart.getChartData().setExternalWorkbook(workbookPath);
pres.save("externalWorkbook.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Impostare una Cartella di Lavoro Esterna
Utilizzando il metodo setExternalWorkbook, è possibile assegnare una cartella di lavoro esterna a un grafico come sua origine dati. Questo metodo può anche essere usato per aggiornare il percorso della cartella di lavoro esterna (se quest’ultima è stata spostata).
Sebbene non sia possibile modificare i dati nelle cartelle di lavoro archiviate in posizioni remote o risorse, è comunque possibile utilizzare tali cartelle di lavoro come fonte dati esterna. Se viene fornito un percorso relativo per una cartella di lavoro esterna, viene convertito automaticamente in un percorso assoluto.
Questo codice Java mostra come impostare una cartella di lavoro esterna:
import com.aspose.slides.*;
// Crea un'istanza della classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, false);
IChartData chartData = chart.getChartData();
chartData.setExternalWorkbook("externalWorkbook.xlsx");
chartData.getSeries().add(chartData.getChartDataWorkbook().getCell(0, "B1"), ChartType.Pie);
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B2"));
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B3"));
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B4"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A2"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A3"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A4"));
pres.save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Il parametro updateChartData (sotto il metodo setExternalWorkbook) viene usato per specificare se una cartella di lavoro Excel verrà caricata o meno.
- Quando il valore di
updateChartDataè impostato sufalse, viene aggiornato solo il percorso della cartella di lavoro: i dati del grafico non verranno caricati né aggiornati dalla cartella di lavoro di destinazione. Questa impostazione è utile quando la cartella di lavoro di destinazione è inesistente o non disponibile. - Quando il valore di
updateChartDataè impostato sutrue, i dati del grafico vengono aggiornati dalla cartella di lavoro di destinazione.
import com.aspose.slides.*;
// Crea un'istanza della classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
IChartData chartData = chart.getChartData();
((ChartData)chartData).setExternalWorkbook("http://path/doesnt/exists", false);
pres.save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Ottenere il Percorso della Cartella di Lavoro Esterna di Origine Dati di un Grafico
- Creare un’istanza della classe Presentation .
- Ottenere il riferimento a una diapositiva tramite il suo indice.
- Creare un oggetto per la forma del grafico.
- Creare un oggetto per il tipo di origine (
ChartDataSourceType) che rappresenta l’origine dati del grafico. - Specificare la condizione pertinente in base al fatto che il tipo di origine sia lo stesso del tipo di origine dati della cartella di lavoro esterna.
Questo codice Java dimostra l’operazione:
import com.aspose.slides.*;
// Crea un'istanza della classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
ISlide slide = pres.getSlides().get_Item(1);
IChart chart = (IChart)slide.getShapes().get_Item(0);
int sourceType = chart.getChartData().getDataSourceType();
if (sourceType == ChartDataSourceType.ExternalWorkbook)
{
String path = chart.getChartData().getExternalWorkbookPath();
}
// Salva la presentazione
pres.save("result.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Modificare i Dati del Grafico
È possibile modificare i dati nelle cartelle di lavoro esterne nello stesso modo in cui si apportano modifiche al contenuto delle cartelle di lavoro interne. Quando una cartella di lavoro esterna non può essere caricata, viene sollevata un’eccezione.
Questo codice Java è un’implementazione del processo descritto:
import com.aspose.slides.*;
// Crea un'istanza della classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = (IChart)pres.getSlides().get_Item(0).getShapes().get_Item(0);
ChartData chartData = (ChartData)chart.getChartData();
chartData.getSeries().get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell().setValue(100);
pres.save("presentation_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Recuperare una Cartella di Lavoro dalla Cache del Grafico
Se un grafico utilizza una cartella di lavoro esterna mancante o non disponibile, Aspose.Slides può ricostruire la cartella di lavoro del grafico dai dati memorizzati nella presentazione. Creare un oggetto LoadOptions, configurarlo con SpreadsheetOptions, e chiamare ISpreadsheetOptions.setRecoverWorkbookFromChartCache con true prima di aprire la presentazione.
Il seguente esempio Java apre una presentazione il cui grafico fa riferimento a una cartella di lavoro esterna non disponibile e accede ai dati recuperati tramite IChart.getChartData e IChartData.getChartDataWorkbook:
import com.aspose.slides.*;
SpreadsheetOptions spreadsheetOptions = new SpreadsheetOptions();
spreadsheetOptions.setRecoverWorkbookFromChartCache(true);
LoadOptions loadOptions = new LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);
Presentation presentation = new Presentation("presentation.pptx", loadOptions);
try {
IChart chart = (IChart)presentation.getSlides().get_Item(0).getShapes().get_Item(0);
IChartDataWorkbook recoveredWorkbook = chart.getChartData().getChartDataWorkbook();
// Leggi o modifica i dati del workbook recuperato qui.
} finally {
presentation.dispose();
}
Se la cartella di lavoro esterna è non disponibile e il recupero è disabilitato, Aspose.Slides genera un’eccezione. Abilitare il recupero solo quando l’uso dei dati del grafico memorizzati nella cache è un’opzione accettabile, perché la cache potrebbe non contenere le modifiche apportate alla cartella di lavoro esterna dopo l’ultimo aggiornamento della presentazione.
FAQ
Posso determinare se un grafico specifico è collegato a una cartella di lavoro esterna o incorporata?
Sì. Un grafico dispone di un tipo di origine dati e di un percorso a una cartella di lavoro esterna; se la sorgente è una cartella di lavoro esterna, è possibile leggere il percorso completo per verificare che venga utilizzato un file esterno.
Sono supportati percorsi relativi alle cartelle di lavoro esterne e come vengono memorizzati?
Sì. Se si specifica un percorso relativo, questo viene convertito automaticamente in un percorso assoluto. Ciò è comodo per la portabilità del progetto; tuttavia, il percorso assoluto viene memorizzato nel file PPTX.
Posso usare cartelle di lavoro situate su risorse di rete/condivisioni?
Sì, tali cartelle di lavoro possono essere utilizzate come origine dati esterna. Tuttavia, la modifica diretta di cartelle di lavoro remote da Aspose.Slides non è supportata: possono essere usate solo come sorgente.
Aspose.Slides sovrascrive il file XLSX esterno quando salvo la presentazione?
No. La presentazione memorizza un collegamento al file esterno e lo usa per la lettura dei dati. Il file esterno stesso non viene modificato al salvataggio della presentazione.
Cosa devo fare se il file esterno è protetto da password?
Aspose.Slides non accetta una password durante il collegamento. Un approccio comune è rimuovere la protezione in anticipo o preparare una copia decrittata (ad esempio usando Aspose.Cells) e collegarsi a quella copia.
Più grafici possono fare riferimento alla stessa cartella di lavoro esterna?
Sì. Ogni grafico memorizza il proprio collegamento. Se tutti puntano allo stesso file, l’aggiornamento di quel file verrà riflesso in ciascun grafico al successivo caricamento dei dati.