Quản lý Workbook biểu đồ trong bản trình chiếu bằng Java
Tổng quan
Bài viết này giải thích cách làm việc với workbook biểu đồ trong Aspose.Slides. Nó cho thấy cách đọc và ghi dữ liệu biểu đồ thông qua các luồng workbook, sử dụng các ô workbook làm nhãn dữ liệu biểu đồ, truy cập bộ sưu tập worksheet và chỉ định kiểu nguồn dữ liệu cho các giá trị biểu đồ.
Nó cũng đề cập đến việc làm việc với workbook bên ngoài như nguồn dữ liệu cho biểu đồ. Các ví dụ minh họa cách tạo và gán một workbook bên ngoài, lấy đường dẫn của workbook bên ngoài được liên kết với biểu đồ, và chỉnh sửa dữ liệu biểu đồ khi workbook có sẵn.
Đối với các ô workbook đại diện cho dữ liệu thiếu, xem Kiểm soát việc hiển thị các ô trống để biết sự khác nhau giữa ô trống và số 0, và so sánh biểu đồ đường của các chế độ hiển thị có sẵn.
Bao gồm dữ liệu từ các hàng và cột ẩn
Sử dụng IChart.setPlotVisibleCellsOnly để kiểm soát liệu biểu đồ có vẽ dữ liệu từ các hàng và cột worksheet ẩn hay không. Đặt nó thành true để chỉ vẽ các ô hiển thị, hoặc false để bao gồm cả ô hiển thị và ô ẩn. Cài đặt này chỉ điều khiển việc vẽ biểu đồ; nó không ẩn hoặc hiện lại các hàng hoặc cột worksheet.
bản trình chiếu mẫu chứa một biểu đồ cột làm hình dạng đầu tiên trên slide đầu tiên. Worksheet được nhúng, Sheet1, chứa phạm vi nguồn sau, A1:C4. Hàng 3 và cột C bị ẩn, nhưng các ô của chúng vẫn chứa giá trị.
| Hàng worksheet | A: Tháng | B: Bán lẻ | C: Bán buôn (cột ẩn) |
|---|---|---|---|
| 2 | Tháng 1 | 10 | 30 |
| 3 (hàng ẩn) | Tháng 2 | 40 | 60 |
| 4 | Tháng 3 | 20 | 50 |
Truy cập các ô nguồn qua IChartData.getChartDataWorkbook và đọc IChartDataCell.isHidden để kiểm tra trạng thái ẩn của chúng. Phương thức này báo cáo trạng thái ẩn mà không thay đổi nó. Trong tệp này, B2 hiển thị, B3 thuộc hàng ẩn, và C2 thuộc cột ẩn; ví dụ in ra false, true, và true tương ứng.
Đối với ví dụ này, làm mới dữ liệu biểu đồ sau khi thay đổi cài đặt vẽ: giữ workbook được nhúng bằng readWorkbookStream và tải lại bằng writeWorkbookStream. Khi bao gồm tất cả các ô, cũng dùng setRange để khôi phục phạm vi đầy đủ, bao gồm danh mục tháng 2 bị ẩn. Chỉ thay đổi cờ không đủ để làm mới dữ liệu biểu đồ và nhãn danh mục đã được lưu trong ví dụ này.
import com.aspose.slides.*;
Presentation presentation = new Presentation("hidden-source-data.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
System.out.println("B2 hidden: " + workbook.getCell(0, "B2").isHidden());
System.out.println("B3 hidden: " + workbook.getCell(0, "B3").isHidden());
System.out.println("C2 hidden: " + workbook.getCell(0, "C2").isHidden());
byte[] workbookData = chart.getChartData().readWorkbookStream();
for (boolean visibleOnly : new boolean[] { true, false }) {
chart.setPlotVisibleCellsOnly(visibleOnly);
// Làm mới dữ liệu biểu đồ từ workbook được nhúng.
chart.getChartData().writeWorkbookStream(workbookData);
if (!visibleOnly) {
// Khôi phục toàn bộ phạm vi nguồn, bao gồm các danh mục ẩn.
chart.getChartData().setRange("Sheet1!$A$1:$C$4");
}
presentation.save("hidden_cells_" + visibleOnly + ".pptx", SaveFormat.Pptx);
}
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Ví dụ lưu hai phiên bản của bản trình chiếu: một chỉ có các giá trị Bán lẻ hiển thị (10 và 20), và một nữa có tất cả sáu giá trị. Các hình ảnh dưới minh họa hai chế độ vẽ. Hàng 3 và cột C vẫn ẩn trong cả hai workbook được nhúng.
Chỉ các ô hiển thị (true) |
Tất cả các ô (false) |
|---|---|
![]() |
![]() |
Một ô ẩn chứa giá trị khác với một ô trống. IChart.setDisplayBlanksAs kiểm soát cách các giá trị thiếu được hiển thị; nó không bao gồm hoặc loại trừ dữ liệu nguồn ẩn. Xem Kiểm soát việc hiển thị các ô trống để biết một ví dụ.
Truy xuất phạm vi dữ liệu của biểu đồ
Trước khi cập nhật dữ liệu workbook trong một bản trình chiếu hiện có, kiểm tra các phạm vi nguồn để xác định ô worksheet nào mỗi biểu đồ sử dụng. Phương thức IChartData.getRange trả về phạm vi dữ liệu hiện tại dưới dạng công thức có chỉ định worksheet, chẳng hạn Sheet1!$A$1:$D$5. Ở đây, Sheet1 là tên worksheet, ! tách nó khỏi phạm vi ô, và $A$1:$D$5 xác định các ô từ A1 đến D5, bao gồm cả. Dấu $ chỉ các tham chiếu hàng và cột tuyệt đối.
Phương thức này đọc phạm vi hiện tại mà không thay đổi biểu đồ hoặc workbook của nó. Nếu biểu đồ không sử dụng workbook làm nguồn dữ liệu, nó sẽ ném InvalidOperationException. Để biết thêm thông tin, xem Tham chiếu API ChartData.
Ví dụ này mở một bản trình chiếu và kiểm tra các hình dạng trực tiếp trên mỗi slide để tìm biểu đồ. Nó in ra tên mỗi biểu đồ và phạm vi nguồn. Nếu một biểu đồ không sử dụng workbook, nó sẽ in thông báo và tiếp tục với biểu đồ tiếp theo.
import com.aspose.slides.*;
import com.aspose.slides.exceptions.InvalidOperationException;
Presentation presentation = new Presentation("presentation.pptx");
try {
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
if (shape instanceof IChart) {
IChart chart = (IChart) shape;
try {
String range = chart.getChartData().getRange();
System.out.println(chart.getName() + ": " + range);
} catch (InvalidOperationException exception) {
System.out.println(chart.getName() + ": The chart does not use a workbook as its data source.");
}
}
}
}
} finally {
presentation.dispose();
}
Đọc và ghi dữ liệu biểu đồ từ một workbook
Aspose.Slides for Java cung cấp các phương thức readWorkbookStream và writeWorkbookStream cho phép bạn đọc và ghi workbook dữ liệu biểu đồ (chứa dữ liệu biểu đồ đã được chỉnh sửa bằng Aspose.Cells). Lưu ý rằng dữ liệu biểu đồ phải được tổ chức theo cùng cách hoặc phải có cấu trúc tương tự nguồn.
Ví dụ này sử dụng một bản trình chiếu có biểu đồ làm hình dạng đầu tiên trên slide đầu tiên. Nó đọc workbook được nhúng vào một mảng byte, xóa các series và category hiện có, và ghi lại cùng một workbook. Các thay đổi vẫn ở trong bộ nhớ; ví dụ không lưu bản trình chiếu.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
byte[] workbookData = chartData.readWorkbookStream();
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Xác thực bố cục biểu đồ sau khi sửa đổi workbook
Khi bạn thay thế một workbook được nhúng bằng một workbook đã chỉnh sửa, biểu đồ vẫn giữ các bộ sưu tập series và category ban đầu. Sự không khớp này có thể khiến IChart.validateChartLayout thất bại với lỗi chỉ số ngoài phạm vi. Xóa các series và category hiện có trước khi ghi lại workbook đã cập nhật vào biểu đồ. Ví dụ này sử dụng một biểu đồ là hình dạng đầu tiên trên slide đầu tiên. Bình luận đánh dấu vị trí sẽ thực hiện việc chỉnh sửa workbook; ví dụ chạy được sẽ ghi lại workbook gốc và xác thực bố cục trong bộ nhớ.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
byte[] workbookData = chartData.readWorkbookStream();
// Sửa đổi các byte của workbook ở đây, ví dụ, sử dụng Aspose.Cells.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
chart.validateChartLayout();
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Xóa các bộ sưu tập sẽ loại bỏ các tham chiếu dữ liệu cũ trước khi workbook được ghi lại. Tái xây dựng bất kỳ ánh xạ series và category cần thiết cho workbook đã cập nhật trước khi sử dụng biểu đồ.
Đặt định dạng số tùy chỉnh cho các ô workbook
Sử dụng IChartDataCell.setCustomNumberFormat để kiểm soát cách các giá trị số hiển thị trong workbook được nhúng của biểu đồ. Ví dụ, một báo cáo có thể cần tỷ lệ chuyển đổi hiển thị dưới dạng phần trăm với bốn chữ số thập phân và một hệ số hiển thị với năm chữ số thập phân. Giữ cả hai giá trị dưới dạng số để chúng vẫn có thể dùng cho các phép tính và vẽ biểu đồ.
Định dạng số chỉ thay đổi cách hiển thị, không thay đổi giá trị đã lưu. Định dạng 0.0000% hiển thị 0.125 dưới dạng 12.5000%; nó không thay thế số đã lưu bằng 12.5. Tương tự, 0.00000 hiển thị 0.1234567 dưới dạng 0.12346 mà không làm tròn giá trị đã lưu. Nếu định dạng tùy chỉnh là một chuỗi rỗng (""), định dạng trả về bởi getPresetNumberFormat sẽ được sử dụng thay thế.
Ví dụ sau tạo một biểu đồ cột và truy cập các ô của nó qua getChartDataWorkbook. Trên worksheet 0, B2 chứa tỷ lệ chuyển đổi và C2 chứa hệ số. Cả hai ô đều cung cấp giá trị cho biểu đồ. Ví dụ cũng bật nhãn giá trị được liên kết với định dạng nguồn.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
presentation.getSlideSize().setSize(720, 270, SlideSizeScaleType.DoNotScale);
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 20, 620, 210);
chart.setTitle(false);
chart.getAxes().getVerticalAxis().setNumberFormatLinkedToSource(false);
chart.getAxes().getVerticalAxis().setNumberFormat("0.00");
chart.getAxes().getVerticalAxis().setAutomaticMinValue(false);
chart.getAxes().getVerticalAxis().setMinValue(0);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartDataCell categoryCell = workbook.getCell(0, "A2", "Sample");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell percentageCell = workbook.getCell(0, "B2", 0.125);
percentageCell.setCustomNumberFormat("0.0000%");
IChartDataCell percentageName = workbook.getCell(0, "B1", "Conversion rate");
IChartSeries percentageSeries = chart.getChartData().getSeries().add(percentageName, chart.getType());
percentageSeries.getDataPoints().addDataPointForBarSeries(percentageCell);
IChartDataCell precisionCell = workbook.getCell(0, "C2", 0.1234567);
precisionCell.setCustomNumberFormat("0.00000");
IChartDataCell precisionName = workbook.getCell(0, "C1", "Coefficient");
IChartSeries precisionSeries = chart.getChartData().getSeries().add(precisionName, chart.getType());
precisionSeries.getDataPoints().addDataPointForBarSeries(precisionCell);
for (IChartSeries series : chart.getChartData().getSeries()) {
IDataLabelFormat labelFormat = series.getDataPoints().get_Item(0).getLabel().getDataLabelFormat();
labelFormat.setShowValue(true);
labelFormat.setNumberFormatLinkedToSource(true);
}
presentation.save("CustomCellFormats.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Định dạng ô workbook tách riêng khỏi các định dạng được đặt trực tiếp trên trục biểu đồ hoặc nhãn dữ liệu. Trong ví dụ này, mỗi nhãn hiển thị giá trị của ô nguồn vì setShowValue được đặt thành true, và tuân theo định dạng số nguồn vì setNumberFormatLinkedToSource được đặt thành true. Sau khi lưu và mở lại bản trình chiếu, các nhãn hiển thị 12.5000% và 0.12346, như minh họa bên dưới. Trục dọc sử dụng định dạng số riêng, được gán bằng setNumberFormat là 0.00, với setNumberFormatLinkedToSource đặt thành false.
Để định dạng một nhãn dữ liệu một cách độc lập, đặt cờ liên kết nguồn của nó thành false và gán định dạng bằng setNumberFormat. Điều này không thay đổi định dạng của ô workbook. Ví dụ, một định dạng nhãn độc lập 0.00 sẽ hiển thị giá trị đầu tiên là 0.13, trong khi B2 vẫn hiển thị 12.5000%. Xem Nhãn dữ liệu biểu đồ để biết cách định dạng nhãn trực tiếp.
Hình ảnh dưới đây được tạo từ bản trình chiếu đã lưu sau khi mở lại:

Đặt một ô workbook làm nhãn dữ liệu biểu đồ
Bạn có thể sử dụng văn bản từ các ô workbook làm nhãn dữ liệu biểu đồ.
Ví dụ này thêm một biểu đồ bong bóng với dữ liệu mặc định vào slide đầu tiên của một bản trình chiếu hiện có. Nó sử dụng các ô A10:A12 trên worksheet 0 cho ba nhãn đầu tiên trong series đầu tiên, bật nhãn từ ô, và lưu bản trình chiếu đã cập nhật.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart2.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, true);
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
series.getLabels().getDefaultDataLabelFormat().setShowLabelValueFromCell(true);
series.getLabels().get_Item(0).setValueFromCell(workbook.getCell(0, "A10", "Label 0 cell value"));
series.getLabels().get_Item(1).setValueFromCell(workbook.getCell(0, "A11", "Label 1 cell value"));
series.getLabels().get_Item(2).setValueFromCell(workbook.getCell(0, "A12", "Label 2 cell value"));
presentation.save("resultchart.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Quản lý Worksheet
Phương thức IChartDataWorkbook.getWorksheets cung cấp quyền truy cập vào các worksheet trong một workbook biểu đồ. Ví dụ này tạo một biểu đồ tròn với dữ liệu mặc định và in tên mỗi worksheet ra console.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 500);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
for (int i = 0; i < workbook.getWorksheets().size(); i++) {
System.out.println(workbook.getWorksheets().get_Item(i).getName());
}
} finally {
presentation.dispose();
}
Chỉ định kiểu nguồn dữ liệu
Giá trị điểm series cũng có thể được lưu trực tiếp dưới dạng các số nguyên. Xem Đặt giá trị series bằng các số nguyên để xem ví dụ đầy đủ về việc lưu và đọc chúng. Kiểu nguồn của các giá trị điểm tách biệt với cấu hình workbook nội bộ hoặc bên ngoài của biểu đồ; việc dùng các số nguyên không tự động loại bỏ workbook được nhúng.
Ví dụ này tạo một biểu đồ cột 3D với dữ liệu mặc định và đặt hai tên series bằng các nguồn dữ liệu khác nhau. Tên đầu tiên dùng chuỗi nguyên thủy; tên thứ hai dùng ô C1 trên worksheet 0. Phân loại DataSourceType chọn nguồn cho mỗi tên. Ví dụ lưu bản trình chiếu với các tên series đã cập nhật.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, true);
IStringChartValue literalName = chart.getChartData().getSeries().get_Item(0).getName();
literalName.setDataSourceType(DataSourceType.StringLiterals);
literalName.setData("LiteralString");
IStringChartValue cellName = chart.getChartData().getSeries().get_Item(1).getName();
IChartDataCell nameCell = chart.getChartData().getChartDataWorkbook().getCell(0, "C1", "NewCell");
cellName.setDataSourceType(DataSourceType.Worksheet);
cellName.setData(nameCell);
presentation.save("pres.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Phát hiện các định dạng workbook nhúng không được hỗ trợ
Aspose.Slides không hỗ trợ định dạng workbook Excel nhị phân (.xlsb) có thể được nhúng trong một số biểu đồ. Bạn có thể dùng phương thức getEmbeddedWorkbookType trên IChartData cùng với phân loại WorkbookType để phát hiện các định dạng không được hỗ trợ và bỏ qua những biểu đồ đó. Ví dụ này kiểm tra các hình dạng trên slide đầu tiên của một bản trình chiếu hiện có, bỏ qua các hình dạng không phải biểu đồ, và in thông báo chuẩn đoán cho mỗi biểu đồ có workbook .xlsb được nhúng.
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();
boolean isInternalWorkbook = chartData.getDataSourceType() == ChartDataSourceType.InternalWorkbook;
boolean isBinaryMacro = chartData.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro;
if (isInternalWorkbook && isBinaryMacro) {
System.out.println("Skipping a chart with an unsupported .xlsb workbook.");
continue;
}
// Đọc hoặc chỉnh sửa dữ liệu workbook biểu đồ được hỗ trợ ở đây.
}
} finally {
presentation.dispose();
}
Workbook bên ngoài
Aspose.Slides hỗ trợ sử dụng workbook bên ngoài làm nguồn dữ liệu cho biểu đồ.
Tạo một Workbook bên ngoài
Sử dụng readWorkbookStream và setExternalWorkbook để xuất workbook biểu đồ được nhúng ra file và liên kết biểu đồ với workbook bên ngoài đó.
Ví dụ này tạo một biểu đồ tròn với dữ liệu mặc định và xuất workbook của nó. Nó hoàn thành việc ghi file trước khi gán workbook bên ngoài làm nguồn dữ liệu cho biểu đồ, sau đó lưu bản trình chiếu đã liên kết.
import com.aspose.slides.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600);
Path workbookPath = Paths.get("externalWorkbook1.xlsx").toAbsolutePath();
byte[] workbookData = chart.getChartData().readWorkbookStream();
try {
Files.write(workbookPath, workbookData);
chart.getChartData().setExternalWorkbook(workbookPath.toString());
presentation.save("externalWorkbook.pptx", SaveFormat.Pptx);
} catch (IOException exception) {
System.out.println("Could not write the external workbook: " + exception.getMessage());
}
} finally {
presentation.dispose();
}
Đặt một Workbook bên ngoài
Bằng cách sử dụng phương thức setExternalWorkbook, bạn có thể gán một workbook bên ngoài cho biểu đồ như nguồn dữ liệu của nó. Phương thức này cũng có thể được dùng để cập nhật đường dẫn tới workbook bên ngoài (nếu workbook đã được di chuyển).
Mặc dù bạn không thể chỉnh sửa dữ liệu trong các workbook lưu trữ ở vị trí từ xa hoặc tài nguyên, bạn vẫn có thể dùng các workbook đó làm nguồn dữ liệu bên ngoài. Nếu cung cấp đường dẫn tương đối cho một workbook bên ngoài, nó sẽ tự động được chuyển thành đường dẫn tuyệt đối.
Ví dụ này sử dụng một workbook bên ngoài có worksheet tên Sheet1 chứa tên series ở B1, tên danh mục ở A2:A4, và các giá trị số ở B2:B4. Ví dụ tạo một biểu đồ tròn, liên kết workbook, và dùng setRange để ánh xạ A1:B4 thành một series và ba danh mục. Nó lưu bản trình chiếu với biểu đồ đã liên kết.
import com.aspose.slides.*;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
IChartData chartData = chart.getChartData();
String workbookPath = Paths.get("externalWorkbook.xlsx").toAbsolutePath().toString();
chartData.setExternalWorkbook(workbookPath);
chartData.setRange("Sheet1!$A$1:$B$4");
presentation.save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Tham số updateChartData của setExternalWorkbook kiểm soát việc tải workbook hay không.
- Khi
updateChartDatalàfalse, chỉ đường dẫn workbook được cập nhật. Dữ liệu biểu đồ không được tải hoặc cập nhật từ workbook mục tiêu, vì vậy workbook có thể không có sẵn. - Khi
updateChartDatalàtrue, dữ liệu biểu đồ được cập nhật từ workbook mục tiêu.
Ví dụ sau gán một URL placeholder với updateChartData đặt thành false. Nó giữ dữ liệu mặc định của biểu đồ tròn và lưu bản trình chiếu mà không tải workbook không có sẵn.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
chart.getChartData().setExternalWorkbook("https://example.com/unavailable-workbook.xlsx", false);
presentation.save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Lấy đường dẫn Workbook nguồn dữ liệu bên ngoài của một biểu đồ
Để xác định workbook được liên kết với một biểu đồ, kiểm tra xem biểu đồ có sử dụng nguồn dữ liệu bên ngoài hay không và lấy đường dẫn workbook của nó.
Ví dụ này kiểm tra hình dạng đầu tiên trên slide đầu tiên của một bản trình chiếu có workbook bên ngoài được liên kết. Nếu đó là một biểu đồ được liên kết với workbook bên ngoài, ví dụ in getExternalWorkbookPath lên console. Sau đó nó lưu một bản sao của bản trình chiếu.
import com.aspose.slides.*;
Presentation presentation = new Presentation("externalWorkbook.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
if (slide.getShapes().size() > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
if (chartData.getDataSourceType() == ChartDataSourceType.ExternalWorkbook) {
System.out.println(chartData.getExternalWorkbookPath());
} else {
System.out.println("The chart does not use an external workbook.");
}
} else {
System.out.println("The first shape is not a chart.");
}
presentation.save("Result.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Chỉnh sửa dữ liệu biểu đồ
Bạn có thể chỉnh sửa dữ liệu trong workbook bên ngoài cùng cách bạn thay đổi nội dung của workbook nội bộ. Khi một workbook bên ngoài không thể tải, một ngoại lệ sẽ được ném ra.
Ví dụ này sử dụng một biểu đồ là hình dạng đầu tiên trên slide đầu tiên và được liên kết với một workbook bên ngoài có thể truy cập. Nó đặt giá trị dựa trên ô của điểm dữ liệu đầu tiên trong series đầu tiên thành 100 và lưu bản trình chiếu đã cập nhật. Việc chỉnh sửa giá trị ô có thể cập nhật file XLSX bên ngoài đã liên kết, vì vậy hãy dùng bản sao nếu bạn cần bảo lưu workbook gốc.
import com.aspose.slides.*;
Presentation presentation = new Presentation("presentation.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartSeriesCollection series = chart.getChartData().getSeries();
if (series.size() > 0 && series.get_Item(0).getDataPoints().size() > 0) {
IChartDataCell valueCell = series.get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell();
if (valueCell != null) {
valueCell.setValue(100);
presentation.save("presentation_out.pptx", SaveFormat.Pptx);
} else {
System.out.println("The first data point is not linked to a workbook cell.");
}
} else {
System.out.println("The chart has no data points to edit.");
}
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Khôi phục Workbook từ bộ nhớ cache của biểu đồ
Nếu một biểu đồ sử dụng workbook bên ngoài mà bị thiếu hoặc không có sẵn, Aspose.Slides có thể tái tạo workbook biểu đồ từ dữ liệu được lưu trong cache của bản trình chiếu. Tạo LoadOptions, gọi LoadOptions.setSpreadsheetOptions, và đặt ISpreadsheetOptions.setRecoverWorkbookFromChartCache thành true trước khi mở bản trình chiếu.
Ví dụ Java sau khôi phục dữ liệu workbook cho một biểu đồ là hình dạng đầu tiên trên slide đầu tiên và tham chiếu đến một workbook bên ngoài không có sẵn. Nó truy cập dữ liệu đã khôi phục qua IChart.getChartData và 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 {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartDataWorkbook recoveredWorkbook = chart.getChartData().getChartDataWorkbook();
// Đọc hoặc chỉnh sửa dữ liệu workbook đã khôi phục ở đây.
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Nếu workbook bên ngoài không có sẵn và việc khôi phục bị tắt, Aspose.Slides sẽ ném ngoại lệ. Chỉ bật khôi phục khi việc sử dụng dữ liệu biểu đồ đã lưu trong cache là giải pháp chấp nhận được, vì cache có thể không chứa các thay đổi đã được thực hiện trên workbook bên ngoài sau lần cập nhật cuối cùng của bản trình chiếu.
Câu hỏi thường gặp
Tôi có thể xác định được một biểu đồ cụ thể có liên kết tới workbook bên ngoài hay là workbook được nhúng không?
Có. Một biểu đồ có kiểu nguồn dữ liệu và một đường dẫn tới workbook bên ngoài; nếu nguồn là workbook bên ngoài, bạn có thể đọc đường dẫn đầy đủ để chắc chắn một tệp bên ngoài đang được sử dụng.
Các đường dẫn tương đối tới workbook bên ngoài có được hỗ trợ không, và chúng được lưu như thế nào?
Có. Nếu bạn chỉ định một đường dẫn tương đối, nó sẽ tự động được chuyển thành đường dẫn tuyệt đối. Bản trình chiếu lưu đường dẫn tuyệt đối trong file PPTX, vì vậy việc di chuyển workbook có thể yêu cầu cập nhật liên kết.
Tôi có thể sử dụng các workbook nằm trên tài nguyên/mạng chia sẻ không?
Có, các workbook như vậy có thể được dùng làm nguồn dữ liệu bên ngoài. Tuy nhiên, việc chỉnh sửa trực tiếp workbook từ xa bằng Aspose.Slides không được hỗ trợ — chúng chỉ có thể dùng làm nguồn.
Aspose.Slides có ghi đè lên file XLSX bên ngoài khi lưu bản trình chiếu không?
Bản trình chiếu lưu một liên kết tới tệp bên ngoài. Việc chỉnh sửa dữ liệu biểu đồ dựa trên ô cũng có thể cập nhật file XLSX cục bộ đã liên kết. Hãy dùng bản sao của workbook nếu bản gốc phải được giữ nguyên.
Nếu tệp bên ngoài được bảo vệ bằng mật khẩu thì tôi nên làm gì?
Aspose.Slides không chấp nhận mật khẩu khi tạo liên kết. Một cách thường dùng là gỡ bỏ bảo vệ trước hoặc chuẩn bị một bản sao đã giải mã (ví dụ, bằng Aspose.Cells) và liên kết tới bản sao đó.
Nhiều biểu đồ có thể tham chiếu cùng một workbook bên ngoài không?
Có. Mỗi biểu đồ lưu liên kết riêng của mình. Nếu tất cả chúng trỏ tới cùng một tệp, việc cập nhật tệp đó sẽ được phản ánh trong mỗi biểu đồ ở lần tải dữ liệu tiếp theo.

