Použít vzorce listu grafu v prezentacích na Androidu

Přehled

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

Tento článek vysvětluje kompletní workflow vzorce: vytvoření grafu, naplnění jeho listu, přiřazení vzorců ve stylu A1 nebo R1C1, jejich přepočet, čtení vypočtených hodnot, propojení těchto buněk s řadou grafu a uložení prezentace. Také popisuje podporovanou syntaxi vzorců, podmnožinu vestavěných funkcí, kešované hodnoty, nepodporované vzorce a chyby specifické pro tabulkové procesory.

Listy grafu a vzorce

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

Graf PowerPointu s otevřeným vloženým listem, zobrazující data kategorií a řad

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

Vypočítaná buňka stále poskytuje svůj výsledek přes IChartDataCell.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ásledující příklad demonstruje celý workflow. Vytvoří sloupcový seskupený graf, vyprázdní ukázková data, zapíše čtvrtletní příjmy a výdaje, vypočítá zisk pomocí vzorců, načte výsledky, použije vypočtené buňky jako hodnoty grafu a uloží prezentaci.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 600, 350);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    int worksheetIndex = 0;

    chart.getChartData().getSeries().clear();
    chart.getChartData().getCategories().clear();
    workbook.clear(worksheetIndex);

    IChartDataCell category1 = workbook.getCell(worksheetIndex, "A2", "Q1");
    IChartDataCell category2 = workbook.getCell(worksheetIndex, "A3", "Q2");
    IChartDataCell 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);

    IChartDataCell profit1 = workbook.getCell(worksheetIndex, "D2");
    IChartDataCell profit2 = workbook.getCell(worksheetIndex, "D3");
    IChartDataCell profit3 = workbook.getCell(worksheetIndex, "D4");

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

    workbook.calculateFormulas();

    double q1Profit = ((Number) profit1.getValue()).doubleValue(); // 40
    double q2Profit = ((Number) profit2.getValue()).doubleValue(); // 55
    double q3Profit = ((Number) profit3.getValue()).doubleValue(); // 25

    System.out.println("Q1 profit: " + q1Profit);
    System.out.println("Q2 profit: " + q2Profit);
    System.out.println("Q3 profit: " + q3Profit);

    chart.getChartData().getCategories().add(category1);
    chart.getChartData().getCategories().add(category2);
    chart.getChartData().getCategories().add(category3);

    IChartSeries 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čtené hodnoty zisku. V tomto workflow neexistuje samostatné volání pro obnovení grafu: nejprve přepočtěte sešit a poté použijte nebo uložte grafová data, která ukazují na vypočtené 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 pomocí IChartDataCell.setFormula.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook 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);

    IChartDataCell cell = workbook.getCell(0, "A2");
    cell.setFormula("C3+SUM(F2:H2)");

    workbook.calculateFormulas();

    Object value = cell.getValue(); // 19
} finally {
    presentation.dispose();
}

Běžné formy odkazů 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 tabulkovým procesorem. Absolutní odkazy mají oba souřadnice pevně dané, zatímco smíšené odkazy fixují jen řá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. Přiřaďte tuto syntaxi pomocí IChartDataCell.setR1C1Formula.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();

    workbook.getCell(0, "B2").setValue(12);
    workbook.getCell(0, "C2").setValue(5);

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

    workbook.calculateFormulas();

    Object value = cell.getValue(); // 7
} finally {
    presentation.dispose();
}

Běžné formy odkazů 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 znamená RC[-2] buňku ve stejném řádku dva sloupce vlevo (B2).

Konstanty a operátory ve vzorcích

Vestavěný evaluátor vzorců podporuje logické hodnoty, číselné literály, řetězce, chybové hodnoty tabulkového procesoru, 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, např. A2=TRUE.
Číselná 1, 0.5, .3, 1E-2 Podporována běžná i vědecká notace.
Řetězec "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 na chybu tabulkového procesoru místo normálního výsledku.

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

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook 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();

    Object logicalValue = workbook.getCell(0, "B2").getValue(); // nepravda
    Object numericValue = workbook.getCell(0, "C2").getValue(); // 1.5
    Object scientificValue = workbook.getCell(0, "D2").getValue(); // 0.003
    Object stringValue = workbook.getCell(0, "E2").getValue(); // abc
    Object errorValue = 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
- Odčítání nebo negace 2-3, -3
* Násobení 2*3
/ Dělení 2/3
% Procento 30%
^ Umocnění 2^3

Používejte závorky pro explicitní určení pořadí vyhodnocení, např. (A2+B2)*C2.

Relační operátory

Relační výrazy vrací logické hodnoty.

Operátor Význam Příklad
= Rovná se A2=3
<> Nerovná se 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ý evaluátor vzorců pro listy grafu, ale nejedná se o kompletní výpočetní engine Excelu. Dokumentovaný soubor funkcí je omezen na níže uvedené funkce. Nepředpokládejte, že libovolná funkce Excelu může být přepočítána pomocí IChartDataWorkbook.calculateFormulas.

Funkce Účel nebo podpora 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í datové hodnoty pomocí systému dat 1900 DATE(2026,8,19)
DAYS Počet dnů mezi daty DAYS(B2,A2)
FIND Najde jeden text v jiném 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í vyhledávání VLOOKUP(A2,B2:D10,3,FALSE)

Omezení v tabulce jsou podstatná: INDEX je dokumentován ve formě odkazu, zatímco LOOKUP a MATCH jsou dokumentovány ve svých vektorových formách. DATE používá systém dat 1900. Funkce, které zde nejsou uvedeny, by měly být považovány za nepodporované vestavěným evaluátorem Aspose.Slides, pokud nejsou zdokumentovány samostatně.

Vypočítat vzorce s preferovanou kulturou

Některé funkce sešitu interpretují text podle kulturně specifických pravidel. To je obzvláš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 sešitu přes LoadOptions.setSpreadsheetOptions, a poté načtěte prezentaci.

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

import com.aspose.slides.*;
import java.util.Locale;

Locale japaneseCulture = Locale.forLanguageTag("ja-JP");

ISpreadsheetOptions spreadsheetOptions = new SpreadsheetOptions();
spreadsheetOptions.setPreferredCulture(japaneseCulture);

LoadOptions loadOptions = new LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);

Presentation presentation = new Presentation("presentation.pptx", loadOptions);
try {
    for (ISlide slide : presentation.getSlides()) {
        for (IShape shape : slide.getShapes()) {
            if (shape instanceof IChart) {
                IChart chart = (IChart) shape;
                chart.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, kterou očekávají vzorce sešitu; např. ja-JP pro vzorce, které mají dodržovat japonská DBCS pravidla výpočtu.

Přepočet a uložené hodnoty

Tabulkové soubory často ukládají jak vzorec, tak jeho naposledy vypočtenou hodnotu. Aspose.Slides může proto při načtení prezentace přečíst uloženou hodnotu z IChartDataCell.getValue pokud se data grafu mezitím nezměnila.

Po změně vstupních buněk nebo vzorců nespoléhejte na starý uložený výsledek. Zavolejte IChartDataWorkbook.calculateFormulas před čtením vypočtených hodnot nebo před uložením grafových dat, která na nich závisí.

U vzorců mimo podporovanou podmnožinu může Aspose.Slides nedokázat vzorec parsovat nebo zjistit jeho závislosti. Pokud byl sešit změněn, předchozí uložená hodnota již nemusí být spolehlivá. V takové situaci může čtení hodnoty buňky s nepodporovanými daty vyvolat CellUnsupportedDataException.

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

Zpracování chyb ve vzorcích

Existují dva odlišné typy problémů.

Vzorec může být platný, ale vyprodukovat výsledek chyby tabulkového procesoru, např. #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF! nebo #VALUE!. V takovém případě je chybový token výsledkem buňky a lze jej získat přes IChartDataCell.getValue.

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

Když vzorce pocházejí ze šablon nebo uživatelského vstupu, obalte tato volání výjimečným ošetřením při přepočtu a přístupu k hodnotám:

import com.aspose.slides.*;

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

    try {
        workbook.calculateFormulas();
        System.out.println(cell.getValue());
    } catch (CellInvalidFormulaException ex) {
        System.err.println("Invalid formula: " + ex.getMessage());
    } catch (CellInvalidReferenceException ex) {
        System.err.println("Invalid cell reference: " + ex.getMessage());
    } catch (CellCircularReferenceException ex) {
        System.err.println("Circular reference: " + ex.getMessage());
    } catch (CellUnsupportedDataException ex) {
        System.err.println("Unsupported spreadsheet data: " + ex.getMessage());
    }
} finally {
    presentation.dispose();
}

Praktická omezení

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

  • Používejte jen dokumentované konstanty, operátory, odkazy a funkce, pokud chcete, aby Aspose.Slides přepočítal vzorce.
  • Přepočtěte po změně buněk, na nichž výsledky vzorců závisí.
  • Považujte uložené hodnoty z načtených prezentací za snapshoty, ne za náhradu přepočtu po úpravách.
  • Otestujte vzorce z existujících šablon před spoleháním se na jejich vypočtené hodnoty, zejména pokud používají funkce mimo dokumentovaný seznam.
  • Pro vzorce, které vyžadují kompletní tabulkový výpočetní engine, je vypočítejte externě a poté aktualizujte sešit grafu získanými hodnotami.

Často kladené otázky

Jaký je rozdíl mezi IChartDataCell.setFormula a IChartDataCell.setR1C1Formula?

IChartDataCell.setFormula ukládá výraz ve stylu A1, např. B2-C2. IChartDataCell.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.

Musím po výpočtu číst samotnou buňku nebo její hodnotu?

IChartDataWorkbook.getCell vrací IChartDataCell. Pro získání vypočteného výsledku zavolejte metodu IChartDataCell.getValue na tuto buňku po přepočtu.

Kdy mám volat IChartDataWorkbook.calculateFormulas?

Zavolejte IChartDataWorkbook.calculateFormulas po změně vstupních hodnot nebo vzorců a před tím, než budete spoléhat na vypočtené výsledky. Tím se aktualizují hodnoty vzorců, které vestavěný evaluátor podporuje.

Podporuje Aspose.Slides každou Excelovou funkci?

Ne. Vestavěný evaluátor podporuje pouze dokumentovanou podmnožinu funkcí. Funkce mimo tuto podmnožinu by neměly být považovány za správně přepočítatelné. Pokud potřebujete plnou kompatibilitu s Excelovými vzorci, proveďte výpočet pomocí vhodného tabulkového engine a zapište konečné hodnoty do sešitu grafu.

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

Pokud data grafu nebyla změněna, sešit může stále obsahovat dříve vypočtenou uloženou hodnotu. Po změně souvisejících dat tato uložená 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 výjimky v Javě?

Ne. Výsledek jako #DIV/0! je hodnota tabulkového procesoru vytvořená platným výpočtem. Výjimky jako CellInvalidFormulaException nebo CellCircularReferenceException signalizují, že vzorec nelze normálně zpracovat.

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

Řada grafu může odkazovat na buňky sešitu. Nejprve přepočtěte sešit a poté uložte nebo renderujte prezentaci. Pokud datové body grafu odkazují na vypočtené buňky, graf použije tyto aktualizované hodnoty; není potřeba samostatná metoda pro obnovení grafu.

Mohou grafy používat externí Excelový sešit?

Ano, data grafu lze nakonfigurovat tak, aby používala externí sešit prostřednictvím 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 IChartDataWorkbook.calculateFormulas poskytuje úplný 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 se mohou v sešitech grafů vyskytovat, ale vyhodnocování vzorců je omezeno podporovaným parserem a sadou funkcí. Pokud je křížový odkaz nezbytný, ověřte konkrétní vzorec s cílovou verzí Aspose.Slides. Pro workflow vyžadující širokou kompatibilitu odkazů Excelu vypočítejte sešit externě a zapište vyřešené hodnoty zpět do dat grafu.

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

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