Dokumentace HotXLS

Věrnost výpočtů a konverzí

Vypočtená pole se kombinují napříč funkcemi pro výběr, řazení, vyhledávání, maticové operace a přetváření tvaru, s automatickým vlastnictvím spill v XLSX, explicitními CSE cíli a ohraničenými prostředky vyhodnocování

Dynamická pole a explicitní CSE pole

Přiřaďte výraz produkující pole jedné buňce TXLSXCell.Formula a zavolejte TXLSXWorkbook.Recalculate; výsledek vlastní obdélníkový spill kotvený v té buňce, ať už jde o vzorce jako SEQUENCE(3,2), A1:A3*10, konstanty polí, nebo výsledky LET ve formě pole

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

Přepočet výsledek zvětší nebo zmenší, vymaže jen zastaralé follower buňky vlastněné kotvou a při změně rozsahu přestaví závislosti; odkazy na nově vzniklé follower buňky a operátor spill A1# používají aktuální rozsah

Existující hodnoty, vzorce, rich text, jiná pole, sloučené oblasti, tabulky i hranice listu spill překáží a produkují #SPILL!; styly na jinak prázdných buňkách zůstávají použitelné a po odstranění překážky se příští přepočet pokusí o kotvu znovu

Úprava follower buňky hodnotou nebo rich textem ji odpojí od kotvy, takže příští výpočet zachová úpravu jako překážku; odstranění nebo vymazání kotvy uvolní její follower buňky, zatímco ConvertFormulasToValues ponechá jejich vypočtené hodnoty jako obyčejné buňky

Ukládání do XLSX zaznamená aktuální rozsah pole a metadata a načtení obnoví vlastnictví existujících uložených follower buněk dřív, než dojde na přepočet; maticové vzorce obsahující chyby si zachovají svůj rozsah, i když chyby patří jednotlivým prvkům

SetArrayFormula zůstává explicitním vstupním bodem pro CSE s pevnou oblastí v obou enginech sešitu; surová aritmetika nad oblastmi vyhodnocuje prvek po prvku uvnitř té oblasti, zatímco obyčejné skalární vzorce si ponechají implicitní průnik

Unární operátor @ provede průnik odkazu s buňkou vzorce a vezme první prvek vypočteného pole; SINGLE a ANCHORARRAY jsou přijímané aliasy pro ukládání implicitního průniku a spill odkazů

MAP přijímá více vstupních polí a odpovídající seznam parametrů LAMBDA, propaguje chyby po prvcích a vnořené výsledky typu pole odmítne s #CALC!; FILTER přijímá vypočtená pole a masky po řádcích či sloupcích, včetně propagace chyb a #CALC! pro prázdný výsledek, když není dodán fallback

Mutace dynamického spillu běží serializovaně, i když je nastaveno více výpočetních vláken; stabilizace rozsahu je omezena na 32 průchodů a dynamická pole v cyklických iterativních výpočtech se odmítnou, místo aby se brala jako skalární výsledky

INDEX přijímá odkazy, konstanty polí i vypočtená pole; jsou-li oba selektory skalární, kladné selektory řádku a sloupce vrátí jednu hodnotu, nulový selektor vrátí vybraný řádek či sloupec a dva nulové selektory vrátí kompletní pole; referenční zdroj se skalárními selektory si zachová referenční chování pro spotřebitele jako ROW nebo ISREF

Selektory řádku a sloupce můžou být také pole, ať už konstanty, vypočtené vektory, hodnoty oblastí nebo vazby LET; protilehlé orientace řádku a sloupce se rozšíří do obdélníkového kartézského součinu, zatímco shodné orientace párují pozice; singleton dimenze se rozšíří a chybějící pozice v nerovných dimenzích vrátí jednotlivé #N/A

Když je některý selektor pole, nula nebo vynechaný selektor vybere prvního člena dané osy, místo aby rozbalil celý řádek či sloupec; zlomkové selektory se ořezávají směrem k nule, záporné selektory vrátí dřív jednotlivé #VALUE! než dojde na ořez a selektory za hranicemi zdroje vrátí jednotlivé #REF!; vybrané řetězce, logické hodnoty i typované chyby si zachovají své typy

SORT a UNIQUE přijímají oblasti, konstanty i vypočtená pole, včetně vnořených výsledků FILTER, SEQUENCE a LET; orientace po řádcích či sloupcích, řazení vzestupně či sestupně, pořadí podle prvního výskytu i deduplikace na přesně jednou se chovají stejně pro každou formu zdroje

Sešitem definované názvy mohou dodávat zdroje typu odkaz, skalár nebo vypočtené pole; ISREF(INDEX(...)) odliší skutečný referenční výsledek od pojmenované vypočtené hodnoty; skalární selektory INDEX i numerické volby SORT ořezávají zlomkové hodnoty a volitelné logické argumenty odmítnou text jiný než TRUE nebo 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;

Tento příklad se selektory rozlije {1,3;7,9} do výsledku dvakrát dva; INDEX(SEQUENCE(3,3),{1;3},{1;3}) místo toho vrátí párovaný sloupec {1;9}; pole jako selektory produkují hodnoty, i když je zdroj odkaz, zatímco skalární referenční selektory zachovávají referenční identitu

Tyto výrazy se v XLSX můžou rozlít a měnit velikost, nebo se vyhodnotit uvnitř explicitního CSE cíle; chyby ze zdrojů typu pole zůstávají typované a prázdný výsledek deduplikace na přesně jednou vrátí #CALC!; výstupy selektorů požírají rozpočet kroků vyhodnocování a kombinované payloady zdroje, selektorů i výsledné matice se kontrolují proti rozpočtu paměti pro pole

INDEX přijímá explicitní čtvrtý argument area_num rovný 1 pro vypočtený zdroj a selektory řádku, sloupce a oblasti se můžou společně rozšířit přes podporované spojení odkazů v rámci jednoho listu; skutečné víceoblastové odkazy si zachovají identitu skrze lokální definované názvy a LET, zatímco skalární CHOOSE zachová vybraný odkaz, včetně volby na jiném listu; výsledky pole selektorů jsou hodnoty, nikoli vnořená pole odkazů; pravidla pro nulu, vynechané argumenty, koerci a chyby najdete v tématu Výběr oblasti v INDEX a identita odkazů

Pro samostatný výpočet přijímá TXLSCalculator.OnGetSpillRange zpětné volání TXLSGetSpillRange, které rozresoluje aktuální včetné meze kotvy; vyhodnocovače postavené na sešitu toto zpětné volání instalují automaticky

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

lxNormalizeStorageFormula normalizuje autorskou syntaxi vzorců pro OOXML, lxTryStorageFormulaOperators překládá operátory spill a implicitního průniku a lxApplyXlfnPrefix aplikuje vyžadované prefixy future funkcí; chráněný text a oddělovače řádků polí zůstávají nedotčené a přiřazení vzorce si v paměti ponechá text volajícího

Ukládání nezmění autorský výraz v paměti; opětovné otevření nově napsaných vzorců XLSX vrátí kanonickou úložní syntaxi s argumenty oddělenými čárkami a bez úvodního =, stejně jako nativní import z Excelu; nezměněné importované XML vzorců si ponechá svou stávající cestu zachování

Kombinace vyhledávání, matic a přetváření tvaru

TRANSPOSE přijímá odkazy, konstanty i vypočtená pole a zachovává text, logické hodnoty i jednotlivé chyby; prázdné zdrojové buňky se stanou numerickou nulou

MMULT, MDETERM a MINVERSE přijímají vypočtené matice a vnořené výrazy jako MMULT(MUNIT(2),SEQUENCE(2,2)); jejich maticové prvky musí být numerické, text, logické hodnoty a prázdné buňky se odmítnou místo vynucené konverze a zdrojové chyby si zachovají své kódy

CHOOSECOLS a CHOOSEROWS přijímají skalární nebo jednorozměrné selektorové vektory, skládají selektory v pořadí argumentů, zachovávají duplicity a záporné indexy počítají od konce; zlomkové selektory se ořezávají směrem k nule, nula a selektory mimo rozsah se odmítnou a dvourozměrné selektorové matice nejsou podporované

XLOOKUP, XMATCH a MATCH přijímají vypočtené vyhledávací vektory i vyhledávací požadavky ve formě pole; klíče musí zabírat jeden řádek nebo jeden sloupec a návratová pole XLOOKUP musí být zarovnaná s touto vyhledávací osou

Skalární XLOOKUP může vrátit celý odpovídající řádek nebo sloupec, včetně typovaných chyb; vyhledávací požadavek ve formě pole si zachová vlastní tvar a z každého odpovídajícího řezu či fallback pole vezme první složku

Vyhledávání na přesnost přeskakuje chybové položky v klíčovém vektoru; logické, numerické i textové klíče zůstávají rozlišené, zatímco obyčejné skalární referenční cesty si ponechají své stávající streamovací chování a mezipaměť přepočtu; binární režimy hledání stále vyžadují správně seřazené klíče

VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS a EXPAND přijímají vypočtené vstupy i typovanou výplň; výsledek bez řádků nebo sloupců vrátí #CALC! a zalámání vyžaduje jednorozměrný vstup

Práce s maticemi, prohledávání při vyhledávání, průchod selektory, kopírování i výplň požírají rozpočet kroků vyhodnocování; současně udržované payloady vstupních, pracovních i výsledných matic se před alokací kontrolují proti nastavenému limitu paměti pro pole

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;

Typované moderní výpočetní chyby

#SPILL! a #CALC! zůstávají typovanými chybami buněk skrze výpočet, zobrazení, inspekci mezipaměti i opětovné otevření XLSX; výstup XLSX nese jejich metadata rich value a zároveň zachovává standardní fallback uložené chyby pro čtečky, které toto rozšíření neznají

Textové výsledky vzorců, včetně followerů CSE a dynamických polí, používají mezipaměti literálních řetězců, aby je Excel uměl zobrazit před přepočtem; obyčejné buňky s hodnotami dál používají sdílené řetězce

Moderní výstup rich chyb zahrnuje verzi sešitu a deklarace výpočetní funkce Rich Data, které Excel potřebuje k interpretaci těchto mezipamětí před přepočtem; emitovaný calcId je alespoň 191029, vyšší požadované hodnoty se zachovají, aniž by se změnila vlastnost CalcId sešitu v paměti

Importovaná metadata buněk a hodnot, nesouvisející struktury rich value a neprůhledné bucket zůstanou při přidávání nových chybových bucket v původní identitě; nahrazení chybové buňky při uložení vymaže zastaralá metadata typovaných chyb

TXLSXRichErrorCodes je typ pole integerů používaný pro dekódované bucket rich chyb; aplikační kód čte typované chyby z Variant hodnoty buňky

BIFF8 neumí tyto moderní chyby a operátory spill věrně reprezentovat; klasický serializátor odmítne nepodporované moderní reprezentace, místo aby přiřadil nesouvisející starší chybový kód

Předběžná kontrola konverzí

TXLSXWorkbook.GetConversionReport vrátí TXLSConversionReport vlastněný volajícím, aniž by přepočítala nebo změnila sešit; typy jsou deklarované v 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, nebo xlsConversionExcelBinaryWorkbook
FidelityTXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped, nebo xlsConversionUnsupported
IssueTXLSConversionIssue zpřístupňuje Feature, Fidelity, SheetIndex, SheetName, Location a Message; HasLoss zahrnuje položky degraded, dropped i unsupported

Hlášení vyinventáří známé ztráty formátu, jako jsou VBA, ochrana, zobrazení sešitu, připojení, tabulky dotazů, komentáře, externí odkazy, mapy XML, struktura tabulek, kritéria filtrů, kreslení, mezipaměti typovaných chyb, nepodporovaná validace či syntaxe vzorců, vlastnictví polí a neprůhledné rozšiřující části; popisuje implementované konverzní cesty a negarantuje podporu každé funkce v každé externí aplikaci

ODS zachová obyčejné buňky tabulek, uložené výsledky vzorců, podporovaný text a autory anotací, ochranu listu bez hesla a reprezentovatelné filtry, zatímco ztratí objekt excelové tabulky, bohatší geometrii grafů nebo nepodporovanou sémantiku pravidel; neprůhledný zachovaný payload OOXML se při cíli, který jej neunese, nahlásí jako dropped

Fasáda XLSX hlásí výstup BIFF8 jako nepodporovaný; pro podporované pracovní postupy BIFF použijte klasické API sešitu; verze 2.384.93 přidává ohraničený backend hodnot a stylů XLSB, který odmítne nereprezentované vzorce, objekty funkcí, metadata a výpočetní nastavení při kontrolovaném i nekontrolovaném ukládání

Kontrolované ukládání

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

Přetížení pro soubor i stream spustí předběžnou kontrolu známých ztrát dřív, než se cokoli zapíše; AllowLossy=False odmítne degraded a dropped funkce s konverzní diagnostikou, zatímco AllowLossy=True tyto ztráty výslovně přijme a i tak odmítne nepodporované konverze

Odmítnutá předběžná kontrola nechá cílové bajty i pozici streamu beze změny; úspěšné požadavky použijí stávající transakci ukládání a vrátí stejnou konvenci stavů jako SaveAs

Obyčejné SaveAs zůstává dostupné se svým stávajícím chováním; aplikace, které potřebují výslovné rozhodnutí o ztrátách, si mají hlášení prohlédnout a použít kontrolované ukládání

Šablonové formáty

xlsxOpenXMLTemplate volí XLTX bez maker, zatímco xlsxOpenXMLMacroEnabledTemplate volí XLTM a zachová existující VBA projekt; formát je explicitní a neodvozuje se z přípony souboru ani z importované šablony

XLTX bez maker odmítne sešit nesoucí VBA, i když je kontrolované ztrátové ukládání povolené; balíček XLTM může být emitován i bez VBA projektu a HotXLS samo žádný VBA kód nevytváří

Validační vzorce ODS

Vlastní logická validace používá of:is-true-formula(...); podporované skalární meze, zdroje seznamů, kvalifikované odkazy A1, řetězce i oddělovače argumentů se přeloží do OpenFormula a při importu se přebasují vůči základní buňce validace

Nepodporované strukturované, externí či trojrozměrné validační výrazy se vynechají společně s odkazy svých buněk, takže nevzniknou visící definice validace; předběžná kontrola konverzí vynechaná pravidla nahlásí

Anotace, ochrana a filtry ODS

Obyčejné komentáře buněk se exportují jako anotace OpenDocument s textem i autorem, včetně prázdných poznámek, tabulátorů, mezer a zalomení řádků; poznámky na jinak neexistujících buňkách a vzdálených souřadnicích použijí řídké opakované běhy řádků a sloupců, aniž by vytvořily buňky listu

Komentář na kotvě sloučené oblasti si zachová svou adresu; poznámka na překryté buňce nebo mimo mřížku listu se nahlásí jako dropped; rich text komentáře se zploští na zobrazovaný text a konverzní hlášení identifikuje ztrátu stylů běhů, vlastních rozměrů rámečku i trvale viditelného zobrazení

Příznak ochrany OpenDocument a podporované styly zamčených či odemčených buněk se zachovají; bezztrátová podmnožina listu nepoužívá heslo ani výjimky upravitelných oblastí a dovolí jen výběr zamčených a odemčených buněk

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

Hash hesla Excelu, moderní nastavení hesel, upravitelné oblasti a akční oprávnění mimo tuto podmnožinu se nahlásí jako degraded, zatímco příznak ochrany zůstane; široká výchozí sada oprávnění Excelu také vyžaduje výslovné rozhodnutí o ztrátě

Import OpenDocument zachová příznak ochrany a styly zámku buněk; nativní hashe hesel se na excelové hashe nepřevádějí a nereprezentovaná importovaná oprávnění zůstávají pojmenovanou ztrátou v dalších konverzních hlášeních

Export AutoFilteru podporuje šest skalárních srovnávacích operátorů, až dvě skalární podmínky na sloupec spojené AND nebo OR a AND mezi sloupci; podporované prosté seznamy vybraných hodnot a výběry prázdných hodnot nemají limit na dvě hodnoty a zůstávají nativními metadaty filtru

Numerická skalární kritéria používají invariantní konečné hodnoty; textové výběry zachovávají své literální znaky, včetně zástupných znaků uvnitř výběrových seznamů, zatímco výrazy se zástupnými znaky ve vlastních filtrech, dvojznačná logická kritéria, skupiny dat, dynamická data a filtry podle barvy či ikony nemají žádnou ekvivalentní podporovanou konverzi

Nepodporované filtrovací výrazy se vynechají jako kompletní výraz, místo aby se oslabily vybrané podmínky; rozsah filtru zůstane a konverzní hlášení identifikuje vynechaná kritéria

Ukládání streamu ODS si před zápisem na původní pozici cíle připraví hotový balíček v registrovaném dočasném souboru; existující prefix bajtů i absolutní offsety ZIP zůstanou zachované, včetně pozic za původním koncem souboru; zrušení nebo výjimka zpětného volání průběhu před potvrzením zachová bajty, velikost i pozici cíle a uvolní dočasný soubor; finální notifikace zápisu zůstává nezrušitelná

Import OpenDocument podporuje stejné skalární konjunkce a textové disjunkce či množiny hodnot ve stejném sloupci; OR napříč sloupci, regulární výrazy, porovnávání citlivé na velikost písmen a nepodporované nativní operátory filtrů zůstávají výslovně importovanými ztrátami

TXLSXOdsImportLoss a TXLSXOdsImportLosses popisují kategorie původu privátního listu; konverzní hlášení používají ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria a ImportedOdsCommentFormatting; přežijí kopírování listů a objeví se u konverzních cílů OpenDocument i Open XML

Konverze filtrů zachová metadata a stávající viditelnost řádků, aniž by aplikovala filtry nebo přepočítala buňky; nativní aplikace si nesou odpovědnost za vlastní chování filtrování a editace

Související pracovní postupy