Zastosowanie formuł arkusza wykresu w prezentacjach przy użyciu JavaScript

Przegląd

PowerPoint charts usually store their source data in an embedded worksheet. In Aspose.Slides for Node.js via Java, you can access that worksheet through the chart data workbook, write input values, assign formulas to cells, calculate supported formulas, and use the calculated cells as chart data.

This article explains the complete formula workflow: create a chart, populate its worksheet, assign A1-style or R1C1-style formulas, recalculate them, read the calculated values, connect those cells to a chart series, and save the presentation. It also describes the supported formula syntax, the built-in function subset, cached values, unsupported formulas, and spreadsheet-specific errors.

Arkusze wykresów i formuły

Arkusz wykresu zawiera kategorie, nazwy serii i wartości używane przez wykres. W programie PowerPoint możesz przeglądać arkusz, otwierając edytor danych wykresu:

Wykres PowerPoint z otwartym osadzonym arkuszem, pokazujący dane kategorii i serii

W Aspose.Slides arkusz jest udostępniany za pośrednictwem klasy ChartDataWorkbook. Użyj ChartDataCell.setFormula dla formuł w stylu A1 oraz ChartDataCell.setR1C1Formula dla formuł w stylu R1C1. Po zmianie komórek wejściowych lub formuł, wywołaj ChartDataWorkbook.calculateFormulas aby ponownie obliczyć obsługiwane formuły i zaktualizować odpowiadające wartości komórek.

Obliczona komórka nadal udostępnia swój wynik za pośrednictwem ChartDataCell.getValue. Jest to istotne, gdy trzeba sprawdzić wynik formuły w kodzie lub użyć komórki jako punktu danych wykresu.

Utworzenie wykresu i obliczenie formuł w arkuszu

Poniższy przykład demonstruje kompletny przepływ pracy. Tworzy wykres kolumnowy grupowany, usuwa przykładowe dane, zapisuje kwartalne przychody i wydatki, oblicza zysk przy użyciu formuł, odczytuje wyniki, używa obliczonych komórek jako wartości wykresu i zapisuje prezentację.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);
    const chart = slide.getShapes().addChart(aspose.slides.ChartType.ClusteredColumn, 50, 50, 600, 350);
    const workbook = chart.getChartData().getChartDataWorkbook();
    const worksheetIndex = 0;

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

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

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

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

    workbook.calculateFormulas();

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

    console.log("Q1 profit: " + q1Profit);
    console.log("Q2 profit: " + q2Profit);
    console.log("Q3 profit: " + q3Profit);

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

    const 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", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Punkty danych wykresu odwołują się do D2:D4, więc wykres używa obliczonych wartości zysku. W tym przepływie nie ma osobnego wywołania odświeżenia wykresu: najpierw należy ponownie obliczyć skoroszyt, a następnie używać lub zapisać dane wykresu wskazujące na obliczone komórki.

Używanie formuł w stylu A1

Notacja A1 identyfikuje kolumny literami, a wiersze liczbami. Przypisuj wyrażenia w stylu A1 za pomocą ChartDataCell.setFormula.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

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

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

    workbook.calculateFormulas();

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

Typowe formy odwołań A1 to:

Odwołanie Względne Bezwzględne Mieszane
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

Odwołania względne mogą zmieniać się, gdy formuła jest przenoszona lub kopiowana w aplikacji arkusza kalkulacyjnego. Odwołania bezwzględne utrzymują oba współrzędne stałe, natomiast odwołania mieszane blokują tylko wiersz lub kolumnę.

Używanie formuł w stylu R1C1

Notacja R1C1 identyfikuje zarówno wiersze, jak i kolumny liczbami. Odwołania względne używają offsetów w nawiasach kwadratowych. Przypisuj tę składnię za pomocą ChartDataCell.setR1C1Formula.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

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

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

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

    workbook.calculateFormulas();

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

Typowe formy odwołań R1C1 to:

Odwołanie Względne Bezwzględne Mieszane
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]

Na przykład, w komórce D2 wyrażenie RC[-2] oznacza komórkę w tym samym wierszu dwie kolumny w lewo (B2).

Stałe i operatory formuł

Wbudowany evaluator formuł obsługuje wartości logiczne, literały liczbowe, ciągi znaków, wartości błędów arkusza, operatory arytmetyczne i operatory porównania.

Stałe i literały

Typ Przykłady Uwagi
Logical TRUE, FALSE Można używać bezpośrednio w wyrażeniach logicznych, np. A2=TRUE.
Numeric 1, 0.5, .3, 1E-2 Obsługiwane są notacja zwykła i naukowa.
String "abc", "2/3/2020 12:00" Literały tekstowe są w formule otoczone podwójnymi cudzysłowami.
Error result #DIV/0!, #N/A, #REF! Poprawna formuła może zwrócić wartość błędu arkusza zamiast normalnego wyniku.

Ten przykład używa kilku typów stałych:

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

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

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

Operatory arytmetyczne

Operator Znaczenie Przykład
+ Dodawanie lub znak plus jednowartościowy 2+3
- Odejmowanie lub negacja 2-3, -3
* Mnożenie 2*3
/ Dzielenie 2/3
% Procent 30%
^ Potęgowanie 2^3

Używaj nawiasów, aby wyraźnie określić kolejność obliczeń, np. (A2+B2)*C2.

Operatory porównania

Wyrażenia porównania zwracają wartości logiczne.

Operator Znaczenie Przykład
= Równe A2=3
<> Nierówne A2<>3
> Większe niż A2>3
>= Większe lub równe A2>=3
< Mniejsze niż A2<3
<= Mniejsze lub równe A2<=3

Obsługiwane funkcje wbudowane

Aspose.Slides zawiera wbudowany evaluator formuł dla arkuszy wykresów, ale nie jest pełnym silnikiem kalkulacyjnym Excel. Dokumentowany zestaw funkcji ogranicza się do poniższych funkcji. Nie zakładaj, że dowolna funkcja Excel może być ponownie obliczona przez ChartDataWorkbook.calculateFormulas.

Funkcja Cel lub obsługiwana forma Przykład
ABS Wartość bezwzględna ABS(A2)
AVERAGE Średnia arytmetyczna AVERAGE(B2:B5)
CEILING Zaokrąglenie liczby w górę do wielokrotności CEILING(A2,5)
CHOOSE Wybór wartości na podstawie indeksu CHOOSE(A2,"Low","High")
CONCAT Łączenie wartości tekstowych CONCAT(A2,B2)
CONCATENATE Łączenie wartości tekstowych CONCATENATE(A2," ",B2)
DATE Utworzenie wartości daty w systemie dat 1900 DATE(2026,8,19)
DAYS Zwraca liczbę dni między datami DAYS(B2,A2)
FIND Znajdź wartość tekstową wewnątrz innej FIND("-",A2)
FINDB Wyszukiwanie tekstu w trybie bajtowym FINDB("a",A2)
IF Wynik warunkowy IF(A2>0,A2,0)
INDEX Forma odwołania INDEX(A2:C4,2,3)
LOOKUP Forma wektorowa LOOKUP(A2,B2:B5,C2:C5)
MATCH Forma wektorowa MATCH(A2,B2:B5,0)
MAX Wartość maksymalna MAX(B2:B5)
SUM Suma wartości SUM(B2:B5)
VLOOKUP Wyszukiwanie pionowe VLOOKUP(A2,B2:D10,3,FALSE)

Ograniczenia przedstawione w tabeli są istotne: INDEX jest udokumentowany w formie odwołania, natomiast LOOKUP i MATCH w formie wektorowej. DATE używa systemu dat 1900. Funkcje i cechy nie wymienione tutaj należy traktować jako nieobsługiwane przez evaluator formuł Aspose.Slides, o ile nie są udokumentowane osobno.

Obliczanie formuł z preferowaną kulturą

Some chart workbook functions interpret text according to culture-specific rules. This is especially important for functions intended for languages that use double-byte character sets (DBCS). To calculate such formulas correctly, create LoadOptions, set the preferred culture with SpreadsheetOptions.setPreferredCulture, assign the spreadsheet options through LoadOptions.setSpreadsheetOptions, and then load the presentation.

const aspose = {};
aspose.slides = require("aspose.slides.via.java");
const java = require("java");

const japaneseCulture = java.newInstanceSync("java.util.Locale", "ja", "JP");

const spreadsheetOptions = new aspose.slides.SpreadsheetOptions();
spreadsheetOptions.setPreferredCulture(japaneseCulture);

const loadOptions = new aspose.slides.LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);

const presentation = new aspose.slides.Presentation("presentation.pptx", loadOptions);
try {
    const slides = presentation.getSlides();
    for (let slideIndex = 0; slideIndex < slides.size(); slideIndex++) {
        const shapes = slides.get_Item(slideIndex).getShapes();
        for (let shapeIndex = 0; shapeIndex < shapes.size(); shapeIndex++) {
            const shape = shapes.get_Item(shapeIndex);
            if (java.instanceOf(shape, "com.aspose.slides.IChart")) {
                shape.getChartData().getChartDataWorkbook().calculateFormulas();
            }
        }
    }
} finally {
    presentation.dispose();
}

The preferred culture is part of the presentation loading configuration, so specify it before creating the Presentation instance. Use the culture expected by the workbook formulas; for example, use ja-JP for formulas that should follow Japanese DBCS calculation rules.

Rekalculacja i wartości buforowane

Spreadsheet files commonly store both a formula and its last calculated value. Aspose.Slides can therefore read a cached value from ChartDataCell.getValue when a presentation is loaded and the relevant chart data has not been changed.

After changing input cells or formulas, do not rely on an old cached result. Call ChartDataWorkbook.calculateFormulas before reading calculated values or saving chart data that depends on them.

For formulas outside the supported subset, Aspose.Slides may be unable to parse the formula or establish its dependencies. If the workbook has been modified, the previous cached value can no longer be considered reliable. In that situation, reading the value of a cell with unsupported data can raise CellUnsupportedDataException.

If your chart depends on Excel functions that Aspose.Slides does not evaluate, calculate those formulas with a spreadsheet engine that supports them and write the resulting values back to the chart workbook. Do not replace unsupported formulas with guessed values.

Obsługa błędów formuł

There are two different kinds of problems to distinguish.

A formula can be valid but produce a spreadsheet error result such as #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF!, or #VALUE!. In this case, the error token is a cell result and can be returned through ChartDataCell.getValue.

A formula can also fail at the parsing, reference, dependency, or supported-data level. Aspose.Slides provides spreadsheet-specific exceptions for these cases: CellInvalidFormulaException, CellInvalidReferenceException, CellCircularReferenceException, and CellUnsupportedDataException.

When formulas come from templates or user input, catch errors around recalculation and value access. The error details identify the underlying spreadsheet problem:

const aspose = {};
aspose.slides = require("aspose.slides.via.java");

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

    try {
        workbook.calculateFormulas();
        console.log(cell.getValue());
    } catch (error) {
        console.error("Formula processing error: " + error.message);
    }
} finally {
    presentation.dispose();
}

Praktyczne ograniczenia

The formula support in chart worksheets is intended for a defined subset of spreadsheet calculations, not for full Excel compatibility. Keep these constraints in mind when designing a reporting workflow:

  • Używaj wyłącznie udokumentowanych stałych, operatorów, odwołań i funkcji, gdy potrzebujesz, aby Aspose.Slides ponownie obliczyło formuły.
  • Ponownie obliczaj po zmianie komórek, od których zależą wyniki formuł.
  • Traktuj wartości buforowane z załadowanych prezentacji jako migawki, a nie jako zamiennik ponownej kalkulacji po edycjach.
  • Testuj formuły z istniejących szablonów przed poleganiem na ich obliczonych wartościach, szczególnie gdy używają funkcji spoza udokumentowanej listy.
  • Dla formuł wymagających pełnego silnika kalkulacji arkusza, oblicz je zewnętrznie, a następnie zaktualizuj arkusz wykresu wynikowymi wartościami.

FAQ

Jaka jest różnica między ChartDataCell.setFormula a ChartDataCell.setR1C1Formula?

[ChartDataCell.setFormula] przechowuje wyrażenie w stylu A1, np. B2-C2. [ChartDataCell.setR1C1Formula] przechowuje wyrażenie w stylu R1C1, np. RC[-2]-RC[-1]. Użyj notacji, która najlepiej odpowiada sposobowi, w jaki generujesz lub kopiujesz formuły.

Czy po obliczeniu muszę odczytać samą komórkę, czy jej wartość?

[ChartDataWorkbook.getCell] zwraca obiekt [ChartDataCell]. Aby uzyskać obliczony wynik, po ponownej kalkulacji wywołaj metodę [ChartDataCell.getValue] tej komórki.

Kiedy powinienem wywołać ChartDataWorkbook.calculateFormulas?

Wywołaj [ChartDataWorkbook.calculateFormulas] po zmianie wartości wejściowych lub formuł oraz przed użyciem obliczonych wyników. Aktualizuje to wartości formuł obsługiwanych przez wbudowany evaluator.

Czy Aspose.Slides obsługuje każdą funkcję Excel?

Nie. Wbudowany evaluator obsługuje udokumentowany podzbiór funkcji. Funkcje spoza tego podzbioru nie powinny być traktowane jako prawidłowo wyliczane. Jeśli wymagana jest pełna kompatybilność z formułami Excel, wykonaj obliczenia przy użyciu odpowiedniego silnika arkusza i zapisz ostateczne wartości do arkusza wykresu.

Co się stanie, jeśli załadowana prezentacja zawiera nieobsługiwaną formułę?

Jeśli dane wykresu nie zostały zmienione, skoroszyt może wciąż zawierać wcześniej obliczoną wartość buforowaną. Po modyfikacji powiązanych danych ta buforowana wartość może już nie być prawidłowa. Dostęp do komórki, której formuła nie może być obsłużona, może spowodować podniesienie [CellUnsupportedDataException].

Czy wartości błędów formuł są tym samym, co wyjątki?

Nie. Wynik taki jak #DIV/0! jest wartością arkusza wygenerowaną przez prawidłową kalkulację. Wyjątki takie jak [CellInvalidFormulaException] czy [CellCircularReferenceException] wskazują, że formuła nie może być przetworzona w normalny sposób.

Czy wykres aktualizuje się automatycznie po zmianie komórki z formułą?

Seria wykresu może odwoływać się do komórek skoroszytu. Najpierw ponownie oblicz skoroszyt, a następnie zapisz lub wyrenderuj prezentację. Jeśli punkty danych wykresu odwołują się do obliczonych komórek, wykres używa zaktualizowanych wartości; nie jest wymagane osobne wywołanie odświeżenia wykresu w tym przepływie.

Czy wykresy mogą korzystać z zewnętrznego skoroszytu Excel?

Tak, dane wykresu można skonfigurować tak, aby używały zewnętrznego skoroszytu poprzez API danych wykresu. Jednak opisany w tym artykule przepływ obliczania formuł dotyczy skoroszytu danych wykresu i podzbioru formuł ocenianych przez Aspose.Slides. Nie zakładaj, że [ChartDataWorkbook.calculateFormulas] zapewnia pełną rekalkulację dowolnych formuł w zewnętrznym pliku XLSX.

Czy mogę używać formuł odwołujących się do innego arkusza lub skoroszytu?

Odwołania w stylu Excel mogą występować w skoroszytach wykresów, ale ocena formuł jest ograniczona przez obsługiwany parser i zestaw funkcji. Jeśli odwołanie krzyżowe lub zewnętrzne jest niezbędne, zweryfikuj tę konkretną formułę w docelowej wersji Aspose.Slides. W przepływach wymagających szerokiej kompatybilności odwołań Excel, oblicz skoroszyt zewnętrznie i zapisz rozwiązane wartości z powrotem do danych wykresu.

Czy ciągi formuł powinny zaczynać się od =?

Przykłady w API Aspose.Slides przypisują wyrażenia takie jak B2-C2 lub SUM(B2:B5) bez wiodącego znaku =. Używanie tej formy utrzymuje generowane formuły zgodne z udokumentowanymi przykładami API.