Gestionar libros de trabajo de gráficos en presentaciones en Android
Descripción general
Este artículo explica cómo trabajar con libros de trabajo de gráficos en Aspose.Slides. Muestra cómo leer y escribir datos de gráficos a través de flujos de libros de trabajo, usar celdas de libro como etiquetas de datos del gráfico, acceder a colecciones de hojas de cálculo y especificar el tipo de origen de datos para los valores del gráfico.
También cubre el trabajo con libros de trabajo externos como fuentes de datos de gráficos. Los ejemplos demuestran cómo crear y asignar un libro de trabajo externo, obtener la ruta de un libro de trabajo externo enlazado a un gráfico y editar los datos del gráfico cuando el libro está disponible.
Para celdas de libro que representan datos ausentes, consulte Controlar la visualización de celdas vacías para ver la diferencia entre una celda vacía y cero, y una comparación de gráfico de líneas de los modos de visualización disponibles.
Leer y escribir datos de gráficos desde un libro de trabajo
Aspose.Slides proporciona los métodos ReadWorkbookStream y WriteWorkbookStream que le permiten leer y escribir libros de trabajo con datos de gráficos (que contienen datos de gráficos editados con Aspose.Cells). Nota que los datos del gráfico deben organizarse de la misma manera o tener una estructura similar a la del origen.
Este código Java muestra una operación de ejemplo:
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();
}
Validar el diseño del gráfico después de modificar el libro de trabajo
Al reemplazar un libro de trabajo incrustado por uno modificado, el gráfico conserva sus colecciones originales de series y categorías. Esta incoherencia puede provocar que IChart.validateChartLayout falle con un error de índice fuera de rango. Vacíe las series y categorías existentes antes de escribir el libro de trabajo actualizado de nuevo en el gráfico.
// Después de modificar el flujo del libro de trabajo (p.ej., usando Aspose.Cells)
byte[] updatedWorkbook = chartData.readWorkbookStream();
// Eliminar referencias de datos existentes.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(updatedWorkbook);
chart.validateChartLayout();
Vaciar las colecciones garantiza que la estructura de datos del gráfico sea coherente con el nuevo libro de trabajo, lo que permite que validateChartLayout se complete sin errores.
Establecer una celda de libro de trabajo como etiqueta de datos del gráfico
- Cree una instancia de la clase Presentation .
- Obtenga una referencia a una diapositiva mediante su índice.
- Añada un gráfico de burbujas con algunos datos.
- Acceda a la serie del gráfico.
- Establezca la celda del libro de trabajo como etiqueta de datos.
- Guarde la presentación.
Este código Java muestra cómo establecer una celda de libro de trabajo como etiqueta de datos del gráfico:
// Instancia una clase de presentación que representa un archivo de presentación
import com.aspose.slides.*;
String lbl0 = "Label 0 cell value";
String lbl1 = "Label 1 cell value";
String lbl2 = "Label 2 cell value";
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();
}
Gestionar hojas de cálculo
Este código Java muestra una operación donde se utiliza el método IChartDataWorkbook.Worksheets para acceder a una colección de hojas de cálculo:
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();
}
Especificar el tipo de origen de datos
Este código Java muestra cómo especificar un tipo para un origen de datos:
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();
}
Detectar formatos de libro de trabajo incrustado no compatibles
Aspose.Slides no admite el formato de libro de trabajo binario de Excel (.xlsb) que puede estar incrustado en algunos gráficos. Puede usar el método getEmbeddedWorkbookType en IChartData junto con la enumeración WorkbookType para detectar formatos no compatibles y omitir esos gráficos.
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) {
// El libro de trabajo incrustado está en formato .xlsb, que no es compatible.
continue;
}
// Leer o modificar los datos del libro de trabajo del gráfico aquí.
}
} finally {
presentation.dispose();
}
Libro de trabajo externo
Aspose.Slides admite el uso de libros de trabajo externos como fuente de datos para los gráficos.
Crear un libro de trabajo externo
Usando los métodos readWorkbookStream y setExternalWorkbook, puede crear un libro de trabajo externo desde cero o convertir un libro de trabajo interno en externo.
Este código Java muestra el proceso de creación del libro de trabajo externo:
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();
}
Establecer un libro de trabajo externo
Con el método setExternalWorkbook, puede asignar un libro de trabajo externo a un gráfico como su fuente de datos. Este método también permite actualizar la ruta al libro de trabajo externo (si este se ha movido).
Aunque no puede editar los datos en libros de trabajo almacenados en ubicaciones o recursos remotos, puede utilizarlos como fuente de datos externa. Si se proporciona una ruta relativa para un libro de trabajo externo, se convierte automáticamente en una ruta completa.
Este código Java muestra cómo establecer un libro de trabajo externo:
import com.aspose.slides.*;
// Crea una instancia de la clase 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();
}
El parámetro updateChartData (ubicado bajo el método setExternalWorkbook) se usa para especificar si se cargará o no un libro de Excel.
- Cuando el valor de
updateChartDatase establece enfalse, solo se actualiza la ruta del libro de trabajo; los datos del gráfico no se cargarán ni se actualizarán desde el libro de trabajo de destino. Esta configuración es útil cuando el libro de trabajo de destino no existe o no está disponible. - Cuando el valor de
updateChartDatase establece entrue, los datos del gráfico se actualizan a partir del libro de trabajo de destino.
import com.aspose.slides.*;
// Crea una instancia de la clase 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();
}
Obtener la ruta del libro de trabajo de origen de datos externo de un gráfico
- Cree una instancia de la clase Presentation .
- Obtenga una referencia a una diapositiva mediante su índice.
- Cree un objeto para la forma del gráfico.
- Cree un objeto para el tipo de origen (
ChartDataSourceType) que representa el origen de datos del gráfico. - Especifique la condición pertinente basándose en que el tipo de origen sea el mismo que el tipo de origen de datos del libro de trabajo externo.
Este código Java demuestra la operación:
import com.aspose.slides.*;
// Crea una instancia de la clase 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();
}
// Guarda la presentación
pres.save("result.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Editar datos del gráfico
Puede editar los datos en libros de trabajo externos de la misma manera que modifica el contenido de libros de trabajo internos. Cuando no se puede cargar un libro de trabajo externo, se lanza una excepción.
Este código Java es una implementación del proceso descrito:
import com.aspose.slides.*;
// Crea una instancia de la clase 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();
}
Recuperar un libro de trabajo de la caché del gráfico
Si un gráfico usa un libro de trabajo externo que falta o no está disponible, Aspose.Slides puede reconstruir el libro de trabajo del gráfico a partir de los datos almacenados en caché en la presentación. Cree LoadOptions, configúrelo con SpreadsheetOptions, y llame a ISpreadsheetOptions.setRecoverWorkbookFromChartCache con true antes de abrir la presentación.
El siguiente ejemplo Java abre una presentación cuyo gráfico hace referencia a un libro de trabajo externo no disponible y accede a los datos recuperados mediante IChart.getChartData y 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();
// Leer o modificar los datos del libro de trabajo recuperado aquí.
} finally {
presentation.dispose();
}
Si el libro de trabajo externo no está disponible y la recuperación está desactivada, Aspose.Slides lanza una excepción. Active la recuperación solo cuando el uso de los datos de gráfico en caché sea una alternativa aceptable, ya que la caché podría no contener los cambios realizados en el libro de trabajo externo después de la última actualización de la presentación.
Preguntas frecuentes
¿Puedo determinar si un gráfico concreto está vinculado a un libro de trabajo externo o incrustado?
Sí. Un gráfico tiene un tipo de origen de datos y una ruta a un libro de trabajo externo; si el origen es un libro de trabajo externo, puede leer la ruta completa para asegurarse de que se está utilizando un archivo externo.
¿Se admiten rutas relativas a libros de trabajo externos y cómo se almacenan?
Sí. Si especifica una ruta relativa, se convierte automáticamente en una ruta absoluta. Esto es conveniente para la portabilidad del proyecto; sin embargo, tenga en cuenta que la presentación almacenará la ruta absoluta en el archivo PPTX.
¿Puedo usar libros de trabajo ubicados en recursos/redes compartidas?
Sí, dichos libros de trabajo pueden usarse como fuente de datos externa. No obstante, la edición directa de libros de trabajo remotos desde Aspose.Slides no está soportada; solo pueden emplearse como origen.
¿Aspose.Slides sobrescribe el XLSX externo al guardar la presentación?
No. La presentación almacena un enlace al archivo externo y lo utiliza para leer los datos. El archivo externo no se modifica al guardar la presentación.
¿Qué debo hacer si el archivo externo está protegido con contraseña?
Aspose.Slides no acepta una contraseña al enlazar. Una práctica común es eliminar la protección con antelación o preparar una copia sin cifrar (por ejemplo, usando Aspose.Cells) y enlazar a esa copia.
¿Pueden varios gráficos referenciar el mismo libro de trabajo externo?
Sí. Cada gráfico almacena su propio enlace. Si todos apuntan al mismo archivo, la actualización de ese archivo se reflejará en cada gráfico la próxima vez que se carguen los datos.