Správa sešitů grafů v prezentacích pomocí Pythonu přes Java
Přehled
Tento článek popisuje, jak pracovat s sešity grafů v Aspose.Slides. Ukazuje, jak číst a zapisovat data grafu pomocí proudů sešitu, používat buňky sešitu jako popisky dat grafu, přistupovat k kolekcím listů a určovat typ zdroje dat pro hodnoty grafu.
Také se zabývá prací s externími sešity jako zdroji dat pro grafy. Příklady ukazují, jak vytvořit a přiřadit externí sešit, získat cestu k externímu sešitu propojenému s grafem a upravit data grafu, když je sešit k dispozici.
Pro buňky sešitu, které představují chybějící data, viz Control the Display of Empty Cells pro rozdíl mezi prázdnou buňkou a nulou a porovnání liniového grafu dostupných režimů zobrazení.
Zahrnout data ze skrytých řádků a sloupců
Použijte Chart.setPlotVisibleCellsOnly k řízení, zda graf vykresluje data ze skrytých řádků a sloupců listu. Nastavte na True pro vykreslení pouze viditelných buněk nebo na False pro zahrnutí jak viditelných, tak skrytých buněk. Toto nastavení řídí vykreslování grafu; nešírá ani nezobrazí skryté řádky nebo sloupce listu.
Stáhněte si hidden-source-data.pptx a umístěte jej do pracovního adresáře. Jeho první snímek obsahuje sloupcový graf jako první tvar. Vložený list, Sheet1, obsahuje následující zdrojový rozsah A1:C4. Řádek 3 a sloupec C jsou skryté, ale jejich buňky stále obsahují hodnoty.
| Řádek listu | A: Měsíc | B: Maloobchod | C: Velkoobchod (skrytý sloupec) |
|---|---|---|---|
| 2 | leden | 10 | 30 |
| 3 (skrytý řádek) | únor | 40 | 60 |
| 4 | březen | 20 | 50 |
Přistupujte ke zdrojovým buňkám prostřednictvím ChartData.getChartDataWorkbook a přečtěte ChartDataCell.isHidden, abyste zkontrolovali jejich skrytý stav. Tato metoda oznamuje skrytý stav, aniž by jej měnila. V tomto souboru je B2 viditelný, B3 patří ke skrytému řádku a C2 ke skrytému sloupci; příklad vytiskne False, True a True.
Pro tento příklad obnovte data grafu po změně nastavení vykreslování: zachovejte vložený sešit pomocí readWorkbookStream a načtěte jej znovu pomocí writeWorkbookStream. Při zahrnutí všech buněk také použijte setRange k obnovení kompletního rozsahu, včetně skryté kategorie únor. Pouhé změnění příznaku není dostačující k aktualizaci kešovaných dat grafu a popisků kategorií v tomto příkladu.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpile.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)
# Obnovit data grafu z vloženého sešitu.
chart.getChartData().writeWorkbookStream(workbook_data)
if not visible_only:
# Obnovit kompletní zdrojový rozsah, včetně skrytých kategorií.
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()
Příklad ukládá hidden_cells_True.pptx pouze s viditelnými hodnotami Maloobchod (10 a 20) a hidden_cells_False.pptx se všemi šesti hodnotami. Obrázky níže ilustrují dva režimy vykreslování. Řádek 3 a sloupec C zůstávají skryté v obou vložených sešitech.
Pouze viditelné buňky (True) |
Všechny buňky (False) |
|---|---|
![]() |
![]() |
Skrytá buňka obsahující hodnotu se liší od prázdné buňky. Chart.setDisplayBlanksAs řídí, jak se zobrazují chybějící hodnoty; neprovádí zahrnutí ani vyloučení skrytých zdrojových dat. Viz Control the Display of Empty Cells pro příklad.
Čtení a zápis dat grafu ze sešitu
Aspose.Slides for Python via Java poskytuje metody readWorkbookStream a writeWorkbookStream, které umožňují číst a zapisovat sešity dat grafu (obsahující data grafu editovaná pomocí Aspose.Cells). Poznámka: data grafu musí být uspořádána stejným způsobem nebo mít strukturu podobnou zdroji.
Tento příklad otevírá chart.pptx, který musí obsahovat graf jako první tvar na svém prvním snímku. Načte vložený sešit do pole bytů, vymaže existující řady a kategorie a znovu zapíše stejný sešit. Změny zůstávají v paměti; příklad neukládá prezentaci.
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()
Ověřit rozvržení grafu po úpravě sešitu
Když nahradíte vložený sešit upraveným, graf si zachová své původní kolekce řad a kategorií. Tento nesoulad může způsobit selhání Chart.validateChartLayout s chybou index mimo rozsah. Vymažte existující řady a kategorie před zápisem aktualizovaného sešitu zpět do grafu. Tento příklad vyžaduje chart.pptx s grafem jako první tvar na prvním snímku. Komentář označuje místo, kde by úprava sešitu proběhla; spustitelný příklad zapíše původní sešit zpět a v paměti ověří rozvržení.
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()
# Upravte zde bajty sešitu, například pomocí 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()
Vymazání kolekcí odstraní zastaralé odkazy na data před zápisem sešitu zpět. Před použitím grafu znovu sestavte potřebné mapování řad a kategorií pro aktualizovaný sešit.
Nastavit buňku sešitu jako popisek dat grafu
Můžete použít text z buněk sešitu jako popisky dat v grafu. Následující kroky ukazují, jak propojit popisky v bublinovém grafu s buňkami v jeho datovém sešitu.
- Vytvořte instanci třídy Presentation .
- Přistupte k prvnímu snímku pomocí indexu od nuly.
- Přidejte bublinový graf s výchozími daty.
- Přistupte k řadám grafu.
- Nastavte buňku sešitu jako popisek dat.
- Uložte prezentaci.
Tento příklad otevírá chart2.pptx, který musí obsahovat alespoň jeden snímek, a přidává bublinový graf s výchozími daty. Používá buňky A10:A12 na listu 0 pro první tři popisky v první řadě, povoluje popisky z buněk a výsledek ukládá do 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()
Správa listů
Metoda ChartDataWorkbook.getWorksheets poskytuje přístup k listům v sešitu grafu. Tento příklad vytvoří koláčový graf s výchozími daty a vytiskne název každého listu do konzole.
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()
Určit typ zdroje dat
Tento příklad vytvoří 3D sloupcový graf s výchozími daty a nastaví dva názvy řad pomocí různých zdrojů dat. První název používá řetězcový literál; druhý používá buňku C1 na listu 0. Výčet DataSourceType vybírá zdroj pro každý název. Výsledek se uloží do 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()
Detekovat nepodporované formáty vložených sešitů
Aspose.Slides nepodporuje binární formát Excelu (.xlsb), který může být vložen v některých grafech. Můžete použít metodu getEmbeddedWorkbookType na ChartData spolu s výčtem WorkbookType pro detekci nepodporovaných formátů a přeskočení těchto grafů. Tento příklad kontroluje tvary na první snímku sample.pptx, přeskočí tvary, které nejsou grafy, a vytiskne diagnostickou zprávu pro každý graf s vloženým sešitem .xlsb.
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
# Prečtěte nebo upravte podporovaná data sešitu grafu zde.
finally:
presentation.dispose()
Externí sešit
Aspose.Slides podporuje používání externích sešitů jako zdroje dat pro grafy.
Vytvořit externí sešit
Použijte readWorkbookStream a setExternalWorkbook k exportu vloženého sešitu grafu do souboru a propojení grafu s tímto externím sešitem.
Tento příklad vytvoří koláčový graf s výchozími daty, zapíše jeho sešit do externalWorkbook1.xlsx a dokončí zápis souboru před přiřazením souboru jako zdroje dat grafu. Uloží propojenou prezentaci do 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()
Nastavit externí sešit
Pomocí metody setExternalWorkbook můžete přiřadit externí sešit grafu jako jeho zdroj dat. Tato metoda může být také použita k aktualizaci cesty k externímu sešitu (pokud byl přesunut).
I když nemůžete upravovat data v sešitech uložených na vzdálených místech nebo zdrojích, můžete je i nadále používat jako externí zdroj dat. Pokud je zadána relativní cesta k externímu sešitu, automaticky se převede na úplnou cestu.
Tento příklad vyžaduje externalWorkbook.xlsx v pracovním adresáři. Jeho list pojmenovaný Sheet1 musí obsahovat název řady v B1, názvy kategorií v A2:A4 a číselné hodnoty v B2:B4. Příklad vytvoří koláčový graf, propojí sešit a použije setRange k mapování A1:B4 na jednu řadu a tři kategorie. Výsledek uloží do 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()
Parametr updateChartData metody setExternalWorkbook určuje, zda je sešit načten.
- Když je
updateChartDataFalse, aktualizuje se jen cesta k sešitu. Data grafu nejsou načtena ani aktualizována z cílového sešitu, takže sešit může být nedostupný. - Když je
updateChartDataTrue, data grafu jsou aktualizována z cílového sešitu.
Následující příklad přiřadí zástupnou URL s updateChartData nastaveným na False. Zachová výchozí data koláčového grafu a uloží prezentaci bez načtení nedostupného sešitu.
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()
Získat cestu k externímu sešitu zdroje dat grafu
Pro identifikaci sešitu propojeného s grafem nejprve zjistěte, zda graf používá externí zdroj dat. Pokud ano, můžete získat cestu k sešitu podle následujících kroků.
- Vytvořte instanci třídy Presentation.
- Přistupte k prvnímu snímku pomocí indexu od nuly.
- Zkontrolujte, že první tvar je graf.
- Přečtěte typ zdroje dat grafu.
- Pokud je zdroj externí sešit, přečtěte jeho cestu.
Tento příklad otevírá externalWorkbook.pptx, vytvořený v předchozím příkladu, a zkoumá první tvar na prvním snímku. Pokud je to graf propojený s externím sešitem, příklad vytiskne getExternalWorkbookPath do konzole. Poté uloží kopii prezentace do 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()
Upravit data grafu
Můžete upravovat data v externích sešitech stejným způsobem, jako provádíte změny v obsahu interních sešitů. Pokud externí sešit nelze načíst, vyvolá se výjimka.
Tento příklad vyžaduje presentation.pptx s grafem jako první tvar na prvním snímku a přístupným externím sešitem. Nastaví hodnotu buňky prvního datového bodu v první řadě na 100 a uloží prezentaci do presentation_out.pptx. Úprava hodnot buněk může také aktualizovat propojený externí soubor XLSX, proto použijte kopii, pokud potřebujete zachovat původní sešit.
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()
Obnovit sešit z mezipaměti grafu
Pokud graf používá externí sešit, který chybí nebo není dostupný, Aspose.Slides může rekonstruovat sešit grafu z dat uložených v mezipaměti prezentace. Vytvořte LoadOptions, zavolejte LoadOptions.setSpreadsheetOptions a nastavte SpreadsheetOptions.setRecoverWorkbookFromChartCache na True před otevřením prezentace.
Následující příklad v Pythonu otevírá presentation.pptx, jehož první tvar na prvním snímku musí být graf odkazující na nedostupný externí sešit, a přistupuje k obnoveným datům prostřednictvím Chart.getChartData a 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()
# Přečtěte nebo upravte zde data obnoveného sešitu.
else:
print("The first shape is not a chart.")
finally:
presentation.dispose()
Pokud je externí sešit nedostupný a obnovení je zakázáno, Aspose.Slides vyvolá výjimku. Povolit obnovení pouze v případě, že použití dat z mezipaměti grafu je přijatelné jako záloha, protože mezipaměť nemusí obsahovat změny provedené v externím sešitu po poslední aktualizaci prezentace.
Často kladené otázky
Mohu zjistit, zda je konkrétní graf propojen s externím nebo vloženým sešitem?
Ano. Graf má typ zdroje dat a cestu k externímu sešitu; pokud je zdroj externí sešit, můžete přečíst úplnou cestu a ujistit se, že je používán externí soubor.
Jsou relativní cesty k externím sešitům podporovány a jak jsou uloženy?
Ano. Pokud zadáte relativní cestu, automaticky se převede na absolutní cestu. Prezentace ukládá absolutní cestu v souboru PPTX, takže přesunutí sešitu může vyžadovat aktualizaci odkazu.
Mohu používat sešity umístěné na síťových zdrojích/sdíleních?
Ano, takové sešity mohou být použity jako externí zdroj dat. Úprava vzdálených sešitů přímo z Aspose.Slides však není podporována – mohou být použity pouze jako zdroj.
Přepisuje Aspose.Slides externí XLSX při ukládání prezentace?
Prezentace ukládá odkaz na externí soubor. Úprava buněčně podložených dat grafu může také aktualizovat propojený lokální soubor XLSX. Použijte kopii sešitu, pokud originál musí zůstat nezměněn.
Co mám dělat, pokud je externí soubor chráněn heslem?
Aspose.Slides při propojování heslo neakceptuje. Běžný postup je odstranit ochranu předem nebo připravit dešifrovanou kopii (například pomocí Aspose.Cells) a odkazovat na tuto kopii.
Může více grafů odkazovat na stejný externí sešit?
Ano. Každý graf ukládá svůj vlastní odkaz. Pokud všechny ukazují na stejný soubor, aktualizace tohoto souboru se projeví v každém grafu při dalším načtení dat.

