Správa pracovních sešitů grafů v prezentacích pomocí PHP
Přehled
Tento článek vysvětluje, jak pracovat s grafickými sešity v Aspose.Slides. Ukazuje, jak číst a zapisovat data grafu pomocí streamů sešitu, používat buňky sešitu jako popisky dat grafu, přistupovat ke kolekcím listů a určit typ zdroje dat pro hodnoty grafu.
Také se zabývá používáním externích sešitů jako zdrojů dat pro grafy. Příklady ukazují, jak vytvořit a přiřadit externí sešit, získat cestu k externímu sešitu připojenému ke grafu a upravit data grafu, když je sešit dostupný.
Pro buňky sešitu, které představují chybějící data, viz Ovládání zobrazení prázdných buněk pro rozdíl mezi prázdnou buňkou a nulou a pro srovnání liniových grafů 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, aby se vykreslovaly jen viditelné buňky, nebo na false, aby se zahrnovaly i viditelné i skryté buňky. Toto nastavení ovlivňuje vykreslování grafu; neskrývá ani nezobrazí řádky nebo sloupce listu.
Ukázková prezentace obsahuje sloupcový graf jako první objekt na první snímku. 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 pomocí ChartData::getChartDataWorkbook a čtěte ChartDataCell::isHidden pro kontrolu jejich skrytého stavu. Tato metoda vrací skrytý stav, aniž by jej měnila. V tomto souboru je B2 viditelná, B3 patří ke skrytému řádku a C2 patří 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. Pouze změna příznaku není dostatečná k obnovení mezipaměti dat a popisků kategorií v tomto vzorku.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("hidden-source-data.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$workbook = $chart->getChartData()->getChartDataWorkbook();
echo "B2 hidden: " . (java_values($workbook->getCell(0, "B2")->isHidden()) ? "true" : "false"), PHP_EOL;
echo "B3 hidden: " . (java_values($workbook->getCell(0, "B3")->isHidden()) ? "true" : "false"), PHP_EOL;
echo "C2 hidden: " . (java_values($workbook->getCell(0, "C2")->isHidden()) ? "true" : "false"), PHP_EOL;
$workbookData = $chart->getChartData()->readWorkbookStream();
foreach ([true, false] as $visibleOnly) {
$chart->setPlotVisibleCellsOnly($visibleOnly);
// Obnovte data grafu z vloženého pracovního sešitu.
$chart->getChartData()->writeWorkbookStream($workbookData);
if (!$visibleOnly) {
// Obnovte celý zdrojový rozsah, včetně skrytých kategorií.
$chart->getChartData()->setRange('Sheet1!$A$1:$C$4');
}
$presentation->save("hidden_cells_" . ($visibleOnly ? "true" : "false") . ".pptx", SaveFormat::Pptx);
}
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
} finally {
$presentation->dispose();
}
Příklad uloží dvě verze prezentace: jednu pouze s viditelnými hodnotami maloobchodu (10 a 20) a druhou 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; nezahrnuje ani nevyřazuje skrytá zdrojová data. Viz Ovládání zobrazení prázdných buněk pro příklad.
Získat rozsah dat grafu
Před aktualizací dat sešitu v existující prezentaci prozkoumejte zdrojové rozsahy, abyste zjistili, které buňky listu jednotlivé grafy používají. Metoda ChartData::getRange vrací aktuální datový rozsah jako vzorec s kvalifikací listu, např. Sheet1!$A$1:$D$5. Zde Sheet1 je název listu, ! jej odděluje od rozsahu buněk a $A$1:$D$5 určuje buňky A1 až D5 včetně. Znaky $ označují absolutní odkazy na řádky a sloupce.
Metoda načte aktuální rozsah, aniž by měnila graf nebo jeho sešit. Pokud graf nepoužívá sešit jako zdroj dat, vyvolá výjimku. Další informace najdete v ChartData API Reference.
Tento příklad otevře prezentaci a přímo na každém snímku zkontroluje objekty, zda jsou grafy. Vytiskne název každého grafu a jeho zdrojový rozsah. Pokud graf nepoužívá sešit, vytiskne zprávu a pokračuje dalším grafem.
use aspose\slides\Presentation;
$presentation = new Presentation("presentation.pptx");
try {
$slideCount = java_values($presentation->getSlides()->size());
for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
$shapeCount = java_values($slide->getShapes()->size());
for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
if (java_instanceof($shape, new JavaClass("com.aspose.slides.IChart"))) {
$chart = $shape;
try {
$range = $chart->getChartData()->getRange();
echo $chart->getName() . ": " . $range, PHP_EOL;
} catch (JavaException $exception) {
if (java_instanceof($exception, new JavaClass("com.aspose.slides.exceptions.InvalidOperationException"))) {
echo $chart->getName() . ": The chart does not use a workbook as its data source.", PHP_EOL;
} else {
echo $chart->getName() . ": " . $exception->getMessage(), PHP_EOL;
}
}
}
}
}
} finally {
$presentation->dispose();
}
Číst a zapisovat data grafu z sešitu
Aspose.Slides for PHP via Java poskytuje metody readWorkbookStream a writeWorkbookStream, které umožňují číst a zapisovat grafické sešity (obsahující data grafů upravená pomocí Aspose.Cells). Poznámka, že data grafu musí být uspořádána stejným způsobem nebo mít strukturu podobnou zdroji.
Tento příklad používá prezentaci s grafem jako první objekt na první snímku. Načte vložený sešit do pole bajtů, vymaže existující řady a kategorie a zapíše stejný sešit zpět. Změny zůstávají v paměti; příklad neukládá prezentaci.
use aspose\slides\Presentation;
$presentation = new Presentation("chart.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$chartData = $chart->getChartData();
$workbookData = $chartData->readWorkbookStream();
$chartData->getSeries()->clear();
$chartData->getCategories()->clear();
$chartData->writeWorkbookStream($workbookData);
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
} finally {
$presentation->dispose();
}
Ověřit rozložení grafu po úpravě sešitu
Když nahradíte vložený sešit upraveným, graf si zachová originální kolekce řad a kategorií. Tato 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 používá graf, který je první objekt na první snímku. Komentář označuje místo, kde by se úprava sešitu prováděla; spustitelný příklad zapíše originální sešit zpět a ověří rozložení v paměti.
use aspose\slides\Presentation;
$presentation = new Presentation("chart.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$chartData = $chart->getChartData();
$workbookData = $chartData->readWorkbookStream();
// Upravte bajty pracovního sešitu zde, například pomocí Aspose.Cells.
$chartData->getSeries()->clear();
$chartData->getCategories()->clear();
$chartData->writeWorkbookStream($workbookData);
$chart->validateChartLayout();
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
} finally {
$presentation->dispose();
}
Vymazání kolekcí odstraní zastaralé odkazy na data před zápisem sešitu zpět. Přestavte všechny potřebné mapování řad a kategorií pro aktualizovaný sešit před použitím grafu.
Nastavit vlastní číselné formáty pro buňky sešitu
Použijte ChartDataCell::setCustomNumberFormat k řízení, jak se číselné hodnoty zobrazují ve vloženém sešitu grafu. Například zpráva může potřebovat konverzní poměr zobrazený jako procento se čtyřmi desetinnými místy a koeficient se zobrazit s pěti desetinnými místy. Udržujte obě hodnoty číselné, aby zůstaly k dispozici pro výpočty a vykreslování grafu.
Číselný formát mění pouze zobrazení, ne uloženou hodnotu. Formát 0.0000% zobrazí 0.125 jako 12.5000%; nenahradí uložené číslo 12.5. Podobně 0.00000 zobrazí 0.1234567 jako 0.12346 bez zaokrouhlení uložené hodnoty. Pokud je vlastní formát prázdný řetězec (""), použije se formát vrácený metodou getPresetNumberFormat.
Následující příklad vytvoří sloupcový graf a přistoupí k jeho buňkám pomocí getChartDataWorkbook. Na listu 0 obsahuje B2 konverzní poměr a C2 koeficient. Obě buňky poskytují hodnoty pro graf. Příklad také povolí popisky hodnot odkazující na zdrojové formáty.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SlideSizeScaleType;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$presentation->getSlideSize()->setSize(720, 270, SlideSizeScaleType::DoNotScale);
$slide = $presentation->getSlides()->get_Item(0);
$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();
$workbook = $chart->getChartData()->getChartDataWorkbook();
$workbook->clear(0);
$categoryCell = $workbook->getCell(0, "A2", "Sample");
$chart->getChartData()->getCategories()->add($categoryCell);
$percentageCell = $workbook->getCell(0, "B2", 0.125);
$percentageCell->setCustomNumberFormat("0.0000%");
$percentageName = $workbook->getCell(0, "B1", "Conversion rate");
$percentageSeries = $chart->getChartData()->getSeries()->add($percentageName, $chart->getType());
$percentageSeries->getDataPoints()->addDataPointForBarSeries($percentageCell);
$precisionCell = $workbook->getCell(0, "C2", 0.1234567);
$precisionCell->setCustomNumberFormat("0.00000");
$precisionName = $workbook->getCell(0, "C1", "Coefficient");
$precisionSeries = $chart->getChartData()->getSeries()->add($precisionName, $chart->getType());
$precisionSeries->getDataPoints()->addDataPointForBarSeries($precisionCell);
for ($seriesIndex = 0; $seriesIndex < java_values($chart->getChartData()->getSeries()->size()); $seriesIndex++) {
$series = $chart->getChartData()->getSeries()->get_Item($seriesIndex);
$labelFormat = $series->getDataPoints()->get_Item(0)->getLabel()->getDataLabelFormat();
$labelFormat->setShowValue(true);
$labelFormat->setNumberFormatLinkedToSource(true);
}
$presentation->save("CustomCellFormats.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Formáty buněk sešitu jsou oddělené od formátů nastavených přímo na osách grafu nebo popiscích dat. V tomto příkladu každý popisek zobrazuje hodnotu své zdrojové buňky, protože setShowValue je nastaven na true, a následuje zdrojový číselný formát, protože setNumberFormatLinkedToSource je nastaven na true. Po uložení a opětovném otevření prezentace popisky zobrazí 12.5000% a 0.12346, jak je ukázáno níže. Svislá osa používá vlastní číselný formát, přiřazený pomocí setNumberFormat jako 0.00, a setNumberFormatLinkedToSource je nastaven na false.
Pro nezávislé formátování popisku dat nastavte jeho příznak odkazující na zdroj na false a přiřaďte formát pomocí setNumberFormat. Tím se nezmění formát buňky sešitu. Např. nezávislý formát popisku 0.00 zobrazí první hodnotu jako 0.13, zatímco B2 stále zobrazuje 12.5000%. Viz Chart Data Labels pro přímé formátování popisků.

Nastavit buňku sešitu jako popisek dat grafu
Můžete použít text z buněk sešitu jako popisky dat grafu.
Tento příklad přidá bublinový graf s výchozími daty na první snímek existující prezentace. Použije buňky A10:A12 na listu 0 pro první tři popisky v první řadě, povolí popisky z buněk a uloží aktualizovanou prezentaci.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SaveFormat;
$presentation = new Presentation("chart2.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Bubble, 50, 50, 600, 400, true);
$series = $chart->getChartData()->getSeries()->get_Item(0);
$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();
}
Spravovat listy
Metoda ChartDataWorkbook::getWorksheets poskytuje přístup k listům v grafickém sešitu. Tento příklad vytvoří koláčový graf s výchozími daty a vytiskne název každého listu do konzole.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 500);
$workbook = $chart->getChartData()->getChartDataWorkbook();
for ($i = 0; $i < java_values($workbook->getWorksheets()->size()); $i++) {
echo $workbook->getWorksheets()->get_Item($i)->getName(), PHP_EOL;
}
} finally {
$presentation->dispose();
}
Zvolit typ zdroje dat
Hodnoty bodů řady mohou být také uloženy přímo jako číselné literály. Viz Set Series Values Using Numeric Literals pro kompletní příklad, který je ukládá a čte. Typ zdroje bodových hodnot je oddělený od vnitřní nebo externí konfigurace sešitu grafu; používání číselných literálů samo o sobě neodstraňuje vložený sešit.
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ýčtová hodnota DataSourceType vybírá zdroj pro každý název. Příklad uloží prezentaci s aktualizovanými názvy řad.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SaveFormat;
use aspose\slides\DataSourceType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Column3D, 50, 50, 600, 400, true);
$literalName = $chart->getChartData()->getSeries()->get_Item(0)->getName();
$literalName->setDataSourceType(DataSourceType::StringLiterals);
$literalName->setData("LiteralString");
$cellName = $chart->getChartData()->getSeries()->get_Item(1)->getName();
$nameCell = $chart->getChartData()->getChartDataWorkbook()->getCell(0, "C1", "NewCell");
$cellName->setDataSourceType(DataSourceType::Worksheet);
$cellName->setData($nameCell);
$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 do některých grafů. Můžete použít metodu getEmbeddedWorkbookType na ChartData společně s výčtem WorkbookType k detekci nepodporovaných formátů a přeskočit tyto grafy. Tento příklad zkoumá objekty na první snímek existující prezentace, přeskočí objekty, které nejsou grafy, a vytiskne diagnostickou zprávu pro každý graf s vloženým .xlsb sešitem.
use aspose\slides\Presentation;
use aspose\slides\ChartDataSourceType;
use aspose\slides\WorkbookType;
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
if (!java_instanceof($shape, new JavaClass("com.aspose.slides.IChart"))) {
continue;
}
$chart = $shape;
$chartData = $chart->getChartData();
$isInternalWorkbook = java_values($chartData->getDataSourceType()) == ChartDataSourceType::InternalWorkbook;
$isBinaryMacro = java_values($chartData->getEmbeddedWorkbookType()) == WorkbookType::WorkbookBinaryMacro;
if ($isInternalWorkbook && $isBinaryMacro) {
echo "Skipping a chart with an unsupported .xlsb workbook.", PHP_EOL;
continue;
}
// Přečtěte nebo upravte podporovaná data pracovního 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 a exportuje jeho sešit. Dokončí zápis souboru před přiřazením externího sešitu jako zdroje dat grafu, poté uloží propojenou prezentaci.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600);
$workbookPath = new Java("java.io.File", "externalWorkbook1.xlsx");
$workbookData = $chart->getChartData()->readWorkbookStream();
try {
$fileStream = new Java("java.io.FileOutputStream", $workbookPath);
try {
$fileStream->write($workbookData);
} finally {
$fileStream->close();
}
$chart->getChartData()->setExternalWorkbook($workbookPath->getAbsolutePath());
$presentation->save("externalWorkbook.pptx", SaveFormat::Pptx);
} catch (JavaException $exception) {
echo "Could not write the external workbook: " . $exception->getMessage(), PHP_EOL;
}
} 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ž nelze upravovat data v sešitech uložených na vzdálených místech nebo zdrojích, můžete takové sešity i nadále použít 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 používá externí sešit, jehož list pojmenovaný Sheet1 obsahuje 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. Uloží prezentaci s propojeným grafem.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600, true);
$chartData = $chart->getChartData();
$workbookFile = new Java("java.io.File", "externalWorkbook.xlsx");
$workbookPath = $workbookFile->getAbsolutePath();
$chartData->setExternalWorkbook($workbookPath);
$chartData->setRange('Sheet1!$A$1:$B$4');
$presentation->save("Presentation_with_externalWorkbook.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Parametr updateChartData metody setExternalWorkbook řídí, zda se sešit načte.
- 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čítání nedostupného sešitu.
use aspose\slides\Presentation;
use aspose\slides\ChartType;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$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();
}
Získat cestu k externímu zdroji sešitu grafu
Chcete‑li zjistit, který sešit je propojen s grafem, ověřte, zda graf používá externí zdroj dat, a načtěte jeho cestu.
Tento příklad zkoumá první objekt na první snímek prezentace s propojeným externím sešitem. Pokud je to graf propojený s externím sešitem, vytiskne getExternalWorkbookPath do konzole. Poté uloží kopii prezentace.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ChartDataSourceType;
$presentation = new Presentation("externalWorkbook.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$chartData = $chart->getChartData();
if (java_values($chartData->getDataSourceType()) == ChartDataSourceType::ExternalWorkbook) {
echo $chartData->getExternalWorkbookPath(), PHP_EOL;
} else {
echo "The chart does not use an external workbook.", PHP_EOL;
}
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
$presentation->save("Result.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Upravit data grafu
Data v externích sešitech můžete upravovat stejným způsobem, jako měníte obsah interních sešitů. Když se externí sešit nenačte, vyvolá se výjimka.
Tento příklad používá graf, který je první objekt na první snímek a je propojen s přístupným externím sešitem. Nastaví hodnotu buňky pro první datový bod v první řadě na 100 a uloží aktualizovanou prezentaci. Úprava hodnot buněk může aktualizovat propojený externí soubor XLSX, proto použijte kopii, pokud potřebujete zachovat originální sešit.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("presentation.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$series = $chart->getChartData()->getSeries();
if (java_values($series->size()) > 0 && java_values($series->get_Item(0)->getDataPoints()->size()) > 0) {
$valueCell = $series->get_Item(0)->getDataPoints()->get_Item(0)->getValue()->getAsCell();
if (!java_is_null($valueCell)) {
$valueCell->setValue(100);
$presentation->save("presentation_out.pptx", SaveFormat::Pptx);
} else {
echo "The first data point is not linked to a workbook cell.", PHP_EOL;
}
} else {
echo "The chart has no data points to edit.", PHP_EOL;
}
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
} 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í PHP příklad obnoví data sešitu pro graf, který je první objekt na první snímek a odkazuje na nedostupný externí sešit. Přistupuje k obnoveným datům přes Chart::getChartData a ChartData::getChartDataWorkbook:
use aspose\slides\Presentation;
use aspose\slides\SpreadsheetOptions;
use aspose\slides\LoadOptions;
$spreadsheetOptions = new SpreadsheetOptions();
$spreadsheetOptions->setRecoverWorkbookFromChartCache(true);
$loadOptions = new LoadOptions();
$loadOptions->setSpreadsheetOptions($spreadsheetOptions);
$presentation = new Presentation("presentation.pptx", $loadOptions);
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapeCount = java_values($slide->getShapes()->size());
if ($shapeCount > 0 && java_instanceof($slide->getShapes()->get_Item(0), new JavaClass("com.aspose.slides.IChart"))) {
$chart = $slide->getShapes()->get_Item(0);
$recoveredWorkbook = $chart->getChartData()->getChartDataWorkbook();
// Přečtěte nebo upravte obnovená data pracovního sešitu zde.
} else {
echo "The first shape is not a chart.", PHP_EOL;
}
} finally {
$presentation->dispose();
}
Pokud je externí sešit nedostupný a obnova je zakázána, Aspose.Slides vyvolá výjimku. Povolit obnovu jen tehdy, když je použití mezipaměti grafu přijatelné, 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 spojen s externím nebo vloženým sešitem?
Ano. Graf má data source type a path to an external workbook; pokud je zdroj externí sešit, můžete přečíst úplnou cestu a ověřit, ž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 složkách?
Ano, takové sešity lze použít jako externí zdroj dat. Úpravy vzdálených sešitů přímo z Aspose.Slides však nejsou podporovány — mohou být použity jen jako zdroj.
Přepisuje Aspose.Slides externí XLSX při ukládání prezentace?
Prezentace ukládá link to the external file. Úprava dat grafu založených na buňkách může také aktualizovat propojený lokální soubor XLSX. Použijte kopii sešitu, pokud musí originál zůstat nezměněn.
Co mám dělat, pokud je externí soubor chráněn heslem?
Aspose.Slides nepřijímá heslo při vytváření odkazu. Obvyklý přístup je odstranit ochranu předem nebo připravit dešifrovanou kopii (např. 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 odkazují na stejný soubor, aktualizace tohoto souboru se projeví v každém grafu při dalším načtení dat.

