Apply Chart Worksheet Formulas in Presentations in PHP

Áttekintés

A PowerPoint diagramok általában a forrásadataikat beágyazott munkalapon tárolják. Az Aspose.Slides for PHP via Java segítségével hozzáférhet ehhez a munkalaphoz a diagram adatkönyvtárán keresztül, beírhat bemeneti értékeket, képleteket rendelhet a cellákhoz, kiszámíthatja a támogatott képleteket, és a kiszámított cellákat diagramadatként használhatja.

Ez a cikk bemutatja a teljes képlet munkafolyamatot: diagram létrehozása, a munkalap feltöltése, A1‑ vagy R1C1‑stílusú képletek hozzárendelése, újraszámítása, a kiszámított értékek olvasása, ezeknek a celláknak a diagram sorozathoz kapcsolása, és a bemutató mentése. Emellett ismerteti a támogatott képletszintaxist, a beépített függvények részhalmazát, a gyorsítótárazott értékeket, a nem támogatott képleteket és a táblázat-specifikus hibákat.

Diagram munkalapok és képletek

Egy diagram munkalapja tartalmazza a kategóriákat, sorozatneveket és az értékeket, amelyeket a diagram használ. PowerPointban a munkalapot a diagram adat szerkesztőjének megnyitásával ellenőrizheti:

PowerPoint diagram a beágyazott munkalappal nyitva, a kategória‑ és sorozatadatok láthatók

Az Aspose.Slides-ben a munkalap a ChartDataWorkbook osztályon keresztül érhető el. A‑1‑stílusú képletekhez használja a ChartDataCell::setFormula metódust, az R1C1‑stílusú képletekhez a ChartDataCell::setR1C1Formula metódust. Bemeneti cellák vagy képletek módosítása után hívja a ChartDataWorkbook::calculateFormulas metódust a támogatott képletek újraszámításához és a megfelelő cellaértékek frissítéséhez.

Egy kiszámított cella továbbra is a ChartDataCell::getValue metóduson keresztül adja vissza az eredményt. Ez fontos, ha a kódban meg szeretné vizsgálni a képlet eredményét, vagy a cellát diagram adatpontként akarja használni.

Diagram létrehozása és a munkalap képleteinek számítása

Az alábbi példa egy vég‑el‑vég munkafolyamatot mutat be. Létrehoz egy csoportosított oszlopdiagramot, törli a mintaadatokat, beírja a negyedéves bevétel‑ és kiadásértékeket, képletekkel számolja a profitot, kiolvassa az eredményeket, a kiszámított cellákat diagramértékeként használja, és menti a bemutatót.

$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();
}

A diagram adatpontjai a D2:D4 tartományra hivatkoznak, így a diagram a kiszámított profitértékeket használja. Ebben a munkafolyamatban nincs külön diagram‑frissítési hívás: először számolja újra a munkafüzetet, majd használja vagy mentse a diagram adatokat, amelyek a kiszámított cellákra mutatnak.

A1‑stílusú képletek használata

Az A1 jelölés a oszlopokat betűkkel, a sorokat számokkal azonosítja. A‑1‑stílusú kifejezéseket a ChartDataCell::setFormula metódussal rendelheti.

$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();
}

A gyakori A1 hivatkozási formák:

Referencia Relatív Abszolút Vegyes
Cell A2 $A$2 A$2, $A2
Row 2:2 $2:$2
Column A:A $A:$A
Range A2:C4 $A$2:$C$4 A$2:$C4, $A2:C$4

A relatív hivatkozások megváltozhatnak, ha egy képletet egy táblázatkezelő alkalmazás áthelyez vagy másol. Az abszolút hivatkozások mindkét koordinátát rögzítik, míg a vegyes hivatkozások csak egy sort vagy egy oszlopot rögzítenek.

R1C1‑stílusú képletek használata

Az R1C1 jelölés a sorokat és oszlopokat egyaránt számmal azonosítja. A relatív hivatkozások négyzetes zárójelekben lévő eltolásokat használnak. Ezt a szintaxist a ChartDataCell::setR1C1Formula metódussal adhatja meg.

$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();
}

A gyakori R1C1 hivatkozási formák:

Referencia Relatív Abszolút Vegyes
Cell R[2]C[3] R2C3 R2C[3], R[2]C3
Row R[2] R2
Column C[3] C3
Range R[2]C[3]:R[5]C[7] R2C3:R5C7 R2C3:R[5]C[7], R[2]C3:R5C[7]

Például a D2 cellában az RC[-2] azt jelenti, hogy ugyanazon sorban két oszloppal balra lévő cella (B2).

Képlet állandók és operátorok

A beépített képletértékelő támogatja a logikai értékeket, numerikus literálokat, karakterláncokat, táblázat‑hibákat, aritmetikai operátorokat és összehasonlító operátorokat.

Állandók és literálok

Típus Példák Megjegyzés
Logikai TRUE, FALSE Közvetlenül használható logikai kifejezésekben, például A2=TRUE.
Numerikus 1, 0.5, .3, 1E-2 A közönséges és a tudományos jelölés egyaránt támogatott.
Karakterlánc "abc", "2/3/2020 12:00" A képleten belüli szövegliterálokat dupla idézőjelek közé kell tenni.
Hiba eredmény #DIV/0!, #N/A, #REF! Egy érvényes képlet a táblázat‑hibaértékek egyikére is kiértékelődhet a normál eredmény helyett.

Ez a példa több állandótípust használ:

$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()); // hamis
    $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();
}

Aritmetikai operátorok

Operátor Jelentés Példa
+ Összeadás vagy egyes jel 2+3
- Kivonás vagy negatív jel 2-3, -3
* Szorzás 2*3
/ Osztás 2/3
% Százalék 30%
^ Hatványozás 2^3

A kiértékelés sorrendjének egyértelművé tételéhez használjon zárójeleket, például (A2+B2)*C2.

Összehasonlító operátorok

Az összehasonlítási kifejezések logikai értékeket adnak vissza.

Operátor Jelentés Példa
= Egyenlő A2=3
<> Nem egyenlő A2<>3
> Nagyobb A2>3
>= Nagyobb vagy egyenlő A2>=3
< Kisebb A2<3
<= Kisebb vagy egyenlő A2<=3

Támogatott előre definiált függvények

Az Aspose.Slides tartalmaz egy beépített képletértékelőt diagram munkalapokhoz, de nem egy teljes Excel számítási motor. A dokumentált függvénykészlet az alábbiakra korlátozódik. Ne feltételezze, hogy egy tetszőleges Excel‑függvényt újra ki tud számítani a ChartDataWorkbook::calculateFormulas metódus.

Függvény Cél vagy támogatott forma Példa
ABS Abszolút érték ABS(A2)
AVERAGE Aritmetikai átlag AVERAGE(B2:B5)
CEILING Szám felfelé kerekítése egy többszörösre CEILING(A2,5)
CHOOSE Érték kiválasztása index alapján CHOOSE(A2,"Low","High")
CONCAT Szöveges értékek összefűzése CONCAT(A2,B2)
CONCATENATE Szöveges értékek összefűzése CONCATENATE(A2," ",B2)
DATE Dátumérték létrehozása a 1900‑as dátumrendszerrel DATE(2026,8,19)
DAYS Napok száma két dátum között DAYS(B2,A2)
FIND Egy szöveges érték keresése egy másikban FIND("-",A2)
FINDB Byte‑orientált szövegkeresés FINDB("a",A2)
IF Feltételes eredmény IF(A2>0,A2,0)
INDEX Referencia forma INDEX(A2:C4,2,3)
LOOKUP Vektor forma LOOKUP(A2,B2:B5,C2:C5)
MATCH Vektor forma MATCH(A2,B2:B5,0)
MAX Legnagyobb érték MAX(B2:B5)
SUM Összeg SUM(B2:B5)
VLOOKUP Vertikális keresés VLOOKUP(A2,B2:D10,3,FALSE)

A táblázatban szereplő korlátozások jelentősek: az INDEX referencia formában, míg a LOOKUP és a MATCH vektor formában van dokumentálva. A DATE a 1900‑as dátumrendszert használja. Az itt nem felsorolt funkciók és jellemzők azt jelentik, hogy az Aspose.Slides képletértékelőjük nem támogatja őket, hacsak másképp nincsenek dokumentálva.

Képletek számítása preferált kultúrával

Néhány diagram‑munkafüzet‑függvény a szöveget kultúra‑specifikus szabályok szerint interpretuálja. Ez különösen fontos azoknál a függvényeknél, amelyek a dupla‑bájtos karakterkészleteket (DBCS) használó nyelvekhez készültek. Az ilyen képletek helyes számításához hozzon létre egy LoadOptions objektumot, állítsa be a preferált kultúrát a SpreadsheetOptions::setPreferredCulture metódussal, adja át a táblázat‑opciókat a LoadOptions::setSpreadsheetOptions metódussal, majd töltse be a bemutatót.

Az alábbi példa a japán kultúrát választja, megnyit egy bemutatót a beállított betöltési opciókkal, és meghívja a ChartDataWorkbook::calculateFormulas metódust minden diagram‑munkafüzethez:

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();
}

A preferált kultúra a bemutató betöltési konfigurációjának része, ezért a Presentation példány létrehozása előtt kell beállítani. Használja a munkafüzet képletei által elvárt kultúrát; például a japán DBCS számítási szabályokhoz a ja-JP értéket kell megadni.

Újraszámítás és gyorsítótárazott értékek

A táblázat‑fájlok gyakran tárolják a képletet és az utolsó kiszámított értékét is. Az Aspose.Slides ezért képes egy gyorsítótárazott értéket beolvasni a ChartDataCell::getValue metóduson keresztül, amikor a bemutatót betöltik, és a kapcsolódó diagram‑adatok nem változtak.

A bemeneti cellák vagy képletek módosítása után ne támaszkodjon egy régi gyorsítótárazott eredményre. Hívja a ChartDataWorkbook::calculateFormulas metódust a kiszámított értékek olvasása vagy a diagram‑adatok mentése előtt, amelyek rájuk támaszkodnak.

A támogatott részhalmazon kívül eső képletek esetén az Aspose.Slides előfordulhat, hogy nem képes a képletet elemezni vagy a függőségeket meghatározni. Ha a munkafüzet módosult, a korábbi gyorsítótárazott érték már nem tekinthető megbízhatónak. Ebben a helyzetben egy nem támogatott adatú cella értékének olvasása CellUnsupportedDataException kivételt vált ki.

Ha diagramja olyan Excel‑függvényeket használ, amelyeket az Aspose.Slides nem értékel ki, számítsa ki ezeket a képleteket egy olyan táblázat‑motorral, amely támogatja őket, és írja vissza a kapott értékeket a diagram‑munkafüzetbe. Ne helyettesítse a nem támogatott képleteket kitalált értékekkel.

Képlet hibák kezelése

Kétféle problémát kell elkülöníteni.

Egy képlet lehet érvényes, de táblázat‑hibát eredményez, például #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF! vagy #VALUE!. Ebben az esetben a hiba‑token egy cella‑eredmény, és a ChartDataCell::getValue metódussal visszaadható.

Egy képlet hibát is jelezhet a feldolgozás, hivatkozás, függőség vagy támogatott adat szintjén. Az Aspose.Slides ezekre az esetekre táblázat‑specifikus kivételeket biztosít: CellInvalidFormulaException, CellInvalidReferenceException, CellCircularReferenceException és CellUnsupportedDataException.

PHP‑ban Java‑ként a Java‑kivétel a JavaException objektumon keresztül érhető el. Amikor a képletek sablonokból vagy felhasználói bemenetből származnak, kezelje őket az újraszámítás és az értéklekérdezés körül. A Java‑kivételt a stack‑trace tartalmazza, amely megmutatja a konkrét táblázati hibát:

$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();
}

Gyakorlati korlátok

A diagram‑munkalapok képlet‑támogatása egy meghatározott részhalmazra épül, nem teljes Excel‑kompatibilitásra. Tartsa szem előtt ezeket a korlátokat a jelentéskészítési munkafolyamat tervezésekor:

  • Használja csak a dokumentált állandókat, operátorokat, hivatkozásokat és függvényeket, ha azt szeretné, hogy az Aspose.Slides újraszámolja a képleteket.
  • Számítsa újra a cellákat, amelyektől a képlet‑eredmények függenek.
  • Tekintse a betöltött bemutatókból származó gyorsítótárazott értékeket pillanatképként, nem pedig az szerkesztés után történő újraszámítás helyettesítőjeként.
  • Tesztelje a létező sablonokból származó képleteket, mielőtt a kiszámított értékekre támaszkodna, különösen, ha olyan függvényeket tartalmaznak, amelyek nincsenek a dokumentált listán.
  • A teljes táblázat‑számítási motorozást igénylő képleteket számítsa ki külsőleg, majd frissítse a diagram‑munkafüzetet a kapott értékekkel.

GYIK

Mi a különbség a ChartDataCell::setFormula és a ChartDataCell::setR1C1Formula között?

A ChartDataCell::setFormula A1‑stílusú kifejezést tárol, például B2-C2. A ChartDataCell::setR1C1Formula R1C1‑stílusú kifejezést tárol, például RC[-2]-RC[-1]. A használni kívánt jelölés attól függ, hogy hogyan generál vagy másol képleteket.

A számítás után a cellát vagy annak értékét kell olvasnom?

A ChartDataWorkbook::getCell egy ChartDataCell objektumot ad vissza. A kiszámított eredményhez a cella ChartDataCell::getValue metódusát kell meghívni az újraszámítás után.

Mikor kell meghívni a ChartDataWorkbook::calculateFormulas metódust?

Hívja a ChartDataWorkbook::calculateFormulas metódust a bemeneti értékek vagy képletek módosítása után, és még az előtt, hogy a kiszámított eredményeket felhasználná. Ez frissíti a beépített értékelő által támogatott képletek értékeit.

Támogatja-e az Aspose.Slides az összes Excel‑függvényt?

Nem. A beépített értékelő egy dokumentált függvény‑részhalmazt támogat. A részhalmazon kívül eső függvényekre nem szabad számítani, hogy helyesen újra lesznek számolva. Ha teljes Excel‑képlet kompatibilitásra van szükség, végezze el a számítást egy megfelelő táblázat‑motorral, és írja az eredményt a diagram‑munkafüzetbe.

Mi történik, ha egy betöltött bemutató nem támogatott képletet tartalmaz?

Ha a diagram‑adatok nem változtak, a munkafüzet a korábban kiszámított gyorsítótárazott értéket tartalmazhatja. A kapcsolódó adatok módosítása után ez a gyorsítótárazott érték már nem érvényes. Egy olyan cella elérése, amelynek képletét nem tudja kezelni, CellUnsupportedDataException kivételt vált ki.

Ugyanazok a képlet‑hibák, mint a PHP‑kivételek?

Nem. A #DIV/0!‑hoz hasonló eredmény egy táblázat‑érték, amely egy érvényes számításból származik. A táblázat‑feldolgozási hibákat, mint a CellInvalidFormulaException vagy a CellCircularReferenceException, Java‑kivételek jelzik, és a PHP‑ban a JavaException objektumon keresztül érhetők el.

Frissül automatikusan a diagram, ha egy képlet‑cellát módosítanak?

A diagram‑sorozat hivatkozhat munkafüzet‑cellákra. Először számítsa újra a munkafüzetet, majd mentse vagy renderelje a bemutatót. Ha a diagram adatpontjai a kiszámított cellákra mutatnak, a diagram a frissített értékeket használja; külön diagram‑frissítési metódusra nincs szükség ebben a munkafolyamatban.

Használhatók külső Excel‑munkafüzetek a diagramokhoz?

Igen, a diagram‑adatok konfigurálhatók úgy, hogy külső munkafüzetet használjanak a diagram‑adat‑API‑val. Azonban ebben a cikkben leírt képlet‑számítási munkafolyamat kizárólag a diagram‑adat‑munkafüzetre és az Aspose.Slides által értékelt képlet‑részhalmazra vonatkozik. Ne tételezze fel, hogy a ChartDataWorkbook::calculateFormulas teljes újraszámítást végez tetszőleges képletekkel egy külső XLSX fájlban.

Használhatók képletek, amelyek más munkalapra vagy munkafüzetre hivatkoznak?

Az Excel‑stílusú hivatkozások előfordulhatnak a diagram‑munkafüzetekben, de a képlet‑értékelés a támogatott elemző és függvény‑készlet által korlátozott. Ha kereszt‑lap vagy külső hivatkozás elengedhetetlen, ellenőrizze a konkrét képletet a használt Aspose.Slides verzióval. Szélesebb Excel‑hivatkozási kompatibilitást igénylő munkafolyamatok esetén számítsa ki a munkafüzetet külsőleg, és írja vissza a feloldott értékeket a diagram‑adatokba.

Kell-e a képletszöveg = karakterrel kezdődjön?

Az Aspose.Slides API példák a B2-C2 vagy SUM(B2:B5) formát használják, azaz vezető = nélkül. Ennek a formátumnak a használata összhangban van a dokumentált API‑példákkal.