Dokumentacja HotXLS

Wierność obliczeń i konwersji

Tablice obliczeniowe składają się z funkcji wyboru, sortowania, wyszukiwania, macierzowych i przekształcających kształt, z automatyczną własnością rozlań XLSX, jawnymi celami CSE i ograniczonymi zasobami ewaluacji

Tablice dynamiczne i jawne tablice CSE

Przypisz wyrażenie zwracające tablicę do jednego TXLSXCell.Formula i wywołaj TXLSXWorkbook.Recalculate; wynik otrzymuje prostokątne rozlanie zakotwiczone w tej komórce, obejmujące formuły takie jak SEQUENCE(3,2), A1:A3*10, stałe tablicowe i tablicowe wyniki LET

Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)';
Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)';
Workbook.Recalculate;

Przeliczenie rozwija lub kurczy wynik, czyści wyłącznie nieaktualne komórki zależne należące do kotwicy i odbudowuje zależności przy zmianie rozmiaru; odwołania do nowo utworzonych komórek zależnych oraz operator rozlania A1# korzystają z bieżącego zasięgu

Istniejące wartości, formuły, rich text, inne tablice, scalone zakresy, tabele i granice arkusza blokują rozlanie i dają #SPILL!; style na pustych komórkach pozostają użyteczne, a usunięcie przeszkody pozwala najbliższemu przeliczeniu ponowić próbę kotwicy

Edycja komórki zależnej wartością lub rich textem odczepia tę komórkę od kotwicy, więc kolejne obliczenie zachowuje edycję jako przeszkodę; usunięcie albo wyczyszczenie kotwicy zwalnia jej komórki zależne, podczas gdy ConvertFormulasToValues zachowuje ich obliczone wartości jako zwykłe komórki

Zapis XLSX rejestruje bieżący zasięg tablicy i metadane, a wczytywanie przywraca własność istniejących zapamiętanych komórek zależnych przed przeliczeniem; formuły tablicowe zawierające błędy nadal zachowują zasięg, gdy błędy dotyczą pojedynczych elementów

SetArrayFormula pozostaje jawnym punktem wejścia CSE o stałym zakresie w obu silnikach skoroszytu; surowa arytmetyka zakresów liczy element po elemencie wewnątrz tego zakresu, a zwykłe skalarne formuły zachowują niejawne przecięcie

Jednoargumentowy operator @ przecina odwołanie z komórką formuły i bierze pierwszy element tablicy obliczeniowej; SINGLE i ANCHORARRAY są akceptowanymi aliasami zapisu dla niejawnego przecięcia i odwołań rozlań

MAP przyjmuje wiele tablic wejściowych i pasującą listę parametrów LAMBDA, propaguje błędy elementów i odrzuca zagnieżdżone wyniki tablicowe błędem #CALC!; FILTER przyjmuje tablice obliczone i maski wierszowe lub kolumnowe, łącznie z propagacją błędów i błędem #CALC! pustego wyniku, gdy nie podano wartości zastępczej

Mutacja dynamicznych rozlań działa seryjnie nawet przy skonfigurowanych wielu wątkach obliczeń; stabilizacja zasięgu jest ograniczona do 32 przebiegów, a tablice dynamiczne w cyklicznych obliczeniach iteracyjnych są odrzucane zamiast być traktowane jako skalarne wyniki

INDEX przyjmuje odwołania, stałe tablicowe i tablice obliczeniowe; gdy oba selektory są skalarne, dodatnie selektory wiersza i kolumny zwracają jedną wartość, selektor zerowy zwraca wybrany wiersz lub kolumnę, a dwa selektory zerowe zwracają całą tablicę; źródło odwołaniowe ze skalarnymi selektorami zachowuje zachowanie odwołaniowe dla konsumentów takich jak ROW i ISREF

Selektory wiersza i kolumny mogą też być tablicami, łącznie ze stałymi, obliczonymi wektorami, wartościami zakresów i wiązaniami LET; przeciwne orientacje wiersza i kolumny rozgłaszają się do prostokątnego iloczynu krzyżowego, a zgodne orientacje wybierają sparowane pozycje; wymiary jednoelementowe się rozgłaszają, a brakujące pozycje w nierównych wymiarach zwracają pojedyncze wartości #N/A

Gdy którykolwiek selektor jest tablicą, zero lub pominięty selektor wybiera pierwszy element tej osi zamiast rozszerzać cały wiersz lub kolumnę; ułamkowe selektory są obcinane w stronę zera, ujemne selektory zwracają pojedyncze wartości #VALUE! przed obcięciem, a selektory poza granicami źródła zwracają pojedyncze wartości #REF!; wybrane ciągi, wartości Boolean i typowane błędy zachowują swoje typy

SORT i UNIQUE przyjmują zakresy, stałe i tablice obliczeniowe, łącznie z zagnieżdżonymi wynikami FILTER, SEQUENCE i LET; orientacja wierszowa lub kolumnowa, sortowanie rosnące czy malejące, kolejność pierwszego wystąpienia i deduplikacja „dokładnie raz” trzymają się tego samego kontraktu dla każdej postaci źródła

Nazwy zdefiniowane w skoroszycie mogą dostarczać źródła odwołaniowe, skalarne lub tablice obliczeniowe; ISREF(INDEX(...)) odróżnia rzeczywisty wynik odwołaniowy od nazwanej wartości obliczonej; skalarne selektory INDEX i liczbowe opcje SORT obcinają wartości ułamkowe, a opcjonalne argumenty Boolean odrzucają tekst inny niż TRUE lub FALSE

Sheet.Cells.Item[1, 6].Formula := 'SORT(UNIQUE(FILTER(A1:B5,A1:A5>1)),1,-1)';
Sheet.Cells.Item[1, 9].Formula := 'INDEX(SORT(UNIQUE(A1:B5)),0,2)';
Sheet.Cells.Item[1, 12].Formula := 'INDEX(SEQUENCE(2,3,10,2),2,3)';
Workbook.Recalculate;
Sheet.Cells.Item[1, 1].Formula := 'INDEX(SEQUENCE(3,3),{1;3},{1,3})';
Workbook.Recalculate;

Ten przykład z selektorami rozlewa {1,3;7,9} do wyniku dwa-na-dwa; INDEX(SEQUENCE(3,3),{1;3},{1;3}) zwraca natomiast sparowaną kolumnę {1;9}; selektory tablicowe dają wartości nawet wtedy, gdy źródłem jest odwołanie, podczas gdy skalarne selektory odwołaniowe zachowują tożsamość odwołania

Te wyrażenia mogą się rozlewać i zmieniać rozmiar w XLSX albo liczyć się wewnątrz jawnego celu CSE; błędy źródeł tablicowych pozostają typowane, a pusty wynik „dokładnie raz” zwraca #CALC!; wyjścia selektorów zużywają budżet kroków ewaluacji, a połączone ładunki źródła, selektorów i macierzy wyniku są sprawdzane względem budżetu pamięci tablic

INDEX przyjmuje jawny czwarty argument area_num równy 1 dla obliczonego źródła, a selektory wiersza, kolumny i obszaru mogą rozgłaszać się razem po obsługiwanym unijnym odwołaniu w obrębie jednego arkusza; rzeczywiste odwołania wieloobszarowe zachowują tożsamość przez lokalne nazwy zdefiniowane i LET, a skalarne CHOOSE zachowuje wybrane odwołanie, łącznie z wyborem na innym arkuszu; wyniki selektorów tablicowych to wartości, a nie zagnieżdżone tablice odwołań; zobacz wybór obszaru INDEX i tożsamość odwołania dla reguł zera, braków, koercji i błędów

Dla obliczeń samodzielnych TXLSCalculator.OnGetSpillRange przyjmuje callback TXLSGetSpillRange, który rozwiązuje bieżące włączne granice kotwicy; ewaluatory wsparte skoroszytem instalują ten callback automatycznie

TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer;
  var LastRow, LastCol: Integer): Integer of object;

lxNormalizeStorageFormula normalizuje napisaną składnię formuł pod OOXML, lxTryStorageFormulaOperators tłumaczy operatory rozlań i niejawnego przecięcia, a lxApplyXlfnPrefix dodaje wymagane prefiksy funkcji przyszłych; chroniony tekst i separatory wierszy tablic pozostają nienaruszone, a przypisanie formuły zachowuje tekst wywołującego w pamięci

Zapis nie zmienia wyrażenia w pamięci; ponowne otwarcie świeżo napisanych formuł XLSX zwraca kanoniczną składnię zapisu z argumentami po przecinku i bez wiodącego =, zgodnie z natywnymi importami Excela; niezmieniony zaimportowany XML formuł zachowuje swoją dotychczasową ścieżkę ochrony

Kompozycja wyszukiwania, macierzy i przekształceń kształtu

TRANSPOSE przyjmuje odwołania, stałe i tablice obliczeniowe, zachowując tekst, wartości Boolean i pojedyncze błędy; puste komórki źródłowe stają się liczbowym zerem

MMULT, MDETERM i MINVERSE przyjmują obliczone macierze i zagnieżdżone wyrażenia takie jak MMULT(MUNIT(2),SEQUENCE(2,2)); ich wpisy macierzowe muszą być liczbowe, a tekst, wartości Boolean i puste są odrzucane zamiast być koercjonowane, przy czym błędy źródłowe zachowują swoje kody

CHOOSECOLS i CHOOSEROWS przyjmują skalarne lub jednowymiarowe wektory selektorów, sklejają selektory w kolejności argumentów, zachowują duplikaty i liczą ujemne indeksy od końca; ułamkowe selektory są obcinane w stronę zera, selektory zerowe i poza zakresem są odrzucane, a dwuwymiarowe macierze selektorów nie są obsługiwane

XLOOKUP, XMATCH i MATCH przyjmują obliczone wektory wyszukiwania i tablicowe żądania wyszukiwania; klucze muszą zajmować jeden wiersz lub jedną kolumnę, a tablice wyników XLOOKUP muszą być wyrównane do tej osi wyszukiwania

Skalarne XLOOKUP może zwrócić cały pasujący wiersz lub kolumnę, łącznie z typowanymi błędami; tablicowe żądanie wyszukiwania zachowuje własny kształt i bierze pierwszy składnik każdego pasującego wycinka albo tablicy zastępczej

Skanowanie dokładnego wyszukiwania pomija wpisy błędów w wektorze kluczy; klucze Boolean, liczbowe i tekstowe pozostają odrębne, a zwykłe skalarne ścieżki odwołaniowe zachowują dotychczasowe zachowanie strumieniowania i pamięci podręcznej przeliczeń; tryby wyszukiwania binarnego nadal wymagają poprawnie posortowanych kluczy

VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS i EXPAND przyjmują obliczone wejścia i typowane wypełnienia; wynik bez wierszy lub kolumn zwraca #CALC!, a zawijanie wymaga jednowymiarowego wejścia

Praca macierzowa, skanowanie wyszukiwania, przemierzanie selektorów, kopiowanie i wypełnianie zużywają budżet kroków ewaluacji; jednocześnie trzymane ładunki macierzy wejścia, roboczej i wyjścia są sprawdzane względem skonfigurowanego limitu pamięci tablic przed alokacją

Sheet.Cells.Item[1, 1].Formula := 'XLOOKUP({1;3},SEQUENCE(3),SEQUENCE(3,2))';
Sheet.Cells.Item[1, 4].Formula := 'CHOOSECOLS(SEQUENCE(2,3),{-1;1})';
Sheet.Cells.Item[1, 7].Formula := 'TRANSPOSE(UNIQUE({"A";"B";"A"}))';
Workbook.Recalculate;

Typowane nowoczesne błędy obliczeń

#SPILL! i #CALC! pozostają typowanymi błędami komórek przez obliczenia, wyświetlanie, inspekcję pamięci podręcznej i ponowne otwarcie XLSX; wyjście XLSX niesie ich metadane wartości rozbudowanej, zachowując standardowy zapasowy błąd z pamięci podręcznej dla czytników nieznających tego rozszerzenia

Wyniki tekstowe formuł, łącznie z komórkami zależnymi CSE i tablic dynamicznych, korzystają z pamięci podręcznej literałów tekstowych, aby Excel mógł je wyświetlić przed przeliczeniem; zwykłe komórki wartości dalej używają ciągów współdzielonych

Nowoczesne wyjście rozbudowanych błędów zawiera wersję skoroszytu i deklaracje funkcji obliczeniowych Rich Data wymagane przez Excel do interpretacji tych pamięci podręcznych przed przeliczeniem; emitowane calcId wynosi co najmniej 191029, zachowując wyższe żądane wartości bez zmiany właściwości CalcId skoroszytu w pamięci

Zaimportowane metadane komórek i wartości, niezwiązane struktury wartości rozbudowanych i nieprzejrzyste kubełki zachowują swoje pierwotne tożsamości przy dołączaniu nowych kubełków błędów; zastąpienie komórki błędu czyści nieaktualne metadane typowanych błędów przy zapisie

TXLSXRichErrorCodes to typ tablicy liczb całkowitych używany dla zdekodowanych kubełków rozbudowanych błędów; kod aplikacji czyta typowane błędy z wartości Variant komórki

BIFF8 nie potrafi wiernie przedstawić tych nowoczesnych błędów ani operatorów rozlań; serializator Classic odrzuca nieobsługiwane nowoczesne reprezentacje zamiast przypisywać niepowiązany starszy kod błędu

Kontrola wstępna konwersji

TXLSXWorkbook.GetConversionReport zwraca TXLSConversionReport należący do wywołującego, bez przeliczania i bez zmian w skoroszycie; typy są zadeklarowane w lxDiagnostics

Report := Workbook.GetConversionReport(xlsConversionOpenDocument);
try
  for I := 0 to Report.Count - 1 do
    InspectIssue(Report.Items[I]);
finally
  Report.Free;
end;
TargetxlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook lub xlsConversionExcelBinaryWorkbook
FidelityTXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped lub xlsConversionUnsupported
IssueTXLSConversionIssue udostępnia Feature, Fidelity, SheetIndex, SheetName, Location i Message; HasLoss obejmuje wpisy obniżone, pominięte i nieobsługiwane

Raport inwentaryzuje znane straty formatu, takie jak VBA, ochrona, widoki skoroszytu, połączenia, tabele zapytań, komentarze, linki zewnętrzne, mapy XML, struktura tabeli, kryteria filtrów, rysunki, pamięci podręczne typowanych błędów, nieobsługiwana walidacja czy składnia formuł, własność tablic i nieprzejrzyste części rozszerzeń; opisuje zaimplementowane ścieżki konwersji i nie poświadcza każdej funkcji w każdej zewnętrznej aplikacji

ODS zachowuje zwykłe komórki tabeli, zapamiętane wyniki formuł, obsługiwany tekst i autorów adnotacji, ochronę arkusza bez hasła oraz reprezentowalne filtry, tracąc przy tym obiekt tabeli Excel, bogatszą geometrię wykresów czy nieobsługiwaną semantykę reguł; nieprzejrzysty ładunek ochrony OOXML jest raportowany jako pominięty, gdy cel nie potrafi go unieść

Fasada XLSX raportuje wyjście BIFF8 jako nieobsługiwane; do obsługiwanych przepływów BIFF użyj API skoroszytu Classic; wersja 2.384.93 dodaje ograniczony backend wartości i stylów XLSB, który odrzuca nieprzedstawialne formuły, obiekty funkcji, metadane i ustawienia obliczeń zarówno przy zapisie sprawdzanym, jak i niesprawdzanym

Zapis weryfikowany

Status := Workbook.SaveAsChecked(Stream,
  xlsxOpenDocumentSpreadsheet, False);

Przeciążenia plikowe i strumieniowe uruchamiają kontrolę wstępną znanych strat przed zapisem; AllowLossy=False odrzuca funkcje obniżone lub pominięte z diagnostyką konwersji, a AllowLossy=True jawnie akceptuje te straty i nadal odrzuca konwersje nieobsługiwane

Odrzucona kontrola wstępna pozostawia bajty celu i pozycję strumienia bez zmian; udane żądania korzystają z istniejącej transakcji zapisu i zwracają te same konwencje statusu zapisu co SaveAs

Zwykłe SaveAs pozostaje dostępne z dotychczasowym zachowaniem; aplikacje wymagające jawnej decyzji o stratach powinny przejrzeć raport i używać zapisu weryfikowanego

Formaty szablonów

xlsxOpenXMLTemplate wybiera makro-wolny XLTX, a xlsxOpenXMLMacroEnabledTemplate wybiera XLTM i zachowuje istniejący projekt VBA; format jest jawny i nie jest wnioskowany z rozszerzenia pliku ani z zaimportowanego szablonu

Makro-wolny XLTX odrzuca skoroszyt z VBA nawet przy włączonym stratnym zapisie weryfikowanym; pakiet XLTM może zostać wyemitowany bez projektu VBA, a HotXLS nie tworzy kodu VBA

Formuły walidacji ODS

Niestandardowa walidacja Boolean używa of:is-true-formula(...); obsługiwane skalarne granice, źródła list, kwalifikowane odwołania A1, ciągi i separatory argumentów tłumaczą się na OpenFormula i przy imporcie są przenoszone względem adresu bazowej komórki walidacji

Nieobsługiwane ustrukturyzowane, zewnętrzne lub trójwymiarowe wyrażenia walidacji są pomijane razem z odwołaniami swoich komórek, co eliminada wiszące definicje walidacji; kontrola wstępna konwersji raportuje pominięte reguły

Adnotacje, ochrona i filtry ODS

Zwykłe komentarze komórek eksportują się jako adnotacje OpenDocument z tekstem i autorem, łącznie z pustymi notatkami, tabulatorami, spacjami i łamaniem wierszy; notatki na nieobecnych komórkach i odległych współrzędnych korzystają z rzadkich powtarzanych przebiegów wierszy i kolumn bez tworzenia komórek arkusza

Komentarz na komórce kotwicznej scalonego zakresu zachowuje swój adres; notatka na komórce przykrytej albo poza siatką arkusza jest raportowana jako pominięta; rozbudowany tekst komentarza jest spłaszczany do wyświetlanego tekstu, a raporty konwersji wskazują utratę stylizacji przebiegów, niestandardowych wymiarów ramki i prezentacji zawsze widocznej

Flaga ochrony OpenDocument i obsługiwane style komórek zablokowanych lub odblokowanych są zachowywane; bezstratny podzbiór arkusza nie używa hasła ani wyjątków zakresów edytowalnych i pozwala wyłącznie na wybór komórek zablokowanych i odblokowanych

Sheet.Protect;
Sheet.SheetProtectionOptions :=
  [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells];
Sheet.Range['B2:B100'].Locked := False;

Hashe haseł Excela, nowoczesne ustawienia haseł, zakresy edytowalne i uprawnienia akcji poza tym podzbiorem są raportowane jako obniżone, gdy flaga ochrony pozostaje; szeroki domyślny zestaw uprawnień Excela także wymaga jawnej decyzji o stratach

Import OpenDocument zachowuje flagę ochrony i style blokady komórek; natywne hashe haseł nie są konwertowane na hashe Excela, a nieprzedstawialne zaimportowane metadane uprawnień pozostają nazwaną stratą w kolejnych raportach konwersji

Eksport AutoFilter obsługuje sześć skalarne operatorów porównania, do dwóch skalarne warunków na kolumnę łączonych AND albo OR oraz AND między kolumnami; obsługiwane zwykłe listy wyboru wartości i wybory pustych nie mają limitu dwóch wartości i pozostają natywnymi metadanymi filtra

Liczbowe skalarne kryteria korzystają z niezmiennych wartości skończonych; wybory tekstowe zachowują swoje znaki literałów, łącznie z symbolami wieloznacznymi wewnątrz list wyboru, podczas gdy wyrażenia wieloznaczne w filtrach niestandardowych, dwuznaczne kryteria Boolean, grupy dat, daty dynamiczne oraz filtry kolorów i ikon nie mają równoważnej obsługiwanej konwersji

Nieobsługiwane wyrażenia filtrów są pomijane jako całe wyrażenie zamiast osłabiać wybrane warunki; zakres filtra pozostaje, a raport konwersji wskazuje pominięte kryteria

Zapis strumieniowy ODS etapuje ukończony pakiet w zarejestrowanym pliku tymczasowym przed zapisem w pierwotnej pozycji celu; istniejące bajty przedrostka i absolutne offsety ZIP są zachowywane, łącznie z pozycjami poza pierwotnym końcem; anulowanie albo wyjątek callbacka postępu przed zatwierdzeniem zachowuje bajty, rozmiar i pozycję celu oraz zwalnia plik tymczasowy; końcowe powiadomienie o zapisie pozostaje nieanulowalne

Import OpenDocument obsługuje te same skalarne koniunkcje i tę samej kolumnie dysjunkcje tekstowe albo zbiory wartości; OR między kolumnami, wyrażenia regularne, porównania z uwzględnieniem wielkości liter i nieobsługiwane natywne operatory filtrów pozostają jawnymi stratami importu

TXLSXOdsImportLoss i TXLSXOdsImportLosses opisują prywatne kategorie pochodzenia arkusza; raporty konwersji używają ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria i ImportedOdsCommentFormatting; przeżywają kopiowanie arkusza i pojawiają się dla celów konwersji OpenDocument i Open XML

Konwersja filtrów zachowuje metadane i istniejącą widoczność wierszy bez aplikowania filtrów i przeliczania komórek; natywne aplikacje pozostają odpowiedzialne za własne zachowanie filtrowania i edycji

Powiązane przepływy