Použití vzorců listu grafu v prezentacích v PHP

Přehled

Grafy v PowerPointu obvykle ukládají svá zdrojová data do vloženého listu. V Aspose.Slides pro PHP přes Java můžete k tomuto listu přistupovat prostřednictvím sešitu dat grafu, zapisovat vstupní hodnoty, přiřazovat buňkám vzorce, vypočítávat podporované vzorce a použít vypočítané buňky jako data grafu.

Tento článek vysvětluje kompletní postup práce s vzorci: vytvořit graf, naplnit jeho list, přiřadit vzorce ve stylu A1 nebo R1C1, přepočítat je, přečíst vypočítané hodnoty, propojit tyto buňky s řadou grafu a uložit prezentaci. Také popisuje podporovanou syntaxi vzorců, vestavěnou podmnožinu funkcí, kešované hodnoty, nepodporované vzorce a chyby specifické pro tabulky.

Listy grafu a vzorce

List grafu obsahuje kategorie, názvy sérií a hodnoty používané grafem. V PowerPointu můžete list prohlédnout otevřením editoru dat grafu:

Graf PowerPoint s otevřeným vloženým listem, zobrazující data kategorií a sérií

V Aspose.Slides je list vystaven prostřednictvím třídy ChartDataWorkbook. Použijte ChartDataCell::setFormula pro vzorce ve stylu A1 a ChartDataCell::setR1C1Formula pro vzorce ve stylu R1C1. Po změně vstupních buněk nebo vzorců zavolejte ChartDataWorkbook::calculateFormulas pro přepočítání podporovaných vzorců a aktualizaci odpovídajících hodnot buněk.

Vypočítaná buňka stále poskytuje svůj výsledek prostřednictvím ChartDataCell::getValue. To je důležité, když potřebujete v kódu zkontrolovat výsledek vzorce nebo použít buňku jako datový bod grafu.

Vytvoření grafu a výpočet vzorců v listu

Níže uvedený příklad demonstruje kompletní postup. Vytvoří seskupený sloupcový graf, vymaže ukázková data, zapíše čtvrtletní příjmy a výdaje, vypočítá zisk pomocí vzorců, přečte výsledky, použije vypočítané buňky jako hodnoty grafu a uloží prezentaci.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 600, 350);
    $workbook = $chart->getChartData()->getChartDataWorkbook();
    $worksheetIndex = 0;

    $chart->getChartData()->getSeries()->clear();
    $chart->getChartData()->getCategories()->clear();
    $workbook->clear($worksheetIndex);

    $category1 = $workbook->getCell($worksheetIndex, "A2", "Q1");
    $category2 = $workbook->getCell($worksheetIndex, "A3", "Q2");
    $category3 = $workbook->getCell($worksheetIndex, "A4", "Q3");

    $workbook->getCell($worksheetIndex, "B1", "Revenue");
    $workbook->getCell($worksheetIndex, "C1", "Expenses");
    $workbook->getCell($worksheetIndex, "D1", "Profit");

    $workbook->getCell($worksheetIndex, "B2")->setValue(120.0);
    $workbook->getCell($worksheetIndex, "C2")->setValue(80.0);
    $workbook->getCell($worksheetIndex, "B3")->setValue(150.0);
    $workbook->getCell($worksheetIndex, "C3")->setValue(95.0);
    $workbook->getCell($worksheetIndex, "B4")->setValue(135.0);
    $workbook->getCell($worksheetIndex, "C4")->setValue(110.0);

    $profit1 = $workbook->getCell($worksheetIndex, "D2");
    $profit2 = $workbook->getCell($worksheetIndex, "D3");
    $profit3 = $workbook->getCell($worksheetIndex, "D4");

    $profit1->setFormula("B2-C2");
    $profit2->setFormula("B3-C3");
    $profit3->setFormula("B4-C4");

    $workbook->calculateFormulas();

    $q1Profit = java_values($profit1->getValue()); // 40
    $q2Profit = java_values($profit2->getValue()); // 55
    $q3Profit = java_values($profit3->getValue()); // 25

    echo "Q1 profit: " . $q1Profit . PHP_EOL;
    echo "Q2 profit: " . $q2Profit . PHP_EOL;
    echo "Q3 profit: " . $q3Profit . PHP_EOL;

    $chart->getChartData()->getCategories()->add($category1);
    $chart->getChartData()->getCategories()->add($category2);
    $chart->getChartData()->getCategories()->add($category3);

    $profitSeries = $chart->getChartData()->getSeries()->add($workbook->getCell($worksheetIndex, "D1"), $chart->getType());
    $profitSeries->getDataPoints()->addDataPointForBarSeries($profit1);
    $profitSeries->getDataPoints()->addDataPointForBarSeries($profit2);
    $profitSeries->getDataPoints()->addDataPointForBarSeries($profit3);
    $profitSeries->getLabels()->getDefaultDataLabelFormat()->setShowValue(true);

    $presentation->save("chart-formulas.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Datové body grafu odkazují na D2:D4, takže graf používá vypočítané hodnoty zisku. V tomto postupu neexistuje samostatné volání pro obnovení grafu: nejprve přepočítejte sešit, poté použijte nebo uložte data grafu, která odkazují na vypočítané buňky.

Použití vzorců ve stylu A1

Notace A1 identifikuje sloupce písmeny a řádky čísly. Přiřaďte výrazy ve stylu A1 prostřednictvím ChartDataCell::setFormula.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $workbook = $chart->getChartData()->getChartDataWorkbook();

    $workbook->getCell(0, "C3")->setValue(10);
    $workbook->getCell(0, "F2")->setValue(2);
    $workbook->getCell(0, "G2")->setValue(3);
    $workbook->getCell(0, "H2")->setValue(4);

    $cell = $workbook->getCell(0, "A2");
    $cell->setFormula("C3+SUM(F2:H2)");

    $workbook->calculateFormulas();

    $value = java_values($cell->getValue()); // 19
} finally {
    $presentation->dispose();
}

Běžné formy odkazů ve stylu A1 jsou:

Odkaz Relativní Absolutní Smíšený
Buňka A2 $A$2 A$2, $A2
Řádek 2:2 $2:$2
Sloupec A:A $A:$A
Rozsah A2:C4 $A$2:$C$4 A$2:$C4, $A2:C$4

Relativní odkazy se mohou změnit, když je vzorec přesunut nebo zkopírován v tabulkovém editoru. Absolutní odkazy udržují oba souřadnice pevně, zatímco smíšené odkazy fixují pouze řádek nebo sloupec.

Použití vzorců ve stylu R1C1

Notace R1C1 identifikuje řádky i sloupce číselně. Relativní odkazy používají posuny v hranatých závorkách. Tento syntax přiřaďte prostřednictvím ChartDataCell::setR1C1Formula.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $workbook = $chart->getChartData()->getChartDataWorkbook();

    $workbook->getCell(0, "B2")->setValue(12);
    $workbook->getCell(0, "C2")->setValue(5);

    $cell = $workbook->getCell(0, "D2");
    $cell->setR1C1Formula("RC[-2]-RC[-1]");

    $workbook->calculateFormulas();

    $value = java_values($cell->getValue()); // 7
} finally {
    $presentation->dispose();
}

Běžné formy odkazů ve stylu R1C1 jsou:

Odkaz Relativní Absolutní Smíšený
Buňka R[2]C[3] R2C3 R2C[3], R[2]C3
Řádek R[2] R2
Sloupec C[3] C3
Rozsah R[2]C[3]:R[5]C[7] R2C3:R5C7 R2C3:R[5]C[7], R[2]C3:R5C[7]

Například v buňce D2 výraz RC[-2] znamená buňku ve stejném řádku o dva sloupce vlevo (B2).

Konstanty a operátory ve vzorcích

Vestavěný vyhodnocovač vzorců podporuje logické hodnoty, číselné literály, řetězce, chybové hodnoty tabulky, aritmetické operátory a relační operátory.

Konstanty a literály

Typ Příklady Poznámky
Logická TRUE, FALSE Lze použít přímo v logických výrazech, jako je A2=TRUE.
Číselná 1, 0.5, .3, 1E-2 Podporována je běžná i vědecká notace.
Řetězcová "abc", "2/3/2020 12:00" Textové literály jsou ve vzorci uzavřeny v dvojitých uvozovkách.
Chybový výsledek #DIV/0!, #N/A, #REF! Platný vzorec může vyhodnotit chybovou hodnotu tabulky místo normálního výsledku.

Tento příklad používá několik typů konstant:

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $workbook = $chart->getChartData()->getChartDataWorkbook();

    $workbook->getCell(0, "A2")->setValue(false);
    $workbook->getCell(0, "B2")->setFormula("A2=TRUE");
    $workbook->getCell(0, "C2")->setFormula("1+0.5");
    $workbook->getCell(0, "D2")->setFormula(".3*1E-2");
    $workbook->getCell(0, "E2")->setFormula("\"abc\"");
    $workbook->getCell(0, "F2")->setFormula("2/0");

    $workbook->calculateFormulas();

    $logicalValue = java_values($workbook->getCell(0, "B2")->getValue()); // false
    $numericValue = java_values($workbook->getCell(0, "C2")->getValue()); // 1.5
    $scientificValue = java_values($workbook->getCell(0, "D2")->getValue()); // 0.003
    $stringValue = java_values($workbook->getCell(0, "E2")->getValue()); // abc
    $errorValue = java_values($workbook->getCell(0, "F2")->getValue()); // #DIV/0!
} finally {
    $presentation->dispose();
}

Aritmetické operátory

Operátor Význam Příklad
+ Sčítání nebo unární plus 2+3
- Odečítání nebo záporné 2-3, -3
* Násobení 2*3
/ Dělení 2/3
% Procento 30%
^ Mocnina 2^3

Použijte závorky pro explicitní určení pořadí výpočtu, například (A2+B2)*C2.

Relační operátory

Operátor Význam Příklad
= Rovná se A2=3
<> Není rovno A2<>3
> Větší než A2>3
>= Větší nebo rovno A2>=3
< Menší než A2<3
<= Menší nebo rovno A2<=3

Podporované předdefinované funkce

Aspose.Slides obsahuje vestavěný vyhodnocovač vzorců pro listy grafů, ale nejedná se o kompletní výpočetní engine Excelu. Dokumentovaná sada funkcí je omezena na funkce níže. Nepředpokládejte, že libovolnou Excel funkci lze přepočítat pomocí ChartDataWorkbook::calculateFormulas.

Funkce Účel nebo podpořený tvar Příklad
ABS Absolutní hodnota ABS(A2)
AVERAGE Aritmetický průměr AVERAGE(B2:B5)
CEILING Zaokrouhlení čísla nahoru na násobek CEILING(A2,5)
CHOOSE Výběr hodnoty podle indexu CHOOSE(A2,"Low","High")
CONCAT Spojení textových hodnot CONCAT(A2,B2)
CONCATENATE Spojení textových hodnot CONCATENATE(A2," ",B2)
DATE Vytvoření hodnoty data pomocí systému dat 1900 DATE(2026,8,19)
DAYS Vrátí počet dní mezi daty DAYS(B2,A2)
FIND Najde jeden textový řetězec uvnitř druhého FIND("-",A2)
FINDB Vyhledávání textu po bajtech FINDB("a",A2)
IF Podmíněný výsledek IF(A2>0,A2,0)
INDEX Forma odkazu INDEX(A2:C4,2,3)
LOOKUP Vektorová forma LOOKUP(A2,B2:B5,C2:C5)
MATCH Vektorová forma MATCH(A2,B2:B5,0)
MAX Maximální hodnota MAX(B2:B5)
SUM Součet hodnot SUM(B2:B5)
VLOOKUP Vertikální hledání VLOOKUP(A2,B2:D10,3,FALSE)

Omezení uvedená v tabulce jsou významná: INDEX je dokumentována ve formě odkazu, zatímco LOOKUP a MATCH jsou dokumentovány ve své vektorové formě. DATE používá systém datum 1900. Funkce a vlastnosti, které zde nejsou uvedeny, by měly být považovány za nepodporované vyhodnocovačem vzorců Aspose.Slides, pokud nejsou dokumentovány zvlášť.

Výpočet vzorců s preferovanou kulturou

Některé funkce sešitu grafu interpretují text podle pravidel specifických pro kulturu. To je zvláště důležité pro funkce určené pro jazyky používající dvojbajtové znakové sady (DBCS). Pro správný výpočet takových vzorců vytvořte LoadOptions, nastavte preferovanou kulturu pomocí SpreadsheetOptions::setPreferredCulture, přiřaďte možnosti tabulky přes LoadOptions::setSpreadsheetOptions, a potom načtěte prezentaci.

Následující příklad vybírá japonskou kulturu, otevře prezentaci s nakonfigurovanými možnostmi načítání a zavolá ChartDataWorkbook::calculateFormulas pro každý sešit grafu:

use aspose\slides\LoadOptions;
use aspose\slides\Presentation;
use aspose\slides\SpreadsheetOptions;

$japaneseCulture = new Java("java.util.Locale", "ja", "JP");

$spreadsheetOptions = new SpreadsheetOptions();
$spreadsheetOptions->setPreferredCulture($japaneseCulture);

$loadOptions = new LoadOptions();
$loadOptions->setSpreadsheetOptions($spreadsheetOptions);

$chartClass = new JavaClass("com.aspose.slides.IChart");
$presentation = new Presentation("presentation.pptx", $loadOptions);
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, $chartClass)) {
                $shape->getChartData()->getChartDataWorkbook()->calculateFormulas();
            }
        }
    }
} finally {
    $presentation->dispose();
}

Preferovaná kultura je součástí konfigurace načítání prezentace, takže ji nastavte před vytvořením instance Presentation. Použijte kulturu očekávanou vzorci v sešitu; například použijte ja-JP pro vzorce, které mají následovat japonská pravidla výpočtu DBCS.

Přepočítání a kešované hodnoty

Tabulkové soubory obvykle ukládají jak vzorec, tak jeho naposledy vypočítanou hodnotu. Aspose.Slides tak může číst kešovanou hodnotu z ChartDataCell::getValue, když je prezentace načtena a příslušná data grafu nebyla změněna.

Po změně vstupních buněk nebo vzorců se nespoléhejte na starý kešovaný výsledek. Před čtením vypočítaných hodnot nebo uložením dat grafu, které na nich závisí, zavolejte ChartDataWorkbook::calculateFormulas.

U vzorců mimo podporovanou podmnožinu může Aspose.Slides nedokázat vzorec parsovat nebo stanovit jeho závislosti. Pokud byl sešit upraven, předchozí kešovaná hodnota již nemůže být považována za spolehlivou. V takové situaci může čtení hodnoty buňky s nepodporovanými daty vyvolat CellUnsupportedDataException.

Pokud váš graf závisí na Excel funkcích, které Aspose.Slides nevyhodnocuje, vypočítejte tyto vzorce pomocí tabulkového enginu, který je podporuje, a zapište výsledné hodnoty zpět do sešitu grafu. Nepřepisujte nepodporované vzorce odhadovanými hodnotami.

Zpracování chyb ve vzorcích

Existují dva různá typy problémů, které je třeba rozlišovat.

Vzorec může být platný, ale vyprodukovat chybový výsledek tabulky, jako je #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF! nebo #VALUE!. V takovém případě je chybový token výsledkem buňky a může být vrácen prostřednictvím ChartDataCell::getValue.

Vzorec může také selhat na úrovni parsování, odkazu, závislosti nebo podporovaných dat. Aspose.Slides poskytuje pro tyto případy výjimky specifické pro tabulky: CellInvalidFormulaException, CellInvalidReferenceException, CellCircularReferenceException, a CellUnsupportedDataException.

V PHP přes Java jsou výjimky Java předkládány prostřednictvím JavaException. Když vzorce pocházejí ze šablon nebo uživatelského vstupu, ošetřete je kolem přepočítání a přístupu k hodnotám. Java výjimka uvedená ve stack trace identifikuje konkrétní selhání tabulky:

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $workbook = $chart->getChartData()->getChartDataWorkbook();
    $cell = $workbook->getCell(0, "A2");
    $cell->setFormula("SUM(B2:B5)");

    try {
        $workbook->calculateFormulas();
        echo java_values($cell->getValue()) . PHP_EOL;
    } catch (JavaException $ex) {
        $ex->printStackTrace();
    }
} finally {
    $presentation->dispose();
}

Praktická omezení

Podpora vzorců v listech grafů je určena pro definovanou podmnožinu výpočtů v tabulkách, nikoli pro úplnou kompatibilitu s Excelem. Mějte tyto omezení na paměti při navrhování pracovního postupu reportování:

  • Používejte pouze dokumentované konstanty, operátory, odkazy a funkce, pokud potřebujete, aby Aspose.Slides přepočítával vzorce.
  • Přepočítejte po změně buněk, na nichž výsledky vzorců závisí.
  • Považujte kešované hodnoty z načtených prezentací za snímky, nikoli za náhradu přepočítání po úpravách.
  • Otestujte vzorce z existujících šablon, než se spolehnete na jejich vypočítané hodnoty, zejména pokud používají funkce mimo dokumentovaný seznam.
  • U vzorců, které vyžadují kompletní výpočetní engine tabulek, je vypočítejte externě a poté aktualizujte sešit grafu výslednými hodnotami.

FAQ

Jaký je rozdíl mezi ChartDataCell::setFormula a ChartDataCell::setR1C1Formula?

ChartDataCell::setFormula ukládá výraz ve stylu A1, např. B2-C2. ChartDataCell::setR1C1Formula ukládá výraz ve stylu R1C1, např. RC[-2]-RC[-1]. Použijte notaci, která nejlépe odpovídá tomu, jak vzorce generujete nebo kopírujete.

Potřebuji po výpočtu číst samotnou buňku nebo její hodnotu?

ChartDataWorkbook::getCell vrací ChartDataCell. Pro získání vypočítaného výsledku zavolejte metodou ChartDataCell::getValue této buňky po přepočítání.

Kdy bych měl zavolat ChartDataWorkbook::calculateFormulas?

Zavolejte ChartDataWorkbook::calculateFormulas po změně vstupních hodnot nebo vzorců a před tím, než budete záviset na vypočítaných výsledcích. Tím se aktualizují hodnoty vzorců, které podporuje vestavěný evaluátor.

Podporuje Aspose.Slides každou funkci Excelu?

Ne. Vestavěný evaluátor podporuje dokumentovanou podmnožinu funkcí. Funkce mimo tuto podmnožinu by neměly být považovány za správně přepočítatelné. Pokud je vyžadována úplná kompatibilita s Excelovými vzorci, proveďte výpočet pomocí vhodného tabulkového enginu a zapište finální hodnoty do sešitu grafu.

Co se stane, pokud načtená prezentace obsahuje nepodporovaný vzorec?

Pokud data grafu nebyla změněna, může sešit stále obsahovat dříve vypočítanou kešovanou hodnotu. Po úpravě souvisejících dat tato kešovaná hodnota může být neplatná. Přístup k buňce, jejíž vzorec nelze zpracovat, může vyvolat CellUnsupportedDataException.

Jsou hodnoty chyb ve vzorcích stejné jako PHP výjimky?

Ne. Výsledek jako #DIV/0! je hodnota tabulky vytvořená platným výpočtem. Selhání zpracování tabulky, jako jsou CellInvalidFormulaException nebo CellCircularReferenceException, jsou Java výjimky předkládány PHP přes JavaException.

Aktualizuje se graf automaticky, když se změní buňka se vzorcem?

Řada grafu může odkazovat na buňky sešitu. Nejprve přepočítejte sešit, poté uložte nebo vykreslete prezentaci. Pokud datové body grafu odkazují na vypočítané buňky, graf použije tyto aktualizované hodnoty; pro tento postup není vyžadována samostatná metoda obnovy grafu.

Mohou grafy používat externí sešit Excel?

Ano, data grafu lze nakonfigurovat tak, aby používala externí sešit přes API dat grafu. Nicméně workflow výpočtu vzorců popsaný v tomto článku se týká sešitu dat grafu a podmnožiny vzorců vyhodnocovaných Aspose.Slides. Nepředpokládejte, že ChartDataWorkbook::calculateFormulas poskytuje kompletní přepočet libovolných vzorců v externím souboru XLSX.

Mohu použít vzorce, které odkazují na jiný list nebo sešit?

Odkazy ve stylu Excelu mohou v sešitech grafů existovat, ale vyhodnocování vzorců je omezeno podporovaným parserem a množinou funkcí. Pokud je křížový odkaz na list nebo externí sešit nezbytný, ověřte přesný vzorec s vaší cílovou verzí Aspose.Slides. Pro workflow, který vyžaduje širokou kompatibilitu s Excel odkazy, vypočítejte sešit externě a zpětně zapište získané hodnoty do dat grafu.

Měly by řetězce vzorců začínat znakem =?

Příklady API Aspose.Slides přiřazují výrazy jako B2-C2 nebo SUM(B2:B5) bez úvodního =. Použití této podoby udržuje generované vzorce v souladu s dokumentovanými příklady API.