Gerenciar Pastas de Trabalho de Gráficos em Apresentações Usando JavaScript
Visão geral
Este artigo explica como trabalhar com pastas de trabalho de gráficos no Aspose.Slides. Ele mostra como ler e gravar dados de gráficos por meio de streams de pastas de trabalho, usar células da pasta de trabalho como rótulos de dados do gráfico, acessar coleções de planilhas e especificar o tipo de fonte de dados para os valores do gráfico.
Também cobre o uso de pastas de trabalho externas como fontes de dados para gráficos. Os exemplos demonstram como criar e atribuir uma pasta de trabalho externa, recuperar o caminho de uma pasta de trabalho externa vinculada a um gráfico e editar os dados do gráfico quando a pasta de trabalho está disponível.
Ler e gravar dados de gráfico a partir de uma pasta de trabalho
Aspose.Slides fornece os métodos readWorkbookStream e writeWorkbookStream que permitem ler e gravar pastas de trabalho de dados de gráficos (contendo dados de gráfico editados com Aspose.Cells). Observação que os dados do gráfico precisam estar organizados da mesma forma ou ter uma estrutura semelhante à fonte.
Este código JavaScript demonstra uma operação de exemplo:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
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();
}
}
Validar o layout do gráfico após a modificação da pasta de trabalho
Quando você substitui uma pasta de trabalho incorporada por uma modificada, o gráfico mantém suas coleções originais de séries e categorias. Essa inconsistência pode fazer com que Chart.validateChartLayout falhe com um erro de índice fora do intervalo. Limpe as séries e categorias existentes antes de gravar a pasta de trabalho atualizada de volta no gráfico.
// Após modificar o stream da pasta de trabalho (por exemplo, usando Aspose.Cells)
var updatedWorkbook = chartData.readWorkbookStream();
// Limpar referências de dados existentes.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(updatedWorkbook);
chart.validateChartLayout();
Limpar as coleções garante que a estrutura dos dados do gráfico seja consistente com a nova pasta de trabalho, permitindo que validateChartLayout seja concluído sem erros.
Definir a célula da planilha como rótulo de dados do gráfico
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide através de seu índice.
- Adicione um gráfico de Bolha com alguns dados.
- Acesse as séries do gráfico.
- Defina a célula da pasta de trabalho como um rótulo de dados.
- Salve a apresentação.
Este código JavaScript mostra como definir uma célula da pasta de trabalho como um rótulo de dados do gráfico:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
var lbl0 = "Label 0 cell value";
var lbl1 = "Label 1 cell value";
var lbl2 = "Label 2 cell value";
// Instancia uma classe de apresentação que representa um arquivo de apresentação
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();
}
}
Gerenciar planilhas
Este código JavaScript demonstra uma operação onde o método ChartDataWorkbook.getWorksheets é usado para acessar uma coleção de planilhas:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
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 o tipo de fonte de dados
Este código JavaScript mostra como especificar um tipo para uma fonte de dados:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
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 pasta de trabalho incorporados não suportados
Aspose.Slides não suporta o formato de pasta de trabalho binária do Excel (.xlsb) que pode ser incorporado em alguns gráficos. Você pode usar o método getEmbeddedWorkbookType em ChartData juntamente com a enumeração WorkbookType para detectar formatos não suportados e pular esses gráficos.
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");
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) {
// A pasta de trabalho incorporada está no formato .xlsb, que não é suportado.
continue;
}
// Ler ou modificar os dados da pasta de trabalho do gráfico aqui.
}
} finally {
presentation.dispose();
}
Pasta de trabalho externa
Aspose.Slides suporta pastas de trabalho externas como fonte de dados para gráficos.
Criar pasta de trabalho externa
Usando os métodos readWorkbookStream e setExternalWorkbook, você pode criar uma pasta de trabalho externa do zero ou tornar uma pasta de trabalho interna externa.
Este código JavaScript demonstra o processo de criação da pasta de trabalho externa:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
const fileSystem = require("fs");
var pres = new aspose.slides.Presentation();
try {
var workbookPath = "externalWorkbook1.xlsx";
var chart = pres.getSlides().get_Item(0).getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600);
// readWorkbookStream retorna os bytes da pasta de trabalho como um Buffer do Node.
var workbookData = chart.getChartData().readWorkbookStream();
fileSystem.writeFileSync(workbookPath, Buffer.from(workbookData));
chart.getChartData().setExternalWorkbook(workbookPath);
pres.save("externalWorkbook.pptx", aspose.slides.SaveFormat.Pptx);
} catch (e) {console.log(e);
} finally {
if (pres != null) {
pres.dispose();
}
}
Definir pasta de trabalho externa
Usando o método setExternalWorkbook, você pode atribuir uma pasta de trabalho externa a um gráfico como sua fonte de dados. Esse método também pode ser usado para atualizar o caminho da pasta de trabalho externa (se esta tiver sido movida).
Embora não seja possível editar os dados em pastas de trabalho armazenadas em locais remotos ou recursos, você ainda pode utilizá‑las como fonte de dados externa. Se for fornecido um caminho relativo para uma pasta de trabalho externa, ele será convertido automaticamente para um caminho completo.
Este código JavaScript mostra como definir uma pasta de trabalho externa:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
// Cria uma instância da classe 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();
}
}
O segundo parâmetro do método setExternalWorkbook, updateChartData, especifica se a pasta de trabalho Excel será carregada ou não.
- Quando
updateChartDataé definido comofalse, apenas o caminho da pasta de trabalho é atualizado — os dados do gráfico não serão carregados nem atualizados a partir da pasta de trabalho de destino. Use essa configuração quando a pasta de trabalho de destino não existir ou estiver indisponível. - Quando
updateChartDataé definido comotrue, os dados do gráfico são atualizados a partir da pasta de trabalho de destino.
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
// Cria uma instância da classe 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();
}
}
Obter o caminho da pasta de trabalho fonte de dados externa do gráfico
- Crie uma instância da classe Presentation.
- Obtenha a referência de um slide através de seu índice.
- Crie um objeto para a forma do gráfico.
- Crie um objeto para o tipo de fonte (
ChartDataSourceType) que representa a fonte de dados do gráfico. - Especifique a condição relevante com base no tipo de fonte sendo o mesmo que o tipo de fonte de dados da pasta de trabalho externa.
Este código JavaScript demonstra a operação:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
// Cria uma instância da classe 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();
}
// Salva a apresentação
pres.save("result.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
if (pres != null) {
pres.dispose();
}
}
Editar dados do gráfico
Você pode editar os dados em pastas de trabalho externas da mesma forma que altera o conteúdo de pastas de trabalho internas. Quando uma pasta de trabalho externa não pode ser carregada, uma exceção é lançada.
Este código JavaScript é uma implementação do processo descrito:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
// Cria uma instância da classe 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();
}
}
Recuperar uma pasta de trabalho do cache do gráfico
Se um gráfico usar uma pasta de trabalho externa que esteja ausente ou indisponível, Aspose.Slides pode reconstruir a pasta de trabalho do gráfico a partir dos dados em cache na apresentação. Crie LoadOptions, configure‑as com SpreadsheetOptions, e chame SpreadsheetOptions.setRecoverWorkbookFromChartCache com true antes de abrir a apresentação.
O exemplo JavaScript a seguir abre uma apresentação cujo gráfico referencia uma pasta de trabalho externa indisponível e acessa os dados recuperados através de ChartData.getChartDataWorkbook:
var aspose = aspose || {};
aspose.slides = require("aspose.slides.via.java");
const spreadsheetOptions = new aspose.slides.SpreadsheetOptions();
spreadsheetOptions.setRecoverWorkbookFromChartCache(true);
const loadOptions = new aspose.slides.LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);
const presentation = new aspose.slides.Presentation("presentation.pptx", loadOptions);
try {
const chart = presentation.getSlides().get_Item(0).getShapes().get_Item(0);
const recoveredWorkbook = chart.getChartData().getChartDataWorkbook();
// Leia ou modifique os dados da pasta de trabalho recuperada aqui.
} finally {
presentation.dispose();
}
Se a pasta de trabalho externa estiver indisponível e a recuperação estiver desativada, Aspose.Slides lançará uma exceção. Habilite a recuperação apenas quando o uso dos dados de gráfico em cache for uma alternativa aceitável, pois o cache pode não conter alterações feitas na pasta de trabalho externa após a última atualização da apresentação.
FAQ
Posso determinar se um gráfico específico está vinculado a uma pasta de trabalho externa ou incorporada?
Sim. Um gráfico possui um tipo de fonte de dados e um caminho para uma pasta de trabalho externa; se a fonte for uma pasta de trabalho externa, você pode ler o caminho completo para garantir que um arquivo externo está sendo usado.
Caminhos relativos para pastas de trabalho externas são suportados e como são armazenados?
Sim. Se você especificar um caminho relativo, ele será convertido automaticamente para um caminho absoluto. Isso facilita a portabilidade do projeto; porém, esteja ciente de que a apresentação armazenará o caminho absoluto no arquivo PPTX.
Posso usar pastas de trabalho localizadas em recursos/redes compartilhadas?
Sim, tais pastas de trabalho podem ser usadas como fonte de dados externa. Contudo, editar pastas de trabalho remotas diretamente a partir do Aspose.Slides não é suportado — elas podem ser usadas apenas como fonte.
O Aspose.Slides sobrescreve o XLSX externo ao salvar a apresentação?
Não. A apresentação armazena um link para o arquivo externo e o utiliza para ler os dados. O arquivo externo em si não é modificado quando a apresentação é salva.
O que fazer se o arquivo externo estiver protegido por senha?
Aspose.Slides não aceita senha ao criar o vínculo. Uma abordagem comum é remover a proteção previamente ou preparar uma cópia descriptografada (por exemplo, usando Aspose.Cells) e vincular a essa cópia.
Múltiplos gráficos podem referenciar a mesma pasta de trabalho externa?
Sim. Cada gráfico armazena seu próprio link. Se todos apontarem para o mesmo arquivo, a atualização desse arquivo será refletida em cada gráfico na próxima vez que os dados forem carregados.