Kelola Workbook Chart dalam Presentasi Menggunakan Python via Java
Ikhtisar
Artikel ini menjelaskan cara bekerja dengan workbook chart di Aspose.Slides. Ini menunjukkan cara membaca dan menulis data chart melalui aliran workbook, menggunakan sel workbook sebagai label data chart, mengakses koleksi worksheet, dan menentukan tipe sumber data untuk nilai chart.
Artikel ini juga membahas penggunaan workbook eksternal sebagai sumber data chart. Contoh‑contoh memperlihatkan cara membuat dan menetapkan workbook eksternal, mengambil jalur workbook eksternal yang terhubung ke chart, serta mengedit data chart ketika workbook tersedia.
Untuk sel workbook yang mewakili data yang hilang, lihat Control the Display of Empty Cells untuk perbedaan antara sel kosong dan nol, serta perbandingan diagram garis dari mode tampilan yang tersedia.
Sertakan Data dari Baris dan Kolom Tersembunyi
Gunakan Chart.setPlotVisibleCellsOnly untuk mengontrol apakah chart memplot data dari baris dan kolom worksheet yang tersembunyi. Setel ke True untuk memplot hanya sel yang terlihat, atau False untuk menyertakan sel yang terlihat dan tersembunyi. Pengaturan ini mengontrol pemetaan chart; tidak menyembunyikan atau menampilkan kembali baris atau kolom worksheet.
Unduh hidden-source-data.pptx dan letakkan di direktori kerja. Slide pertama berisi diagram kolom sebagai bentuk pertama. Worksheet yang tersemat, Sheet1, berisi rentang sumber berikut, A1:C4. Baris 3 dan kolom C tersembunyi, tetapi sel‑selnya masih berisi nilai.
| Baris Worksheet | A: Bulan | B: Ritel | C: Grosir (kolom tersembunyi) |
|---|---|---|---|
| 2 | Januari | 10 | 30 |
| 3 (baris tersembunyi) | Februari | 40 | 60 |
| 4 | Maret | 20 | 50 |
Akses sel sumber melalui ChartData.getChartDataWorkbook dan baca ChartDataCell.isHidden untuk memeriksa status tersembunyi mereka. Metode ini melaporkan status tersembunyi tanpa mengubahnya. Pada file ini, B2 terlihat, B3 termasuk dalam baris tersembunyi, dan C2 termasuk dalam kolom tersembunyi; contoh mencetak False, True, dan True secara berurutan.
Untuk contoh ini, segarkan data chart setelah mengubah pengaturan pemetaan: pertahankan workbook tersemat dengan readWorkbookStream dan muat ulang dengan writeWorkbookStream. Saat menyertakan semua sel, gunakan juga setRange untuk memulihkan rentang lengkap, termasuk kategori Februari yang tersembunyi. Mengubah flag saja tidak cukup untuk menyegarkan data chart yang di‑cache dalam contoh ini dan label kategori.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, Presentation, SaveFormat
presentation = Presentation("hidden-source-data.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
workbook = chart.getChartData().getChartDataWorkbook()
print("B2 hidden:", workbook.getCell(0, "B2").isHidden())
print("B3 hidden:", workbook.getCell(0, "B3").isHidden())
print("C2 hidden:", workbook.getCell(0, "C2").isHidden())
workbook_data = chart.getChartData().readWorkbookStream()
for visible_only in (True, False):
chart.setPlotVisibleCellsOnly(visible_only)
# Segarkan data chart dari workbook yang tersemat.
chart.getChartData().writeWorkbookStream(workbook_data)
if not visible_only:
# Pulihkan rentang sumber lengkap, termasuk kategori yang tersembunyi.
chart.getChartData().setRange("Sheet1!$A$1:$C$4")
presentation.save(f"hidden_cells_{visible_only}.pptx", SaveFormat.Pptx)
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Contoh menyimpan hidden_cells_True.pptx hanya dengan nilai Ritel yang terlihat (10 dan 20), dan hidden_cells_False.pptx dengan semua enam nilai. Gambar di bawah mengilustrasikan dua mode pemetaan. Baris 3 dan kolom C tetap tersembunyi di kedua workbook tersemat.
Hanya sel yang terlihat (True) |
Semua sel (False) |
|---|---|
![]() |
![]() |
Sel tersembunyi yang berisi nilai berbeda dari sel kosong. Chart.setDisplayBlanksAs mengontrol cara nilai yang hilang ditampilkan; tidak menyertakan atau mengecualikan data sumber yang tersembunyi. Lihat Control the Display of Empty Cells untuk contoh.
Baca dan Tulis Data Chart dari Workbook
Aspose.Slides for Python via Java menyediakan metode readWorkbookStream dan writeWorkbookStream yang memungkinkan Anda membaca dan menulis workbook data chart (yang berisi data chart yang diedit dengan Aspose.Cells). Note bahwa data chart harus diatur dengan cara yang sama atau memiliki struktur serupa dengan sumbernya.
Contoh ini membuka chart.pptx, yang harus berisi chart sebagai bentuk pertama pada slide pertama. Ini membaca workbook tersemat ke dalam array byte, menghapus seri dan kategori yang ada, dan menulis kembali workbook yang sama. Perubahan tetap berada di memori; contoh tidak menyimpan presentasi.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, Presentation
presentation = Presentation("chart.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
chart_data = chart.getChartData()
workbook_data = chart_data.readWorkbookStream()
chart_data.getSeries().clear()
chart_data.getCategories().clear()
chart_data.writeWorkbookStream(workbook_data)
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Validasi Tata Letak Chart Setelah Modifikasi Workbook
Ketika Anda mengganti workbook tersemat dengan yang dimodifikasi, chart tetap mempertahankan koleksi seri dan kategori aslinya. Ketidaksesuaian ini dapat menyebabkan Chart.validateChartLayout gagal dengan kesalahan indeks di luar jangkauan. Hapus seri dan kategori yang ada sebelum menulis kembali workbook yang diperbarui ke chart. Contoh ini memerlukan chart.pptx dengan chart sebagai bentuk pertama pada slide pertama. Komentar menandai tempat penyuntingan workbook; contoh yang dapat dijalankan menulis kembali workbook asli dan memvalidasi tata letak di memori.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, Presentation
presentation = Presentation("chart.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
chart_data = chart.getChartData()
workbook_data = chart_data.readWorkbookStream()
# Modifikasi byte workbook di sini, misalnya dengan menggunakan Aspose.Cells.
chart_data.getSeries().clear()
chart_data.getCategories().clear()
chart_data.writeWorkbookStream(workbook_data)
chart.validateChartLayout()
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Mengosongkan koleksi menghapus referensi data usang sebelum workbook ditulis kembali. Bangun kembali pemetaan seri dan kategori yang diperlukan untuk workbook yang diperbarui sebelum menggunakan chart.
Setel Sel Workbook sebagai Label Data Chart
Anda dapat menggunakan teks dari sel workbook sebagai label data chart. Langkah‑langkah berikut menunjukkan cara menautkan label pada bubble chart ke sel pada workbook datanya.
- Buat instance kelas Presentation .
- Akses slide pertama dengan indeks berbasis nol.
- Tambahkan bubble chart dengan data default.
- Akses seri chart.
- Setel sel workbook sebagai label data.
- Simpan presentasi.
Contoh ini membuka chart2.pptx, yang harus berisi minimal satu slide, dan menambahkan bubble chart dengan data default. Ini menggunakan sel A10:A12 pada worksheet 0 untuk tiga label pertama pada seri pertama, mengaktifkan label dari sel, dan menyimpan hasilnya ke resultchart.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
presentation = Presentation("chart2.pptx")
try:
slide = presentation.getSlides().get_Item(0)
label_values = ["Label 0 cell value", "Label 1 cell value", "Label 2 cell value"]
chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, True)
series = chart.getChartData().getSeries()
data_labels = series.get_Item(0).getLabels()
data_labels.getDefaultDataLabelFormat().setShowLabelValueFromCell(True)
workbook = chart.getChartData().getChartDataWorkbook()
for i in range(3):
label_cell = workbook.getCell(0, f"A{10 + i}", label_values[i])
data_labels.get_Item(i).setValueFromCell(label_cell)
presentation.save("resultchart.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Kelola Worksheet
Metode ChartDataWorkbook.getWorksheets menyediakan akses ke worksheet dalam workbook chart. Contoh ini membuat pie chart dengan data default dan mencetak setiap nama worksheet ke konsol.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 500)
workbook = chart.getChartData().getChartDataWorkbook()
for i in range(workbook.getWorksheets().size()):
print(workbook.getWorksheets().get_Item(i).getName())
finally:
presentation.dispose()
Tentukan Tipe Sumber Data
Contoh ini membuat 3D column chart dengan data default dan menetapkan dua nama seri menggunakan sumber data yang berbeda. Nama pertama menggunakan literal string; yang kedua menggunakan sel C1 pada worksheet 0. Enumerasi DataSourceType memilih sumber untuk setiap nama. Hasil disimpan ke pres.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, DataSourceType, Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, True)
literal_name = chart.getChartData().getSeries().get_Item(0).getName()
literal_name.setDataSourceType(DataSourceType.StringLiterals)
literal_name.setData("LiteralString")
cell_name = chart.getChartData().getSeries().get_Item(1).getName()
name_cell = chart.getChartData().getChartDataWorkbook().getCell(0, "C1", "NewCell")
cell_name.setDataSourceType(DataSourceType.Worksheet)
cell_name.setData(name_cell)
presentation.save("pres.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Deteksi Format Workbook Tersemat yang Tidak Didukung
Aspose.Slides tidak mendukung format workbook Excel biner (.xlsb) yang dapat tersemat di beberapa chart. Anda dapat menggunakan metode getEmbeddedWorkbookType pada ChartData bersama dengan enumerasi WorkbookType untuk mendeteksi format yang tidak didukung dan melewati chart‑chart tersebut. Contoh ini memeriksa bentuk pada slide pertama sample.pptx, melewati bentuk non‑chart, dan mencetak pesan diagnostik untuk setiap chart dengan workbook .xlsb yang tersemat.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, ChartDataSourceType, Presentation, WorkbookType
presentation = Presentation("sample.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
if not isinstance(shape, Chart):
continue
chart_data = shape.getChartData()
is_internal_workbook = chart_data.getDataSourceType() == ChartDataSourceType.InternalWorkbook
is_binary_macro = chart_data.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro
if is_internal_workbook and is_binary_macro:
print("Skipping a chart with an unsupported .xlsb workbook.")
continue
# Baca atau ubah data workbook chart yang didukung di sini.
finally:
presentation.dispose()
Workbook Eksternal
Aspose.Slides mendukung penggunaan workbook eksternal sebagai sumber data untuk chart.
Buat Workbook Eksternal
Gunakan readWorkbookStream dan setExternalWorkbook untuk mengekspor workbook chart tersemat ke file dan menautkan chart ke workbook eksternal tersebut.
Contoh ini membuat pie chart dengan data default, menulis workbook‑nya ke externalWorkbook1.xlsx, dan menyelesaikan penulisan file sebelum menetapkan file sebagai sumber data chart. Ini menyimpan presentasi yang ditautkan ke externalWorkbook.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
from pathlib import Path
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600)
workbook_path = Path("externalWorkbook1.xlsx").resolve()
workbook_data = chart.getChartData().readWorkbookStream()
Path(workbook_path).write_bytes(bytes(workbook_data))
chart.getChartData().setExternalWorkbook(str(workbook_path))
presentation.save("externalWorkbook.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Setel Workbook Eksternal
Dengan menggunakan metode setExternalWorkbook, Anda dapat menetapkan workbook eksternal ke chart sebagai sumber datanya. Metode ini juga dapat dipakai untuk memperbarui jalur ke workbook eksternal (jika workbook tersebut dipindahkan).
Meskipun Anda tidak dapat menyunting data dalam workbook yang disimpan di lokasi atau sumber daya jaringan, workbook tersebut tetap dapat digunakan sebagai sumber data eksternal. Jika jalur relatif untuk workbook eksternal diberikan, jalur tersebut akan otomatis dikonversi ke jalur penuh.
Contoh ini membutuhkan externalWorkbook.xlsx di direktori kerja. Worksheet‑nya yang bernama Sheet1 harus berisi nama seri di B1, nama kategori di A2:A4, dan nilai numerik di B2:B4. Contoh membuat pie chart, menautkan workbook, dan menggunakan setRange untuk memetakan A1:B4 ke satu seri dan tiga kategori. Hasil disimpan ke Presentation_with_externalWorkbook.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
from pathlib import Path
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, True)
chart_data = chart.getChartData()
workbook_path = str(Path("externalWorkbook.xlsx").resolve())
chart_data.setExternalWorkbook(workbook_path)
chart_data.setRange("Sheet1!$A$1:$B$4")
presentation.save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Parameter updateChartData pada setExternalWorkbook mengendalikan apakah workbook dimuat.
- Ketika
updateChartDatabernilaiFalse, hanya jalur workbook yang diperbarui. Data chart tidak dimuat atau diperbarui dari workbook target, sehingga workbook dapat tidak tersedia. - Ketika
updateChartDatabernilaiTrue, data chart diperbarui dari workbook target.
Contoh berikut menetapkan URL placeholder dengan updateChartData diset ke False. Ini mempertahankan data default pie chart dan menyimpan presentasi tanpa memuat workbook yang tidak tersedia.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ChartType, Presentation, SaveFormat
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, True)
chart_data = chart.getChartData()
chart_data.setExternalWorkbook("https://example.com/unavailable-workbook.xlsx", False)
presentation.save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Dapatkan Path Workbook Sumber Data Eksternal dari Chart
Untuk mengidentifikasi workbook yang ditautkan ke chart, pertama periksa apakah chart menggunakan sumber data eksternal. Jika ya, Anda dapat mengambil jalur workbook dengan mengikuti langkah‑langkah berikut.
- Buat instance kelas Presentation.
- Akses slide pertama dengan indeks berbasis nol.
- Periksa bahwa bentuk pertama adalah chart.
- Baca tipe sumber data chart.
- Jika sumbernya adalah workbook eksternal, baca jalurnya.
Contoh ini membuka externalWorkbook.pptx, yang dibuat pada contoh sebelumnya, dan memeriksa bentuk pertama pada slide pertama. Jika itu adalah chart yang ditautkan ke workbook eksternal, contoh mencetak getExternalWorkbookPath ke konsol. Setelah itu menyimpan salinan presentasi ke Result.pptx.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, ChartDataSourceType, Presentation, SaveFormat
presentation = Presentation("externalWorkbook.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
chart_data = chart.getChartData()
if chart_data.getDataSourceType() == ChartDataSourceType.ExternalWorkbook:
print(chart_data.getExternalWorkbookPath())
else:
print("The chart does not use an external workbook.")
else:
print("The first shape is not a chart.")
presentation.save("Result.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Edit Data Chart
Anda dapat menyunting data dalam workbook eksternal dengan cara yang sama seperti mengubah isi workbook internal. Ketika workbook eksternal tidak dapat dimuat, sebuah pengecualian akan dilempar.
Contoh ini membutuhkan presentation.pptx dengan chart sebagai bentuk pertama pada slide pertama serta workbook eksternal yang dapat diakses. Ini menetapkan nilai sel pada titik data pertama di seri pertama menjadi 100 dan menyimpan presentasi ke presentation_out.pptx. Menyunting nilai sel dapat memperbarui file XLSX eksternal yang ditautkan, jadi gunakan salinan jika Anda perlu mempertahankan workbook asli.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, Presentation, SaveFormat
presentation = Presentation("presentation.pptx")
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
series = chart.getChartData().getSeries()
if series.size() > 0 and series.get_Item(0).getDataPoints().size() > 0:
value_cell = series.get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell()
if value_cell is not None:
value_cell.setValue(jpype.JInt(100))
presentation.save("presentation_out.pptx", SaveFormat.Pptx)
else:
print("The first data point is not linked to a workbook cell.")
else:
print("The chart has no data points to edit.")
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Pulihkan Workbook dari Cache Chart
Jika sebuah chart menggunakan workbook eksternal yang hilang atau tidak tersedia, Aspose.Slides dapat merekonstruksi workbook chart dari data yang di‑cache dalam presentasi. Buat LoadOptions, panggil LoadOptions.setSpreadsheetOptions, dan setel SpreadsheetOptions.setRecoverWorkbookFromChartCache ke True sebelum membuka presentasi.
Contoh Python berikut membuka presentation.pptx, yang bentuk pertama pada slide pertama harus berupa chart yang merujuk ke workbook eksternal yang tidak tersedia, dan mengakses data yang dipulihkan melalui Chart.getChartData dan ChartData.getChartDataWorkbook:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Chart, LoadOptions, Presentation, SpreadsheetOptions
spreadsheet_options = SpreadsheetOptions()
spreadsheet_options.setRecoverWorkbookFromChartCache(True)
load_options = LoadOptions()
load_options.setSpreadsheetOptions(spreadsheet_options)
presentation = Presentation("presentation.pptx", load_options)
try:
slide = presentation.getSlides().get_Item(0)
shape_count = slide.getShapes().size()
if shape_count > 0 and isinstance(slide.getShapes().get_Item(0), Chart):
chart = slide.getShapes().get_Item(0)
recovered_workbook = chart.getChartData().getChartDataWorkbook()
# Baca atau ubah data workbook yang dipulihkan di sini.
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Jika workbook eksternal tidak tersedia dan pemulihan dinonaktifkan, Aspose.Slides akan melempar pengecualian. Aktifkan pemulihan hanya ketika penggunaan data chart yang di‑cache merupakan alternatif yang dapat diterima, karena cache mungkin tidak berisi perubahan yang dibuat pada workbook eksternal setelah presentasi terakhir diperbarui.
FAQ
Apakah saya dapat menentukan apakah chart tertentu terhubung ke workbook eksternal atau tersemat?
Ya. Sebuah chart memiliki tipe sumber data dan jalur ke workbook eksternal; bila sumbernya adalah workbook eksternal, Anda dapat membaca jalur lengkap untuk memastikan file eksternal sedang digunakan.
Apakah jalur relatif ke workbook eksternal didukung, dan bagaimana cara penyimpanannya?
Ya. Jika Anda menentukan jalur relatif, jalur tersebut otomatis dikonversi menjadi jalur absolut. Presentasi menyimpan jalur absolut dalam file PPTX, sehingga memindahkan workbook mungkin memerlukan pembaruan tautan.
Apakah saya dapat menggunakan workbook yang berada di sumber daya jaringan/share?
Ya, workbook tersebut dapat digunakan sebagai sumber data eksternal. Namun, penyuntingan workbook remote secara langsung dari Aspose.Slides tidak didukung—hanya dapat digunakan sebagai sumber.
Apakah Aspose.Slides menimpa file XLSX eksternal saat menyimpan presentasi?
Presentasi menyimpan tautan ke file eksternal. Menyunting data chart yang didasarkan pada sel juga dapat memperbarui file XLSX lokal yang ditautkan. Gunakan salinan workbook jika yang asli harus tetap tidak berubah.
Apa yang harus saya lakukan jika file eksternal dilindungi kata sandi?
Aspose.Slides tidak menerima kata sandi saat menautkan. Pendekatan umum adalah menghapus perlindungan sebelumnya atau menyiapkan salinan yang telah didekripsi (misalnya, menggunakan Aspose.Cells) dan menautkan ke salinan tersebut.
Apakah beberapa chart dapat merujuk ke workbook eksternal yang sama?
Ya. Setiap chart menyimpan tautannya masing‑masing. Jika semuanya menunjuk ke file yang sama, pembaruan file tersebut akan tercermin pada setiap chart pada kali berikutnya data dimuat.

