Docs HotXLS

Fidélité de calcul et de conversion

Les tableaux calculés se composent à travers les fonctions de sélection, de tri, de recherche, matricielles et de remodelage, avec une possession automatique de spill XLSX, des destinations CSE explicites et des ressources d'évaluation bornées

Tableaux dynamiques et tableaux CSE explicites

Affectez une expression produisant un tableau à un seul TXLSXCell.Formula et appelez TXLSXWorkbook.Recalculate ; le résultat possède un spill rectangulaire ancré à cette cellule, y compris des formules telles que SEQUENCE(3,2), A1:A3*10, les constantes tableaux et les résultats LET à valeur de tableau

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

Le recalcul fait grandir ou rétrécir le résultat, n'efface que les successeurs obsolètes détenus par l'ancre et reconstruit les dépendances quand l'étendue change ; les références aux successeurs nouvellement créés et l'opérateur de spill A1# emploient l'étendue courante

Des valeurs existantes, formules, texte enrichi, autres tableaux, plages fusionnées, tables et bornes de feuille de calcul obstruent un spill et produisent #SPILL! ; les styles sur des cellules autrement vides restent utilisables, et la suppression d'une obstruction permet au prochain recalcul de retenter l'ancre

Éditer un successeur avec une valeur ou du texte enrichi détache cette cellule de l'ancre, de sorte que le prochain calcul conserve l'édition comme obstruction ; supprimer ou vider l'ancre libère ses successeurs détenus, tandis que ConvertFormulasToValues garde leurs valeurs calculées comme cellules ordinaires

L'enregistrement XLSX mémorise l'étendue de tableau courante et ses métadonnées, et le chargement restaure la possession des successeurs en cache existants avant le recalcul ; les formules matricielles contenant des erreurs conservent quand même leur étendue quand les erreurs appartiennent à des éléments individuels

SetArrayFormula reste le point d'entrée CSE explicite à plage fixe dans les deux moteurs de classeurs ; l'arithmétique brute de plages s'évalue élément par élément à l'intérieur de cette plage, tandis que les formules scalaires ordinaires conservent l'intersection implicite

L'opérateur unaire @ intersecte une référence avec la cellule de la formule et prend le premier élément d'un tableau calculé ; SINGLE et ANCHORARRAY sont des alias de stockage acceptés pour l'intersection implicite et les références de spill

MAP accepte plusieurs tableaux d'entrée et une liste de paramètres LAMBDA correspondante, propage les erreurs d'éléments et rejette les résultats de tableaux imbriqués avec #CALC! ; FILTER accepte des tableaux calculés et des masques de lignes ou de colonnes, avec propagation d'erreurs et un #CALC! de résultat vide quand aucun repli n'est fourni

La mutation de spill dynamique s'exécute en série même quand plusieurs threads de calcul sont configurés ; la stabilisation de l'étendue est bornée à 32 passes, et les tableaux dynamiques dans des calculs itératifs circulaires sont rejetés au lieu d'être traités comme des résultats scalaires

INDEX accepte des références, des constantes tableaux et des tableaux calculés ; quand les deux sélecteurs sont scalaires, des sélecteurs de ligne et de colonne positifs renvoient une valeur, un sélecteur zéro renvoie la ligne ou la colonne sélectionnée, et deux sélecteurs zéro renvoient le tableau complet ; une source de référence avec des sélecteurs scalaires conserve le comportement de référence pour des consommateurs tels que ROW et ISREF

Les sélecteurs de lignes et de colonnes peuvent aussi être des tableaux, constantes, vecteurs calculés, valeurs de plages et liaisons LET compris ; des orientations de lignes et de colonnes opposées broadcastent vers un produit cartésien rectangulaire, tandis que des orientations identiques sélectionnent des positions appariées ; les dimensions singleton broadcastent, et les positions manquantes dans des dimensions inégales renvoient des valeurs #N/A individuelles

Quand l'un des sélecteurs au moins est un tableau, un sélecteur zéro ou omis choisit le premier membre de cet axe au lieu d'étendre une ligne ou une colonne entière ; les sélecteurs fractionnaires tronquent vers zéro, les sélecteurs négatifs renvoient des valeurs #VALUE! individuelles avant troncature, et les sélecteurs au-delà des bornes de la source renvoient des valeurs #REF! individuelles ; les chaînes, Boolean et erreurs typées sélectionnés conservent leurs types

SORT et UNIQUE acceptent des plages, des constantes et des tableaux calculés, résultats imbriqués FILTER, SEQUENCE et LET compris ; l'orientation lignes/colonnes, le tri croissant ou décroissant, l'ordre de première occurrence et la déduplication une-seule-fois suivent le même contrat pour chaque forme de source

Les noms définis au niveau du classeur peuvent fournir des sources de référence, scalaires ou de tableaux calculés ; ISREF(INDEX(...)) distingue un résultat de référence réel d'une valeur calculée nommée ; les sélecteurs INDEX scalaires et les options numériques de SORT tronquent les valeurs fractionnaires, et les arguments Boolean facultatifs rejettent tout texte autre que TRUE ou 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;

Cet exemple de sélecteurs propage {1,3;7,9} dans un résultat deux par deux ; INDEX(SEQUENCE(3,3),{1;3},{1;3}) renvoie à la place la colonne appariée {1;9} ; les sélecteurs tableaux produisent des valeurs même quand la source est une référence, tandis que des sélecteurs de référence scalaires préservent l'identité de référence

Ces expressions peuvent se propager et se redimensionner en XLSX ou s'évaluer dans une destination CSE explicite ; les erreurs de sources tableaux restent typées et un résultat vide une-seule-fois renvoie #CALC! ; les sorties de sélecteurs consomment le budget de pas d'évaluation, et les payloads combinés de source, de sélecteurs et de matrice résultat sont vérifiés contre le budget mémoire des tableaux

INDEX accepte un quatrième argument area_num explicite valant 1 pour une source calculée, et les sélecteurs de lignes, de colonnes et de zones peuvent broadcaster ensemble sur une union de références de même feuille prise en charge ; les vraies références multi-zones conservent leur identité à travers les noms définis locaux et LET, tandis qu'un CHOOSE scalaire conserve la référence sélectionnée, y compris un choix sur une autre feuille ; les résultats de sélecteurs tableaux sont des valeurs plutôt que des tableaux de références imbriqués ; voir la sélection de zone INDEX et l'identité de référence pour les règles de zéro, d'absence, de coercition et d'erreurs

Pour un calcul autonome, TXLSCalculator.OnGetSpillRange accepte un callback TXLSGetSpillRange qui résout les bornes inclusives courantes d'une ancre ; les évaluateurs adossés à un classeur installent ce callback automatiquement

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

lxNormalizeStorageFormula normalise la syntaxe de formules saisies pour l'OOXML, lxTryStorageFormulaOperators traduit les opérateurs de spill et d'intersection implicite, et lxApplyXlfnPrefix applique les préfixes de fonctions futures requis ; les séparateurs de texte protégé et de lignes de tableaux restent intacts, et l'affectation d'une formule conserve le texte de l'appelant en mémoire

L'enregistrement ne modifie pas l'expression saisie en mémoire ; la réouverture de formules XLSX nouvellement saisies renvoie la syntaxe de stockage canonique avec des arguments à virgules et sans = en tête, en cohérence avec les imports Excel natifs ; le XML de formules importées inchangé conserve son chemin de préservation existant

Composition de recherche, matricielle et de remodelage

TRANSPOSE accepte des références, des constantes et des tableaux calculés tout en préservant texte, Boolean et erreurs individuelles ; les cellules sources vides deviennent un zéro numérique

MMULT, MDETERM et MINVERSE acceptent des matrices calculées et des expressions imbriquées telles que MMULT(MUNIT(2),SEQUENCE(2,2)) ; leurs entrées matricielles doivent être numériques, texte, Boolean et vides étant rejetés plutôt que contraints, et les erreurs sources conservant leurs codes d'erreur

CHOOSECOLS et CHOOSEROWS acceptent des vecteurs de sélecteurs scalaires ou unidimensionnels, concatènent les sélecteurs dans l'ordre des arguments, préservent les doublons et comptent les indices négatifs depuis la fin ; les sélecteurs fractionnaires tronquent vers zéro, les sélecteurs zéro et hors bornes sont rejetés, et les matrices de sélecteurs à deux dimensions ne sont pas prises en charge

XLOOKUP, XMATCH et MATCH acceptent des vecteurs de recherche calculés et des demandes de recherche à valeur de tableau ; les clés doivent occuper une seule ligne ou une seule colonne, et les tableaux renvoyés par XLOOKUP doivent s'aligner sur cet axe de recherche

Un XLOOKUP scalaire peut renvoyer une ligne ou une colonne correspondante entière, erreurs typées comprises ; une demande de recherche à valeur de tableau conserve sa propre forme et prend le premier composant de chaque tranche ou tableau de repli correspondant

Les scans de recherche exacte sautent les entrées en erreur dans le vecteur de clés ; les clés Boolean, numériques et textuelles restent distinctes, tandis que les chemins scalaires de référence ordinaires conservent leur comportement existant de streaming et de cache de recalcul ; les modes de recherche binaire exigent toujours des clés correctement triées

VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS et EXPAND acceptent des entrées calculées et du bourrage typé ; un résultat sans lignes ni colonnes renvoie #CALC!, et le rembobinage exige une entrée unidimensionnelle

Le travail matriciel, les scans de recherche, le parcours des sélecteurs, la copie et le bourrage consomment le budget de pas d'évaluation ; les payloads de matrices d'entrée, de travail et de sortie simultanément retenus sont vérifiés contre la limite mémoire de tableaux configurée avant allocation

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;

Erreurs de calcul modernes typées

#SPILL! et #CALC! restent des erreurs de cellules typées à travers le calcul, l'affichage, l'inspection des caches et la réouverture XLSX ; la sortie XLSX transporte leurs métadonnées de rich-value tout en conservant le repli standard d'erreurs en cache pour les lecteurs qui ne comprennent pas cette extension

Les résultats de textes de formules, successeurs CSE et de tableaux dynamiques compris, emploient des caches de chaînes littérales afin qu'Excel puisse les afficher avant le recalcul ; les cellules de valeurs simples continuent d'employer des chaînes partagées

La sortie moderne d'erreurs riches inclut la version du classeur et les déclarations de fonctionnalités de calcul Rich Data exigées par Excel pour interpréter ces caches avant le recalcul ; le calcId émis vaut au moins 191029, en préservant des valeurs demandées plus hautes sans modifier la propriété CalcId du classeur en mémoire

Les métadonnées importées de cellules et de valeurs, les structures de rich-value sans rapport et les compartiments opaques conservent leurs identités d'origine quand de nouveaux compartiments d'erreurs sont ajoutés ; remplacer une cellule en erreur efface les métadonnées d'erreurs typées obsolètes à l'enregistrement

TXLSXRichErrorCodes est le type de tableau d'entiers employé pour les compartiments d'erreurs riches décodés ; le code applicatif lit les erreurs typées depuis la valeur Variant de la cellule

BIFF8 ne peut pas représenter fidèlement ces erreurs modernes ni ces opérateurs de spill ; le sérialiseur Classic rejette les représentations modernes non prises en charge au lieu d'affecter un code d'erreur legacy sans rapport

Preflight de conversion

TXLSXWorkbook.GetConversionReport renvoie un TXLSConversionReport détenu par l'appelant, sans recalculer ni modifier le classeur ; les types sont déclarés dans 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, or xlsConversionExcelBinaryWorkbook
FidelityTXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped, or xlsConversionUnsupported
IssueTXLSConversionIssue exposes Feature, Fidelity, SheetIndex, SheetName, Location, and Message; HasLoss includes degraded, dropped, and unsupported entries

Le rapport recense les pertes de format connues telles que VBA, protection, vues du classeur, connexions, tables de requêtes, commentaires, liens externes, mappages XML, structure de tables, critères de filtres, dessins, caches d'erreurs typées, validation ou syntaxe de formules non prise en charge, possession de tableaux et parties d'extension opaques ; il décrit les chemins de conversion implémentés et ne certifie pas chaque fonctionnalité dans chaque application externe

ODS conserve les cellules de tables ordinaires, les résultats de formules en cache, le texte et les auteurs d'annotations pris en charge, la protection de feuilles sans mot de passe et les filtres représentables, tout en perdant l'objet table Excel, la géométrie de graphiques plus riche ou la sémantique de règles non prise en charge ; un payload de préservation OOXML opaque est signalé comme perdu quand la cible ne peut pas le transporter

La facade XLSX signale la sortie BIFF8 comme non prise en charge ; employez l'API de classeurs Classic pour les workflows BIFF pris en charge ; la version 2.384.93 ajoute un backend XLSB borné de valeurs et de styles qui rejette les formules, objets de fonctionnalités, métadonnées et réglages de calcul non représentés, aussi bien dans les enregistrements vérifiés que non vérifiés

Enregistrement vérifié

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

Les overloads fichier et stream exécutent le preflight de pertes connues avant l'écriture ; AllowLossy=False rejette les fonctionnalités dégradées ou perdues avec des diagnostics de conversion, tandis que AllowLossy=True accepte explicitement ces pertes et rejette toujours les conversions non prises en charge

Un preflight rejeté laisse les octets de destination et la position du stream inchangés ; les requêtes réussies emploient la transaction d'enregistrement existante et renvoient les mêmes conventions de statut d'enregistrement que SaveAs

Le SaveAs ordinaire reste disponible avec son comportement existant ; les applications qui exigent une décision explicite de perte devraient inspecter le rapport et employer l'enregistrement vérifié

Formats de modèles

xlsxOpenXMLTemplate sélectionne le XLTX sans macros, tandis que xlsxOpenXMLMacroEnabledTemplate sélectionne le XLTM et préserve un projet VBA existant ; le format est explicite et n'est pas déduit d'une extension de fichier ni d'un modèle importé

Le XLTX sans macros rejette un classeur porteur de VBA même quand l'enregistrement vérifié avec perte est activé ; un package XLTM peut être émis sans projet VBA, et HotXLS ne crée pas de code VBA

Formules de validation ODS

La validation Boolean personnalisée emploie of:is-true-formula(...) ; les bornes scalaires prises en charge, sources de listes, références A1 qualifiées, chaînes et séparateurs d'arguments se traduisent vers OpenFormula et sont rebasés contre l'adresse de la cellule de base de validation à l'import

Les expressions de validation structurées, externes ou tridimensionnelles non prises en charge sont omises avec leurs références de cellules, évitant des définitions de validation pendantes ; le preflight de conversion signale les règles omises

Annotations, protection et filtres ODS

Les commentaires de cellules ordinaires s'exportent en annotations OpenDocument avec leur texte et leur auteur, notes vides, tabulations, espaces et sauts de ligne compris ; les notes sur des cellules autrement absentes et des coordonnées éloignées emploient des séries clairsemées répétées de lignes et de colonnes sans créer de cellules de feuille de calcul

Un commentaire sur la cellule d'ancre d'une plage fusionnée conserve son adresse ; une note sur une cellule couverte ou hors de la grille de la feuille est signalée comme perdue ; le texte enrichi des commentaires est aplati vers son texte affiché, et les rapports de conversion identifient la perte du stylage de runs, des dimensions de boîtes personnalisées et de la présentation toujours visible

L'indicateur de protection OpenDocument et les styles de cellules verrouillées ou déverrouillées pris en charge sont conservés ; le sous-ensemble de feuilles sans perte n'emploie ni mot de passe ni exceptions de plages modifiables et n'autorise la sélection que des cellules verrouillées et déverrouillées

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

Les hash de mots de passe Excel, les réglages de mots de passe modernes, les plages modifiables et les permissions d'actions hors de ce sous-ensemble sont signalés comme dégradés tant que l'indicateur de protection reste ; le jeu par défaut large de permissions Excel exige aussi une décision explicite de perte

L'import OpenDocument conserve l'indicateur de protection et les styles de verrouillage de cellules ; les hash de mots de passe natifs ne sont pas convertis en hash Excel, et les métadonnées de permissions importées non représentées restent une perte nommée dans les rapports de conversion ultérieurs

L'export AutoFilter accepte six opérateurs de comparaison scalaires, jusqu'à deux conditions scalaires par colonne jointes par AND ou OR, et un AND entre colonnes ; les listes de sélection de valeurs simples prises en charge et les sélections de vides n'ont pas de limite à deux valeurs et restent des métadonnées de filtres natives

Les critères scalaires numériques emploient des valeurs finies invariantes ; les sélections de texte préservent leurs caractères littéraux, caractères joker à l'intérieur des listes de sélection compris, tandis que les expressions joker dans les filtres personnalisés, les critères Boolean ambigus, les groupes de dates, les dates dynamiques et les filtres de couleurs et d'icônes n'ont pas de conversion prise en charge équivalente

Les expressions de filtres non prises en charge sont omises en tant qu'expression complète au lieu d'affaiblir des conditions sélectionnées ; la plage de filtres reste, et le rapport de conversion identifie les critères omis

Les enregistrements de streams ODS mettent le package achevé en staging dans un fichier temporaire enregistré avant d'écrire à la position d'origine de la destination ; les octets de préfixe existants et les offsets ZIP absolus sont conservés, positions au-delà de la fin d'origine comprises ; une annulation ou une exception de callback de progression avant le commit préserve les octets, la taille et la position de la destination et libère le fichier temporaire ; la notification d'écriture finale reste non annulable

L'import OpenDocument accepte les mêmes conjonctions scalaires et les mêmes disjonctions de textes ou ensembles de valeurs de même colonne ; le OR entre colonnes, les expressions régulières, les comparaisons sensibles à la casse et les opérateurs de filtres natifs non pris en charge restent des pertes importées explicites

TXLSXOdsImportLoss et TXLSXOdsImportLosses décrivent les catégories privées de provenance des feuilles ; les rapports de conversion emploient ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria et ImportedOdsCommentFormatting ; elles survivent à la copie de feuilles et apparaissent pour les cibles de conversion OpenDocument comme Open XML

La conversion de filtres conserve les métadonnées et la visibilité existante des lignes sans appliquer de filtres ni recalculer des cellules ; les applications natives restent responsables de leur propre comportement de filtrage et d'édition

Workflows associés