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;
| Target | xlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook, nebo xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped, nebo xlsConversionUnsupported |
| Issue | TXLSConversionIssue 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