HotXLS Docs

Silnik obliczeniowy Excel

Przegląd

HotXLS zawiera wbudowany silnik do analizowania i obliczania formuł; silnik ten oblicza formuły komórek programowo w ramach Twojego procesu, eliminując potrzebę wywoływania programu Excel lub zewnętrznych kontrolerów OLE w celu ustalenia obliczonych wartości skoroszytu

Wykonanie obliczeń

Przed zapisaniem lub eksportem uruchom pełne ponowne obliczenie skoroszytu za pomocą głównego interfejsu skoroszytu

procedure Calculate;

Silnik obsługuje standardowe rodziny funkcji matematycznych, daty, logicznych, ciągów znaków i statystycznych; sekwencyjnie rozstrzyga zależności komórek i podąża za łańcuchami odwołań, aby zapobiec odwołaniom cyklicznym

Kontekstowe obliczanie formuł

TXLSWorksheet i TXLSXWorksheet udostępniają EvaluateFormulaAt do obliczenia tekstu formuły we wskazanym wierszu i kolumnie (numeracja od jedynki) bez zapisywania komórki tymczasowej i bez zmiany stanu obliczeń skoroszytu

Style odwołań A1 i R1C1, nazwy lokalne, odwołania strukturalne, zależności formuł, korzenie tablic, wpisane wartości błędów programu Excel, status lotności, jawna autoryzacja odwołań zewnętrznych, anulowanie i stabilne kategorie błędów korzystają ze zwykłego mechanizmu obliczającego skoroszytu

CreateFormulaEvaluationTemplate kompiluje niezmienną kotwicę jednokrotnie i ponownie używa jej dla wielu komórek docelowych; strukturalne odwołania A1 wrażliwe na wiersz docelowy są rozwiązywane dla każdego kontekstu docelowego, a limity na wywołanie ograniczają długość formuły, liczbę kroków elementów składni, głębokość rekursji i rozmiar wygenerowanych tablic w bajtach

Zobacz Kontekstowe obliczanie formuł, aby poznać typy wyników, domyślne budżety, zasady cyklu życia oraz przykłady dla Delphi i C++Builder

Operatory tablicowe

Operatory arytmetyczne, porównania, konkatenacji, negacji jednoargumentowej i procentu przyjmują obliczone tablice, a nie tylko wartości skalarne

Skalar rozprowadzany jest na każdy element, a tablica o jednym wierszu lub jednej kolumnie rozprowadzana jest wzdłuż zgodnego wymiaru; niezgodne kształty zwracają #VALUE!

Błędy pozostają zachowane w swoich komórkach wynikowych, więc pojedyncze dzielenie przez zero lub pojedynczy nieprawidłowy element nie powoduje utraty wartości obliczonych dla pozostałych komórek

COMBINA i PERMUTATIONA mają wspólną semantykę skalarną i tablicową (broadcast) z obcinanymi nieujemnymi argumentami całkowitymi i sprawdzanym przepełnieniem, a MUNIT zwraca zwięzłą dwuwymiarową macierz jednostkową typu Double

FormulaArrayMemoryLimit ma domyślnie wartość 64 MiB i ogranicza rozmiar generowanych macierzy; MUNIT dodatkowo sprawdza pozostały obszar rozlania (spill) arkusza zamiast narzucać stały limit wymiarów

Inspekcja obecności formuł

ISFORMULA(reference) sprawdza, czy komórka zawiera formułę, bez jej obliczania, więc formuła pozostaje wykrywalna, nawet gdy jej wynik z pamięci podręcznej to błąd albo pusty ciąg

Prostokątny zakres zwraca tablicę logiczną o tym samym kształcie; komórki formuły współdzielonej oraz klasycznych lub XLSX formuł tablicowych zwracają true, a komórką formuły jest wyłącznie kotwica dynamicznego rozlania

Bezpośrednie wartości i skalarne nazwy zdefiniowane zwracają #VALUE!, nieprawidłowe odwołania zachowują #REF!, a generowane tablice logiczne są ograniczane przez FormulaArrayMemoryLimit

XLSX zapisuje _xlfn.ISFORMULA i przywraca samą nazwę przy otwarciu, ODS używa standardowej składni of:=ISFORMULA, a wyjście klasycznego XLS odrzuca nieobsługiwaną funkcję przyszłą (future function) przed zapisaniem danych

Nowoczesne funkcje tekstowe

UNICHAR obcina wejścia liczbowe w stronę zera i konwertuje poprawne wartości skalarne Unicode na UTF-16, w tym wyjście w postaci par surrogate dla płaszczyzn uzupełniających oraz wszystkie zakresy prywatne

Zero i wejścia poza zakresem zwracają #VALUE!, a odosobnione punkty kodowe surrogate i znaki niedozwolone Unicode (noncharacters) zwracają #N/A; wejścia zakresowe i generowane tablice zachowują te błędy per element

BAHTTEXT konwertuje liczby skończone na tekst tajski z kwotami w bahtach i satangach, zaokrągla wartości środkowe w kierunku od zera do dwóch miejsc po przecinku, zachowuje znak minus, gdy zaokrąglona wartość bezwzględna spada do zera, i rozwija notację naukową bez zawężania przez typ całkowity

XLSX zapisuje UNICHAR jako _xlfn.UNICHAR i przywraca samą nazwę po ponownym otwarciu; BAHTTEXT zachowuje swoje standardowe oznaczenie funkcji i pozostaje bez prefiksu w formułach XLS i XLSX

Regresja i predykcja

LINEST i LOGEST przyjmują jedną lub więcej kolumn albo wierszy zmiennych objaśniających i zwracają współczynniki w kolejności Excela, a po nich opcjonalny wyraz wolny

Gdy argument statystyk ma wartość true, obie funkcje zwracają pełny wynik o pięciu wierszach, zawierający błędy współczynników, statystyki dopasowania, statystykę F, stopnie swobody, sumę kwadratów regresji i sumę kwadratów reszt

TREND i GROWTH korzystają z tego samego modelu wielozmiennego i zachowują kształt wierszowy lub kolumnowy podanych nowych wartości zmiennych objaśniających

Ponowne obliczanie zależności w klasycznym XLS

TXLSWorkbook.Recalculate buduje graf zależności formuł przy pierwszym wywołaniu i oblicza formuły w kolejności od poprzedników, a nie w kolejności fizycznej komórek

Kolejne wywołania ponownie używają grafu i przeliczają wyłącznie przechodnich zależnych od zmienionych wartości oraz formuły lotne; edycje formuł, nazwy, struktura arkusza i przepisane odwołania bezpiecznie unieważniają graf i budują go od nowa

Odwołania cykliczne korzystają z klasycznych ustawień skoroszytu EnableIteration, MaxIterations i MaxIterationChange, a UseFullPrecision=False stosuje precyzję wyświetlanych liczb do wyników z pamięci podręcznej i zależnych od nich obliczeń

Zależności nazw zdefiniowanych

Obliczanie przyrostowe śledzi nazwy o zakresie skoroszytu i arkusza poprzez zagnieżdżone formuły i odwołania do wielu obszarów

Acykliczne formuły nazw wnoszą swoje dokładne zależności komórkowe, a rekurencyjne cykle nazw mają bezpieczny fallback w postaci przeliczania formuł lotnych

Tabele danych analizy „co jeśli"

Arkusze klasycznego XLS i nowoczesnego XLSX potrafią tworzyć, obliczać, odczytywać, zapisywać, kopiować i strukturalnie modyfikować tabele danych analizy „co jeśli" z jedną lub dwiema zmiennymi

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

Zakres wyników zawiera wyłącznie obliczone komórki wyjściowe, natomiast formuły i wartości próbne korzystają z otaczających komórek, w tym samym układzie co w Excelu

  • Tabela z wejściem kolumnowym — pozostaw ARowInputCell puste, umieść formułę źródłową nad każdą kolumną wyników, a wartości próbne po lewej stronie wierszy wyników
  • Tabela z wejściem wierszowym — pozostaw AColumnInputCell puste, umieść formułę źródłową po lewej stronie każdego wiersza wyników, a wartości próbne nad kolumnami wyników
  • Tabela z dwiema zmiennymi — podaj obie komórki wejściowe, umieść formułę źródłową nad i po lewej stronie zakresu wyników, wartości próbne wejścia wierszowego nad wynikami, a wartości próbne wejścia kolumnowego po lewej
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

Ten przykład z wejściem kolumnowym oblicza 3, 5 i 7 w D2:D4; każda wartość próbna jest stosowana przez izolowany kontekst obliczeń, więc formuły sięgające do B1 pośrednio, poprzez inne komórki formuł, są poprawnie przeliczane

AddDataTable zwraca nil dla nieprawidłowego zakresu, nieprawidłowego odwołania wejściowego albo gdy oba odwołania wejściowe są puste; kolekcja DataTables arkusza udostępnia powstałą definicję oraz jej flagi usuniętych wejść

Usunięcie wskazywanej komórki wejściowej zachowuje definicję tabeli i zwraca #REF! dla jej wyników, co odpowiada semantyce zapisanego skoroszytu

Funkcje zdefiniowane przez użytkownika

Rozszerz silnik formuł o niestandardową logikę biznesową; zarejestruj własne funkcje przy użyciu poniższych zdarzeń

Niebezpieczne nazwy zewnętrzne i nazwy w stylu makr są blokowane, zanim zostaną uruchomione argumenty lub handlery, chyba że skoroszyt albo pojedyncze kontekstowe obliczenie jawnie włączy AllowUnsafeFormulaCallbacks