Gestionar libros de trabajo de gráficos en presentaciones usando JavaScript
Visió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 de trabajo como etiquetas de datos de gráficos, 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 vinculado a un gráfico y editar los datos del gráfico cuando el libro de trabajo está disponible.
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 de 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 fuente.
Este código JavaScript muestra una operación de ejemplo:
var pres = new aspose.slides.Presentation("chart.pptx");
try {
var chart = pres.getSlides().get_Item(0).getShapes().get_Item(0);
var data = chart.getChartData();
var stream = data.readWorkbookStream();
data.getSeries().clear();
data.getCategories().clear();
data.writeWorkbookStream(stream);
} finally {
if (pres != null) {
pres.dispose();
}
}
Establecer WorkBook Cell como Chart DataLabel
- Crear una instancia de la clase Presentation.
- Obtener la referencia de una diapositiva mediante su índice.
- Agregar un gráfico de burbujas con algunos datos.
- Acceder a la serie del gráfico.
- Establecer la celda del libro de trabajo como una etiqueta de datos.
- Guardar la presentación.
Este código JavaScript le muestra cómo establecer una celda del libro de trabajo como etiqueta de datos del gráfico:
var lbl0 = "Label 0 cell value";
var lbl1 = "Label 1 cell value";
var lbl2 = "Label 2 cell value";
// Instancia una clase de presentación que representa un archivo de presentación
var pres = new aspose.slides.Presentation("chart2.pptx");
try {
var slide = pres.getSlides().get_Item(0);
var chart = slide.getShapes().addChart(aspose.slides.ChartType.Bubble, 50, 50, 600, 400, true);
var series = chart.getChartData().getSeries();
var dataLabelCollection = series.get_Item(0).getLabels();
dataLabelCollection.getDefaultDataLabelFormat().setShowLabelValueFromCell(true);
var 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", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
Administrar hojas de cálculo
Este código JavaScript demuestra una operación donde se utiliza el método ChartDataWorkbook.getWorksheets para acceder a una colección de hojas de cálculo:
var pres = new aspose.slides.Presentation();
try {
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 500);
var wb = chart.getChartData().getChartDataWorkbook();
for (var i = 0; i < wb.getWorksheets().size(); i++) {
console.log(wb.getWorksheets().get_Item(i).getName());
}
} finally {
if (pres != null) {
pres.dispose();
}
}
Especificar el tipo de origen de datos
Este código JavaScript le muestra cómo especificar un tipo para un origen de datos:
var pres = new aspose.slides.Presentation();
try {
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Column3D, 50, 50, 600, 400, true);
var val = chart.getChartData().getSeries().get_Item(0).getName();
val.setDataSourceType(aspose.slides.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", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
Detectar formatos de libros de trabajo incrustados no compatibles
Aspose.Slides no admite el formato de libro de trabajo binario de Excel (.xlsb) que puede incrustarse en algunos gráficos. Puede usar el método getEmbeddedWorkbookType en ChartData junto con la enumeración WorkbookType para detectar formatos no compatibles y omitir esos gráficos.
let presentation = new aspose.slides.Presentation("sample.pptx");
try {
let slide = presentation.getSlides().get_Item(0);
let shapes = slide.getShapes();
for (let shapeIndex = 0; shapeIndex < shapes.size(); shapeIndex++) {
let shape = shapes.get_Item(shapeIndex);
if (!java.instanceOf(shape, "com.aspose.slides.IChart")) continue;
let chart = shape;
let chartData = chart.getChartData();
if (chartData.getDataSourceType() == aspose.slides.ChartDataSourceType.InternalWorkbook &&
chartData.getEmbeddedWorkbookType() == aspose.slides.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 libros de trabajo externos como fuente de datos para gráficos.
Crear 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 JavaScript demuestra el proceso de creación del libro de trabajo externo:
var pres = new aspose.slides.Presentation();
try {
final var workbookPath = "externalWorkbook1.xlsx";
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600);
var fileStream = java.newInstanceSync("java.io.FileOutputStream", workbookPath);
try {
var workbookData = chart.getChartData().readWorkbookStream();
fileStream.write(workbookData, 0, workbookData.length);
} finally {
if (fileStream != null) {
fileStream.close();
}
}
chart.getChartData().setExternalWorkbook(workbookPath);
pres.save("externalWorkbook.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
if (pres != null) {
pres.dispose();
}
}
Establecer libro de trabajo externo
Usando 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 puede usarse para actualizar la ruta al libro de trabajo externo (si éste se ha movido).
Aunque no puede editar los datos en libros de trabajo almacenados en ubicaciones o recursos remotos, aún 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 JavaScript le muestra cómo establecer un libro de trabajo externo:
// Crea una instancia de la clase Presentation
var pres = new aspose.slides.Presentation("chart.pptx");
try {
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600, false);
var chartData = chart.getChartData();
chartData.setExternalWorkbook("externalWorkbook.xlsx");
chartData.getSeries().add(chartData.getChartDataWorkbook().getCell(0, "B1"), aspose.slides.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", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
El parámetro ChartData (en el método setExternalWorkbook) se usa para especificar si se cargará o no un libro de trabajo de Excel.
- Cuando el valor de
ChartDatase 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. Puede usar esta configuración cuando el libro de trabajo de destino no exista o no esté disponible. - Cuando el valor de
ChartDatase establece entrue, los datos del gráfico se actualizan desde el libro de trabajo de destino.
// Crea una instancia de la clase Presentation
var pres = new aspose.slides.Presentation("chart.pptx");
try {
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600, true);
var chartData = chart.getChartData();
chartData.setExternalWorkbook("http://path/doesnt/exists", false);
pres.save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
Obtener la ruta del libro de trabajo externo de origen de datos del gráfico
- Crear una instancia de la clase Presentation.
- Obtener la referencia de una diapositiva mediante su índice.
- Crear un objeto para la forma del gráfico.
- Crear un objeto para el tipo de origen (
ChartDataSourceType) que representa la fuente de datos del gráfico. - Especificar la condición pertinente según que el tipo de origen sea el mismo que el tipo de fuente de datos del libro de trabajo externo.
Este código JavaScript demuestra la operación:
// Crea una instancia de la clase Presentation
var pres = new aspose.slides.Presentation("chart.pptx");
try {
var slide = pres.getSlides().get_Item(1);
var chart = slide.getShapes().get_Item(0);
var sourceType = chart.getChartData().getDataSourceType();
if (sourceType == aspose.slides.ChartDataSourceType.ExternalWorkbook) {
var path = chart.getChartData().getExternalWorkbookPath();
}
// Guarda la presentación
pres.save("result.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
Editar datos del gráfico
Puede editar los datos en libros de trabajo externos del mismo modo que modifica el contenido de los libros de trabajo internos. Cuando no se puede cargar un libro de trabajo externo, se lanza una excepción.
Este código JavaScript es una implementación del proceso descrito:
// Crea una instancia de la clase Presentation
var pres = new aspose.slides.Presentation("chart.pptx");
try {
var chart = pres.getSlides().get_Item(0).getShapes().get_Item(0);
var chartData = chart.getChartData();
chartData.getSeries().get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell().setValue(100);
pres.save("presentation_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
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 la fuente 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; no obstante, tenga en cuenta que la presentación almacenará la ruta absoluta en el archivo PPTX.
¿Puedo usar libros de trabajo ubicados en recursos o comparticiones de red?
Sí, esos libros de trabajo pueden usarse como fuente de datos externa. Sin embargo, la edición directa de libros de trabajo remotos desde Aspose.Slides no está soportada; solo pueden usarse como fuente.
¿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 crear el vínculo. Un enfoque habitual es eliminar la protección con antelación o preparar una copia descifrada (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.