HotXLS Docs

Notes de version HotXLS

Historique des versions pour les fonctionnalités visibles, les correctifs, les améliorations XLS/XLSX, les exports, la compatibilité et la documentation de HotXLS.

[Unreleased]

Version 2.88.111

Version 2.88.110

Version 2.88.109

Version 2.88.108

Version 2.88.107

Version 2.88.106

Version 2.88.105

Version 2.88.104

Version 2.88.103

Version 2.88.102

Version 2.88.101

Version 2.88.100

Version 2.88.99

Version 2.88.98

Version 2.88.97

Version 2.88.96

Version 2.88.95

Version 2.88.94

Version 2.88.93

Version 2.88.92

Version 2.88.91

Version 2.88.90

Version 2.88.89

Version 2.88.88

Version 2.88.87

Version 2.88.86

Version 2.88.85

Version 2.88.84

Version 2.88.83

Version 2.88.82

Version 2.88.81

Version 2.88.80

Version 2.88.79

Version 2.88.78

Version 2.88.77

Version 2.88.76

Version 2.88.75

Version 2.88.74

Version 2.88.73

Version 2.88.72

Version 2.88.71

Version 2.88.70

Version 2.88.69

Version 2.88.68

Version 2.88.67

Version 2.88.66

Version 2.88.65

Version 2.88.64

Version 2.88.63

Version 2.88.62

Version 2.88.61

Version 2.88.60

Version 2.88.59

Version 2.88.58

Version 2.88.57

Version 2.88.56

Version 2.88.55

Version 2.88.54

Version 2.88.53

Version 2.88.52

Version 2.88.51

Version 2.88.50

Version 2.88.49

Version 2.88.48

Version 2.88.47

Version 2.88.46

Version 2.88.45

Version 2.88.44

Version 2.88.43

Version 2.88.42

Version 2.88.41

Version 2.88.40

Version 2.88.39

Version 2.88.38

Version 2.88.37

Version 2.88.36

Version 2.88.35

Version 2.88.34

Version 2.88.33

Version 2.88.32

Version 2.88.31

Version 2.88.30

Version 2.88.29

Version 2.88.28

Version 2.88.27

Version 2.88.26

Version 2.88.25

Version 2.88.24

Version 2.88.23

Version 2.88.22

Version 2.88.21

Version 2.88.20

Version 2.88.19

Version 2.88.18

Version 2.88.17

Version 2.88.16

Version 2.88.15

Version 2.88.14

Version 2.88.13

Version 2.88.12

Version 2.88.11

Version 2.88.10

Version 2.88.9

Version 2.88.8

Version 2.88.7

Version 2.88.6

Version 2.88.5

Version 2.88.4

Version 2.88.3

Version 2.88.2

Version 2.88.1

Version 2.88.0

Version 2.87.4

Version 2.87.3

Version 2.87.2

Version 2.87.1

Version 2.87.0

Version 2.86.1

Version 2.86.0

Version 2.85.1

Version 2.85.0

Version 2.84.1

Version 2.84.0

Version 2.83.2

Version 2.83.1

Version 2.83.0

Version 2.82.0

Version 2.81.0

Version 2.80.1

Version 2.80.0

Version 2.70.0

Version 2.69.0

Version 2.68.0

Version 2.67.0

Version 2.66.0

Version 2.65.0

Version 2.64.0

Version 2.63.0

Version 2.62.0

Version 2.61.0

Version 2.60.0

Version 2.59.0

Version 2.58.1

Version 2.58.0

Version 2.57.0

Version 2.56.0

Version 2.55.1

Version 2.55.0

Version 2.54.1

Version 2.54.0

Version 2.53.0

Version 2.52.0

Version 2.51.0

  • **[MS-XLSX] :** Vérification croisée réussie. Cinq corrections de format de données et de sécurité linguistique ont été apportées au module d'écriture XLSX, découvertes lors de la validation par rapport à la documentation Microsoft *[MS-XLSX] — Extensions Excel (.xlsx) au format Office Open XML SpreadsheetML* (version 20260108) et aux exigences du schéma XML 1.0 / OOXML. L'API publique n'a pas été modifiée ; les applications existantes peuvent être recompilées et enregistrées sans modification.
  • Les fichiers .xlsx enregistrés s'ouvrent désormais dans toutes les régions Windows. Les marges de page, les largeurs de colonnes, les hauteurs de lignes, les tailles de police, les teintes de couleur, les teintes de thème, les tailles de texte enrichi de polices personnalisées et la valeur numérique de chaque cellule, encadrée par <v>, étaient sérialisées via la fonction `FloatToStr` sensible à la locale de Delphi. Sur Windows configuré pour une région dont le séparateur décimal est une virgule (la plupart de l'Europe continentale et certaines régions d'Asie/Amérique latine), le programme écrivait des valeurs d'attribut comme `width="8,43"` et `top="0,75"`, ce que le schéma OOXML rejette. Excel affichait un message du type "Nous avons trouvé un problème avec le contenu du fichier <file>.xlsx" et proposait une option de récupération qui effaçait les paramètres de page, les largeurs de colonnes et les valeurs numériques des cellules. Chaque attribut OOXML à double valeur utilise désormais un séparateur "." invariable, quel que soit la région active. La même correction corrige également le cache en mémoire des largeurs de colonnes/hauteurs de lignes qui stockait auparavant des chaînes formatées selon la locale ; `GetColWidth` / `GetRowHeight` renvoyaient `0.0` immédiatement après un appel à `SetColWidth` / `SetRowHeight` sur le même classeur dans ces régions.
  • Les cellules contenant des caractères de contrôle ne corrompent plus le classeur. XML 1.0 §2.2 interdit les codes ASCII de 0x00 à 0x08, 0x0B, 0x0C, 0x0E à 0x1F (et U+FFFE / U+FFFF) dans tout document XML ; ils ne peuvent pas non plus être encodés comme références de caractères numériques. Les valeurs de cellules qui contenaient ces octets (données héritées, dumps de journaux, sentinelles de touches d'échappement) étaient auparavant écrites textuellement dans <t>...</t>, ce qui empêchait l'ouverture du fichier .xlsx et rendait les données inaccessibles. L'outil d'écriture supprime désormais silencieusement les caractères interdits ; les espaces valides (TAB / LF / CR) sont préservés.
  • **Les sauts de ligne à l'intérieur des valeurs des attributs sont maintenant correctement conservés lors de la lecture et de l'écriture.** XML §3.3.3 normalise les caractères TAB / LF / CR bruts à l'intérieur d'une valeur d'attribut en un seul espace avant de transmettre la valeur à l'application. Les en-têtes / pieds de page multilignes, les commentaires des noms définis, les invites de validation des données multilignes, les chaînes d'affichage des hyperliens et tout autre attribut contenant un saut de ligne avaient tendance à se réduire à un seul espace lors du chargement. `XlsxEscapeAttr` émet désormais ces caractères sous forme de références de caractères numériques `&#x9;` / `&#xA;` / `&#xD;` afin qu'Excel les interprète comme les espaces blancs originaux.
  • **Les entrées <col> sont émises dans l'ordre croissant des colonnes.** ECMA-376 18.3.1.4 / 18.3.1.13 exige que chaque entrée <col min="..."/> apparaisse dans l'ordre croissant de la valeur `min`. L'ancien `TStringList(Sorted=True)` supprimait les doublons et triait les indices de colonne entiers lexicalement ("10" avant "2"), de sorte qu'une feuille qui personnalisait à la fois la colonne 2 et la colonne 10 produisait <col min="10"/> avant <col min="2"/>. Excel tolérait cette disposition, mais la validation des fichiers Office signalait le fichier, et les consommateurs OOXML stricts (mode strict d'Apache POI, LibreOffice avec la validation stricte activée) le rejettent. Les entrées de colonnes sont maintenant triées numériquement avant d'être émises.

Version 2.50.0

  • OpenOffice excelfileformat.pdf cross-audit pass. Eight follow-up wire-format and lifetime fixes uncovered by re-validating the BIFF8 writer / reader against the OpenOffice Microsoft Excel File Format documentation after the v2.49.0 [MS-XLS] pass. Public API is unchanged; existing applications recompile and re-save without modification.
  • Shared formulas now span the full column range (§5.94 SHAREDFMLA). The SHRFMLA record body wrote colFirst into the colLast byte, collapsing every multi-column shared formula group to a single-column group in Excel. Fill-down formulas across two or more columns now expand to the correct cells when the workbook is reopened. The reader-side colLast width was also corrected.
  • Shared formula Boolean / Error results round-trip correctly (§5.50 FORMULA). The same FormulaValue byte-layout bug fixed in v2.49.0 for standalone formulas was still present in the shared-formula writer (cells that carry a tExp token pointing at a SHRFMLA master). Cached TRUE/FALSE and #REF!/#DIV/0!/etc. values now appear as written.
  • FORMULA option flags identify shared-formula members (§5.50 FORMULA). Cells inside a shared-formula group now set the fShrFmla bit (0x0008) in the FORMULA record option flags so strict parsers recognise the tExp token as a back-reference.
  • Bold and underlined fonts identified correctly by strict readers (§5.45 FONT). The FONT option-flags word now sets bit 0 (bold) and bit 2 (underlined) in addition to the dedicated bls / uls fields.
  • CFRULE option flags carry spec-mandated constant bits (§5.16 CFRULE). When at least one formatting block is present the option-flags DWORD now ORs in bit 7 (0x00000080, "Always 1") and bits 21-19 (0x00380000, "Always 111").
  • CHOOSE() formulas read back correctly (§3.10.5 tAttrChoose). The tAttr parser previously skipped a fixed 4 bytes for every subtype; tAttrChoose ($04) is variable-length. The decoder now reads nc and advances by 6 + 2·nc bytes.
  • Data-validation and conditional-formatting teardown no longer dereferences past the tail. Two Destroy destructors (TDataValidator, TCondFormatter) walked 0..cnt on lists whose valid indices are 0..cnt-1.

Version 2.49.0

  • **Vérification de la conformité aux spécifications [MS-XLS] v20250520.** Correction de seize problèmes liés au format et au comportement dans les modules suivants : générateur BIFF8, décodeur de formules, chemin de cryptage, générateur de graphiques, formatage conditionnel et validation des données, index SST/ExtSST, lecteur de stockage VBA et chemin d'ouverture du flux OLE. L'API publique n'a pas été modifiée ; le code existant se recompilera sans modifications. Les points importants sont indiqués ci-dessous.
  • **Le champ `Formula` du format BIFF8 gère désormais correctement les résultats booléens et les erreurs.** [MS-XLS] §2.5.133. Le champ `FormulaValue` inclut le type dans le byte[0] et le code booléen-us/d'erreur dans le byte[1]; auparavant, l'outil d'écriture émettait `$0001`/$0002 comme mot et plaçait la valeur dans le byte[2], ce qui faisait que les formules booléennes mises en cache étaient lues comme "Faux" et les formules d'erreur comme "#NULL!" dans toutes les applications.
  • **Les couleurs des cellules définies via `SetColorRGB` sont maintenant affichées correctement.** Le gestionnaire de couleurs écrivait `ColorType=1` (thème) pour les valeurs RGB et `ColorType=2` (RGB) pour les valeurs de thème, inversant ainsi les deux chemins de code. Désormais, les deux fonctions de définition de couleur acheminent les données vers le "bucket" `ColorType` correspondant, de sorte que les valeurs RGB sont traitées par le résolveur RGB et les indices de thème sont traités par le résolveur de thème.
  • **Correction de l'obfuscation XOR et du déchiffrement RC4.** La boucle de déchiffrement XOR Method-1 correspond désormais à [MS-OFFCRYPTO] §2.3.7.3 (XOR d'abord, puis rotation vers la droite de 5 ; l'index de XorArray est dérivé de la position du flux d'entrée, et non de la position de post-traitement). La fonction Skip de RC4 parcourt désormais chaque limite de 1024 octets de manière continue au lieu de passer directement au bloc de destination, ce qui maintient l'état du flux de clés en alignement avec la position du fichier pour chaque appel ultérieur à Decrypt.
  • **Le format de données des feuilles de graphique est maintenant conforme à la spécification.** Les enregistrements SIIndex sont émis dans l'ordre numIndex=1 → 2 → 3 ([MS-XLS] §2.4.262 ; auparavant, c'était 2 → 1 → 3, ce que les analyseurs stricts rejettent), le nombre de DEFAULTTEXT est limité au maximum spécifié de 2 ([MS-XLS] §2.1.7.20.1 ; auparavant, c'était 4), le placeholder Chart3DBarShape utilise l'ID correct $105F (auparavant, c'était $1066).
  • Les enregistrements de conseils d'avertissement pour les hyperliens sont chargés correctement. Le décodeur du corps de l'enregistrement `HLinkTooltip` ($0800) lisait auparavant les champs d'ancrage `FrtRefHeader` aux décalages 2/4/6/8 au lieu de 4/6/8/10, ce qui empêchait la comparaison entre l'ancrage et la plage, et les conseils d'avertissement par cellule étaient supprimés silencieusement ; les conseils d'avertissement sont maintenant associés à leurs hyperliens. Le décodeur de référence de plage BIFF8 a également corrigé une erreur de frappe `FFirstColRel`/`FLastColRel` dans le chemin d'extension de signe de repli pour BIFF5/7 qui décodait incorrectement les plages avec des décalages relatifs de la dernière colonne négatifs.
  • **Corrections apportées au formatage conditionnel et à la validation des données au moment de l'exécution.** Dans les classes `TCondRange` et `TDVRange`, la fonction `IsContainRow` renvoyait "true" uniquement lorsque la plage se réduisait à une seule ligne (la comparaison était inversée) ; le nettoyage des règles de formatage conditionnel/validation des données par ligne fonctionne désormais sur les plages multi-lignes. Trois destructeurs (CondFormat, formatter, DVRangeList) utilisaient `for i := 0 to cnt` sur des listes dont les indices valides sont 0..cnt-1 ; l'erreur d'un caractère était corrigée, et les charges de travail de longue durée ne provoquent plus occasionnellement des erreurs d'exécution pendant la fermeture. Les règles d'ensemble d'icônes CF12 émettent `ct=$06` (ensemble d'icônes selon [MS-XLS] §2.4.43) au lieu de `ct=$05` (filtre), de sorte que les classeurs contenant des règles d'ensemble d'icônes s'ouvrent avec les règles intactes.
  • **Index de recherche rapide ExtSST conforme aux spécifications pour les classeurs volumineux.** Le champ `dsst` est maintenant calculé comme `max((cstUnique / 128) + 1, 8)` conformément à [MS-XLS] §2.4.107, au lieu de la valeur par défaut statique de 8 ; les classeurs contenant plus de ~900 chaînes uniques créent désormais un tableau de buckets `rgISSTInf` correct, et la recherche rapide SST d'Excel fonctionne.
  • **L'enregistrement WriteAccess respecte [MS-XLS] §2.4.349, où cch <= 54.** Le champ `userName.cch` contient désormais la longueur réelle du nom d'utilisateur (6 pour "HotXLS"), et les octets restants sont remplis par le "remplissage" défini dans la spécification. Auparavant, ce champ contenait cch=109, ce qui est signalé par Office File Validation comme une violation de format.
  • **Le chemin d'accès pour l'ouverture du flux de classeur BIFF8 correspond à l'orthographe spécifiée.** La première tentative d'ouverture du flux OLE utilise 'Workbook' (avec une majuscule 'W' conformément à [MS-XLS] §2.1.7.20) au lieu de minuscules, ce qui permet aux conteneurs de fichiers composites sur les implémentations OLE sensibles à la casse d'ouvrir le flux du premier coup.
  • Le lecteur de modules VBA ne supprime plus le dernier octet de chaque flux. La longueur de recherche jusqu'à la fin utilisée était `trunc(l) - 1` au lieu de `trunc(l)`, ce qui tronquait la fin du flux compressé et provoquait l'arrêt anticipé du décompresseur de conteneur RLE pour certains modules.

Version 2.48.10

  • Les fichiers .xls sauvegardés par HotXLS incluent maintenant les deux flux d'ensemble de propriétés de fichier composé OLE qu'Excel attend sur chaque classeur : \005SummaryInformation et \005DocumentSummaryInformation. Avant v2.48.10, seuls les builds TRIAL les écrivaient (comme mécanisme de marquage de bannière) ; les builds de release produisaient des fichiers .xls dont le flux Workbook était du BIFF8 valide mais dont le conteneur OLE manquait les flux de métadonnées Office standard. Le parseur strict d'Excel 2003 traite cela comme la condition "File error: data may have been lost" (Excel moderne conserve la bannière Vue Protégée "ce fichier a des problèmes"). Ajouter les flux résout la boîte de dialogue sur les classeurs de graphique sans changer aucun enregistrement BIFF8.
  • Les deux flux sont émis via le chemin Win32 StgCreatePropSetStg + IPropertySetStorage.Create + IPropertyStorage.WriteMultiple — le même code que Microsoft Office utilise, donc Office File Validation accepte la disposition d'octets. Le flux SummaryInformation est créé avec AppName="HotXLS" par défaut et auteur vide ; les builds TRIAL écrasent encore les valeurs Author / AppName avec la bannière d'essai via lxTrial.XlsTrialStampXlsSummary après le marquage par défaut, donc les fichiers d'essai restent identifiables dans le panneau Fichier > Informations > Propriétés d'Excel. Le flux DocumentSummaryInformation est créé vide (Win32 émet toujours l'en-tête de l'ensemble de propriétés + la propriété CODEPAGE — assez pour que le parseur strict d'Excel considère les métadonnées comme "présentes et bien formées").
  • Cette correction est universelle — chaque .xls sauvegardé par HotXLS porte maintenant les métadonnées OLE standard, pas seulement les classeurs de graphique. Les sorties uniquement-feuille-de-calcul des releases précédentes échappaient au symptôme parce qu'Excel est plus indulgent avec les classeurs sans métadonnées uniquement-feuille-de-calcul qu'avec les classeurs avec feuille de graphique, mais il leur manquait aussi techniquement les flux. La nouvelle unité Lib/lxXlsSummary.pas détient les deux procédures auxiliaires ; lxHandle.pas les appelle inconditionnellement à l'intérieur de TXLSWorkbook.SaveWorkbook après que StoreWorkbook peuple le flux Workbook et avant FDocStorage.Commit.
  • Cette release ferme la séquence de suivi du chart Phase 2 de huit versions (v2.47.0 — v2.48.10) : depuis la liaison de séries tArea3D, en passant par le réalignement de l'id BRAI, les valeurs observées d'Excel pour sdtX/cValx, le placement de SERIESTEXT, la suppression du remplissage du flux Workbook, les enregistrements shell au niveau feuille, et maintenant les flux de métadonnées OLE. Le résultat est un .xls de graphique qui s'ouvre dans Excel 2003 et Excel moderne sans aucun avertissement "le fichier a des problèmes", aligné au niveau octet avec ce qu'Excel lui-même écrit pour les mêmes données.

Version 2.48.9

  • Les feuilles de graphique BIFF8 portent maintenant l'ensemble complet d'enregistrements shell au niveau feuille qu'Excel 2003+ exige. Le chart_phase2_demo.xls de v2.48.8 rendait le graphique en colonnes correctement, mais Excel 2003 affichait toujours une boîte de dialogue "File error: data may have been lost" (les versions Excel plus récentes conservaient la bannière Vue Protégée) parce que le substream du graphique manquait des mêmes enregistrements au niveau feuille qu'un substream de feuille de calcul porte. Les vrais fichiers Excel (variantes from-scratch et re-saved de la sortie HotXLS) enveloppent les enregistrements du graphique dans ce shell :
    • Avant les enregistrements du graphique (entre BOF et UNITS) : HEADER ($0014, vide), FOOTER ($0015, vide), HCENTER ($0083, valeur 0), VCENTER ($0084, valeur 0), SETUP ($00A1, configuration de page de 34 octets), PRINTSIZE ($0033, valeur 3).
    • Après les enregistrements du graphique (après le CHART END le plus extérieur, avant EOF) : DIMENSIONS ($0200, 14 octets) déclarant la plage de données en cache, trois marqueurs SERIESINDEX ($1065) pour les emplacements de cache catégories / valeurs / tailles de bulles, un NUMBER ($0203, 14 octets) par point de valeur en cache, et WINDOW2 ($023E, variante de 10 octets pour feuille de graphique) à la fin.
    Les valeurs d'octets ont été copiées verbatim depuis dev-notes/biffview-refs/excel_column_chart_resaved.xls (la référence de graphique en colonnes sauvegardée par Excel, locale).
  • Le cache de valeurs émet actuellement des marqueurs zéro (0.0 pour chaque point de données), correspondant à ce qu'Excel lui-même écrit lors du ré-enregistrement d'un graphique dont le cache source n'était pas pré-rempli. Le graphique trace toujours les vraies données car les références PtgArea3d du BRAI se résolvent aux cellules de la feuille source au moment du dessin — le cache est ce qui permet à Excel d'analyser la feuille de graphique sans avertissement, pas ce qui alimente le tracé. Une version future peut remplir le cache avec les vrais nombres de la plage Values ; le format wire est en place.
  • Test fumée bout en bout : ouvrez le Demo/Delphi/XlsCreateChart/chart_phase2_demo.xls régénéré dans Excel 2003 — l'invite "File error: data may have been lost" n'apparaît plus, et le graphique en colonnes se rend identiquement à avant. Le même fichier s'ouvre proprement dans Excel moderne sans la bannière Vue Protégée.

Version 2.48.8

  • L'écrivain BIFF8 (.xls) ne remplit plus le flux Workbook avec des octets zéro de fin. TXLSWorkbook.StoreOleFile appelait auparavant StoreExtraSpace(Book) après les enregistrements de la dernière feuille, remplissant la longueur du flux jusqu'à la prochaine limite de 512 octets (secteur OLE). Le parseur strict d'Excel traite ces octets zéro finaux comme un flux factice d'enregistrements d'id 0x0000 et fait apparaître l'invite Vue Protégée "ce fichier a des problèmes" — visible sur le chart_phase2_demo.xls de v2.48.7 même après la correction du format wire BRAI / sdtX / SERIESTEXT et le rendu correct du graphique. Supprimer l'appel retire le remplissage du contenu du flux Workbook ; le remplissage de secteur OLE se produit toujours, mais dans la couche conteneur CFB sous le flux où Excel lui-même le place (chaque .xls sauvegardé par Excel a une longueur de flux Workbook non alignée sur secteur).
  • Historique des symptômes : tout .xls sauvegardé par HotXLS dont la longueur totale en octets d'enregistrements valides n'atterrissait pas par hasard sur une limite de 512 octets portait le flux de zéros finaux. Le bug existait depuis le commit de bootstrap du dépôt mais se manifestait rarement — la plupart des classeurs ont assez d'enregistrements pour que le remplissage finisse petit (≤ 4 octets zéro tolérés par Excel). Les classeurs de feuilles de graphique atterrissent bien en dessous de la limite de secteur (le démo v2.47.0 — v2.48.7 remplissait 420 octets zéro), c'est donc là que l'invite Vue Protégée est devenue cohérente.
  • La méthode StoreExtraSpace survit comme code mort privé dans lxHandle.pas au cas où un futur chemin de code aurait vraiment besoin de flux arrondis au secteur ; le site d'appel dans StoreOleFile est supprimé. La longueur du flux Workbook est maintenant exactement égale à la longueur en octets de tous les enregistrements valides (démo de graphique : 3164 octets ; référence Excel from-scratch : 4419 octets — les deux non alignés sur secteur). Les chemins de code lecteur ne sont pas affectés — HotXLS a toujours lu correctement les flux Workbook non alignés sur secteur des fichiers sauvegardés par Excel.

Version 2.48.7

  • Les enregistrements de séries de graphique BIFF8 sont enfin rendus correctement dans Excel. La correction consiste à réaligner les assignations d'id BRAI avec [MS-XLS] §2.4.51 — le plan d'implémentation parent les documentait inversées, propageant le bug à travers chaque sortie de graphique de v2.41.0 à v2.48.6. Les sémantiques d'id correctes sont :
    • id = 0nom de série / étiquette de légende (le plan disait : categories)
    • id = 1 — values (correct)
    • id = 2 — categories (le plan disait : name)
    • id = 3 — bubble sizes (le plan disait : errBars)
    Les symptômes Excel de l'inversion correspondent exactement : la plage Categories (étiquettes texte A2:A5) était émise comme BRAI id=0 → Excel la lisait comme le nom de la série et concaténait les quatre cellules en "North South East West" pour la légende / l'auto-titre. Le littéral PTG tStr 'Q1 Sales' était émis comme BRAI id=2 → Excel attendait une plage de cellules de catégorie là, trouvait un littéral de chaîne, abandonnait et rendait l'axe X comme quatre zéros.
  • Également réaligné sur le format wire de graphique en colonnes sauvegardé par Excel : SERIES.sdtX est maintenant 0x0003 (la valeur observée d'Excel pour les catégories texte, pas 0x0001 documenté par [MS-XLS] §2.4.252), et cValx porte le décompte réel des catégories au lieu de 0. La règle "cValx MUST = 0 quand sdtX ∈ {1, 3}" est contredite par chaque échantillon Excel-saved examiné.
  • Le porteur littéral de nom SERIESTEXT ($100D) revient, mais au bon endroit : immédiatement après le BRAI id = 0, toujours dans le bloc SERIES BEGIN/END. C'est ce que font les vrais fichiers Excel — le point d'émission de v2.48.5 (après tout le cluster BRAI, avant DataFormat) était incorrect et cassait le parsing du graphique ; la position correcte est juste à côté du BRAI du nom de série.
  • Les fichiers de graphique sauvegardés par v2.41.0 — v2.48.6 portent tous le format wire BRAI inversé. Ils s'ouvrent dans Excel sans erreur mais montrent les symptômes de légende / axe X ci-dessus. Re-sauvegardez avec v2.48.7+ pour migrer ; pas de changement d'API — le même appel AddChartSheet produit maintenant un graphique qui se rend identiquement à ce qu'Excel lui-même écrirait pour les mêmes données.
  • Nouvel outil d'inspection au niveau octet dev-notes/biffview-refs/dump_chart_substream.py qui vide le substream de graphique de n'importe quel .xls BIFF8 avec décodage par enregistrement (SERIES / BRAI / SERIESTEXT / AXIS / CATSERRANGE / LEGEND / OBJECTLINK / POS / TEXT). Utilisé pendant cette sortie pour byte-diff la sortie HotXLS contre les échantillons de référence sauvegardés par Excel ; disponible pour les suivis futurs de spec de graphique.

Version 2.48.6

  • Le substream de feuille de graphique BIFF8 retire les changements de v2.48.5. Les tests Excel réels sur la démo régénérée v2.48.5 n'ont pas du tout rendu le graphique — pire que la référence v2.47.0 (où le graphique se dessinait mais avec des étiquettes d'axe X erronées). Les deux changements de v2.48.5 en étaient la cause :
    • SERIES.sdtX = 4 n'est en réalité pas accepté par Excel même si Apache POI expose CATEGORY_DATA_TYPE_TEXT = 4. [MS-XLS] §2.4.252 exige strictement que sdtX soit 0x0001 ou 0x0003.
    • L'enregistrement SERIESTEXT ($100D) ajouté à l'intérieur du bloc SERIES BEGIN/END est une violation structurelle — SERIESTEXT appartient aux blocs TEXT (contextes de titre de graphique / titre d'axe / étiquette de données), pas à l'intérieur du bloc SERIES. L'y placer a fait que le parseur de graphique d'Excel rejette tout le substream.
  • v2.48.6 restaure le format wire v2.47.0 ET ajoute une correction de conformité spec : SERIES.cValx est maintenant 0 quand sdtX = 1 (règle [MS-XLS] §2.4.252 spec MUST). Avant v2.48.6, on écrivait cValx = count (4 dans la démo) violant cette règle, ce qui contribuait peut-être à l'invite Vue protégée "le document a des problèmes" d'Excel. cValy porte toujours le décompte réel des valeurs (sdtY=1 n'a pas de règle de zéro).
  • Nouvelle démo Delphi XlsCreateChart dans Demo/Delphi/XlsCreateChart/ crée un classeur à deux feuilles : une feuille "Data" avec quatre lignes (Region, Sales) et une feuille "Chart1" de graphique en colonnes dont la série lie Data!$A$2:$A$5 / Data!$B$2:$B$5 comme Categories / Values. La démo est le successeur permanent du chart_phase2_demo.xls ad hoc que v2.47.0 — v2.48.5 plaçait dans la racine du dépôt pour les tests BiffView ; le fichier racine a été supprimé, et la nouvelle démo écrit sa sortie à côté de son propre .exe.
  • Non résolu connu : avec le format wire de v2.48.6, Excel continue de rendre les étiquettes de l'axe X du graphique en colonnes comme des zéros et de basculer sur la concaténation du texte des cellules de catégorie pour la légende (au lieu d'utiliser le littéral PTG tStr de BRAI id=2 'Q1 Sales'). C'est une vraie lacune de format wire qui nécessite un graphique en colonnes sauvegardé par Excel comme référence pour le diff — suivi en follow-up. La zone de tracé à 4 barres elle-même se rend correctement (hauteurs 100/150/200/175 correspondent à Values).

Version 2.48.5

  • Les enregistrements de séries de graphique BIFF8 s'affichent maintenant correctement dans Excel. v2.47.0 a connecté la liaison tArea3D pour les plages Categories / Values, mais Excel dessinait toutes les étiquettes de l'axe X comme 0 et utilisait le texte concaténé des catégories ("North South East West") comme légende et titre automatique, au lieu du Name fourni par l'utilisateur. Deux corrections restaurent le rendu prévu :
  • Le champ sdtX de l'enregistrement SERIES est maintenant 4 (catégories texte), pas 1. [MS-XLS] §2.4.252 ne documente que 1 (dates) et 3 (séquence BIFF7), mais les vrais fichiers de graphique en colonnes / barres / lignes sauvegardés par Excel écrivent 4 pour les axes de catégories texte (correspondant à la constante CATEGORY_DATA_TYPE_TEXT d'Apache POI). Avec sdtX=1, Excel essayait de coercer les cellules 'North' / 'South' en nombres → fallback à 0 ; sdtX=4 laisse passer les étiquettes textuelles verbatim. L'ancienne forme wire violait aussi la règle de spec "cValx doit être zéro quand sdtX=1".
  • Un enregistrement SERIESTEXT ($100D) est désormais émis dans le bloc SERIES BEGIN/END (après le cluster BRAI, avant DataFormat) chaque fois qu'un Name littéral est fourni. Le mécanisme de la première moitié de Phase 2 (BRAI id=2 + PTG tStr) est conservé pour la complétude de la spec, mais Excel récupère réellement l'étiquette de légende et le titre automatique depuis SERIESTEXT ; avec seulement la variante BRAI, Excel basculait sur la concaténation des cellules de catégorie. Après cette correction, la légende affiche le vrai Name (ex. 'Q1 Sales') et un titre vide laisse l'emplacement du titre automatique vide.
  • Migration : les sorties de feuilles de graphique v2.42.0 — v2.47.0 s'ouvrent toujours sans erreur dans Excel mais présentaient les symptômes ci-dessus. Re-sauvegardez avec v2.48.5+ pour obtenir le format wire corrigé ; aucun changement d'API requis, le même appel AddChartSheet produit maintenant le bon graphique.

Version 2.48.4

  • L'émission BIFF8 CFEX ($087B) est retirée. HotXLS n'écrit plus le CFEX apparié après chaque CF12 — toute la configuration Data Bar / Color Scale / Icon Set voyage maintenant en ligne dans la queue par type CF12 (v2.48.1 — v2.48.3). Apache POI / NPOI ignorent CFEX de toute façon, donc c'est une pure simplification.
  • Le chemin de lecture BIFF8 CF12 consomme maintenant la queue par type directement depuis CF12. Cela complète la réécriture du format wire Gap #6 en 5 PATCH (v2.48.0 header + v2.48.1 data_bar + v2.48.2 color_gradient + v2.48.3 multistate + v2.48.4 retrait CFEX).

Version 2.48.3

  • Les règles Icon Set de BIFF8 CF12 ($087A) émettent maintenant le sous-enregistrement multistate compatible NPOI en ligne, permettant à Apache POI / NPOI de lire la famille d'icônes, les seuils par palier et les drapeaux reverse / icon-only directement depuis CF12. La disposition correspond à NPOI IconMultiStateFormatting.Serialize().
  • Les fichiers .xls HotXLS-générés v2.48.2 devraient être ré-enregistrés via v2.48.3 pour que les règles Icon Set reçoivent la nouvelle queue en ligne. Le retrait de l'émission CFEX arrive en v2.48.4.

Version 2.48.2

  • Les règles Color Scale à 2 et 3 paliers de BIFF8 CF12 ($087A) émettent maintenant le sous-enregistrement color_gradient compatible NPOI en ligne, permettant à Apache POI / NPOI de lire le seuil, la couleur et la position d'interpolation de chaque palier directement depuis CF12. La disposition correspond à NPOI ColorGradientFormatting.Serialize().
  • Les fichiers .xls HotXLS-générés v2.48.1 devraient être ré-enregistrés via v2.48.2 pour que les règles Color Scale reçoivent la nouvelle queue en ligne. La queue Icon Set arrive en v2.48.3.

Version 2.48.1

  • Les règles Data Bar de BIFF8 CF12 ($087A) émettent maintenant le sous-enregistrement data_bar compatible NPOI en ligne (28 octets ajoutés après template_params), permettant à Apache POI / NPOI de décoder la couleur de la barre, les seuils min/max et les bornes de longueur en pourcentage directement depuis CF12, sans consulter l'enregistrement CFEX hérité. La disposition correspond à NPOI DataBarFormatting.Serialize().
  • Les fichiers .xls HotXLS-générés v2.48.0 devraient être ré-enregistrés via v2.48.1 pour que les règles Data Bar reçoivent la nouvelle queue en ligne. Les queues Color Scale / Icon Set arrivent en v2.48.2 — v2.48.3.

Version 2.48.0

  • Disposition de l'en-tête BIFF8 CF12 ($087A) corrigée selon NPOI CFRule12Record.serialize() et les fichiers de référence sauvegardés par Excel. Excel écrit ext_formatting_length(4) avant les jetons de formule et un bloc template_params préfixé par longueur ; HotXLS avait ces champs dans le mauvais ordre. Les queues par type (data_bar / color_gradient / multistate) arrivent en v2.48.1 — v2.48.3.
  • Les fichiers .xls HotXLS-générés v2.34.0 — v2.47.1 devraient être ré-enregistrés via v2.48.0 pour réécrire leurs enregistrements CF12. Le champ nID de 2 octets non-spécifié à la fin de chaque CF12 a été supprimé.

Version 2.47.1

  • Format wire de l'enregistrement BIFF8 CONDFMT12 ($0879) corrigé pour correspondre aux fichiers sauvegardés par Excel. L'implémentation précédente suivait un brouillon spec ancien qui laissait la plage associée de 8 octets comme "réservée" dans FtrHeader et insérait un champ Réservé de 4 octets inexistant avant numCF. Les fichiers .xls Excel remplissent réellement ces 8 octets avec la plage de cellules associée. Référence : poi_ConditionalFormattingSamples.xls enregistrement 152 correspond maintenant octet par octet.
  • Les fichiers .xls HotXLS-générés v2.34.0 — v2.47.0 devraient être ré-enregistrés via v2.47.1 pour réparer leurs enregistrements CONDFMT12.

Version 2.47.0

  • La création de feuilles de graphique BIFF8 lie désormais des plages de données réelles aux séries. Les chaînes A1 Categories et Values transmises à la surcharge à 6 arguments de AddChartSheet (par exemple 'Data!$A$2:$A$5') sont compilées en jetons PTG tArea3D écrits dans les enregistrements BRAI id=0 (catégories) et BRAI id=1 (valeurs). Excel affiche maintenant de vrais points de données dans la zone de tracé au lieu du graphique vide produit par v2.42.0.
  • La résolution du nom de feuille et l'enregistrement EXTERNSHEET sont automatiques : le parseur localise la feuille dans le classeur, enregistre une entrée XTI si elle n'existe pas et écrit l'ixti 0-based correspondant dans le corps de PtgArea3d. À la réécriture, le flux d'enregistrements du graphique est resérialisé via le compilateur de formules, maintenant ixti cohérent avec l'ordre final de EXTERNSHEET.
  • Formes de référence acceptées : Sheet1!$A$2:$A$5 (absolue), Sheet1!A2:A5 (les marqueurs relatifs sont tolérés — les séries de graphique sont toujours stockées en absolu), 'My Sheet'!$A$1:$B$5 (noms de feuille avec espaces entre apostrophes) et références à une seule cellule comme Sheet1!$A$1 (se dégénère en PtgArea3d 1×1). Les comptes de points (cValx / cValy) sont dérivés automatiquement des dimensions de la zone.
  • Les formes de référence non prises en charge basculent silencieusement vers le placeholder BRAI cce=0 style v2.41.0 pour que le graphique s'ouvre quand même dans Excel : références entre classeurs ([Book2.xls]Sheet1!...), plages nommées (Sheet1!ProfitColumn), références sans le préfixe ! de feuille et références pointant vers la feuille de graphique elle-même. Ces cas sont reportés aux phases ultérieures.
  • Cela complète la Phase 2 de la Roadmap #10 (graphique en colonnes de bout en bout). Les libellés de série (première moitié de Phase 2, v2.42.0) plus la liaison de plages de série (cette release) signifient qu'un graphique en colonnes créé via AddChartSheet affiche désormais des entrées de légende correctes plus des données réelles sans post-traitement dans Excel.

Version 2.46.0

  • Le décodeur DXF côté BIFF8 résout maintenant les couleurs xclrType=1 (palette indexée) à partir de la palette standard Excel 2003 à 64 couleurs.
  • La recherche utilise la palette par défaut Excel 2003 intégrée — icv 0..7 sont les 8 couleurs système, icv 8..15 reflètent les couleurs système, icv 16..63 sont les valeurs par défaut personnalisables standard. icv hors plage retombe au noir.
  • La personnalisation du registre PALETTE BIFF8 n'est pas consultée — fichiers avec palettes personnalisées peuvent avoir de légères déviations.
  • Chemins xclrType=0 (auto) et xclrType=2 (RGB) inchangés.

Version 2.45.0

  • Les règles de mise en forme conditionnelle font maintenant round-trip de l'attribut priority à la fois sur XLSX <cfRule priority="N"/> et sur le champ BIFF8 CF12 ipriority. Auparavant, chaque règle recevait une priorité séquentielle basée sur son index lors de la sauvegarde, et la priorité des fichiers sauvegardés par Excel était ignorée à la lecture.
  • Nouvelle propriété Priority sur TCondFormatRule (côté BIFF8) et TXLSXConditionalFormat (côté XLSX). Défaut zéro, préserve le comportement auto-par-index ; valeur positive épingle la priorité.
  • Priority contrôle la superposition multi-règles — quand plusieurs règles couvrent la même plage, Excel les applique dans l'ordre de priorité. Round-trip de priority préserve l'ordre de rendu prévu par l'utilisateur.
  • Comportement par défaut inchangé pour les appelants qui ne touchent pas Priority : le writer XLSX continue d'émettre priority="1", "2"... dans l'ordre de la collection.

Version 2.44.0

  • Les règles de mise en forme conditionnelle Jeu d'Icônes supportent maintenant les substitutions d'icône par stop côté XLSX. Chacun des 3 / 4 / 5 stops peut se désinscrire du défaut familial et afficher n'importe quelle icône de l'une des 17 familles intégrées Excel 2007, identifiée par nom du jeu + id de l'icône. Élément OOXML : <cfIcon iconSet="OtherSet" iconId="N"/>.
  • Nouvelles méthodes sur TXLSIconSetSpec : SetIconOverride(stopIndex, OverrideSet, IconId) et ClearIconOverride(stopIndex). Propriétés en lecture seule HasIconOverride[i], IconOverrideSet[i], IconOverrideId[i].
  • Le writer XLSX émet des enfants <cfIcon> uniquement pour les stops qui ont appelé SetIconOverride. Le reader parse les éléments <cfIcon> entrants par position.
  • Limitations connues : BIFF8 (.xls) CFEX n'a pas de slot pour les substitutions par stop ; une règle avec substitutions enregistrée en .xls rend le défaut familial pour tous les stops.

Version 2.43.0

  • Les règles de mise en forme conditionnelle XLSX (.xlsx) font maintenant round-trip des références de couleur de thème dans l'élément <color> des règles Barre de Données et Échelle de Couleurs. Auparavant le writer émettait uniquement <color rgb="FFRRGGBB"/> et le reader ignorait les attributs theme / tint.
  • Nouvelles méthodes sur TXLSDataBarSpec et TXLSCfValue basculent le slot en mode thème : SetThemeColor(themeId, tint) et ClearThemeColor.
  • Le writer XLSX émet <color theme="N"/> quand Tint vaut exactement 0.0, ou <color theme="N" tint="0.5"/> quand non-zéro.
  • Comportement par défaut inchangé : les règles créées avec les points d'entrée RGB-only existants continuent d'émettre <color rgb="..."/> exactement comme avant.
  • Limitations connues : BIFF8 (.xls) CFEX porte toujours uniquement la couleur RGB ; la résolution de palette de thème du classeur reste hors champ ; les règles iconSet ne portent pas d'éléments <color>.

Version 2.42.0

  • L'API de création de feuilles-graphique BIFF8 gagne une cinquième surcharge AddChartSheet qui accepte un tableau d'enregistrements TXLSChartSeriesInfo (Name, Categories, Values). Chaque Name non vide est écrit dans le sous-flux de graphique comme étiquette de série littérale via un token PTG tStr sur le BRAI de nom-de-série (id=2). Excel utilise cette étiquette dans la légende et le sélecteur de série, donc un graphique multi-série affiche désormais des légendes appropriées au lieu des espaces réservés par défaut "Series1 / Series2".
  • TXLSChartSeriesInfo est ré-exporté depuis lxHandle avec TXLSChartType, pour que les appelants puissent construire le tableau sans importer lxChartBuilder directement.
  • C'est la première moitié de Roadmap #10 Phase 2 (graphique en colonnes de bout en bout). Le chemin du nom-de-série est câblé ; la liaison de données catégorie et valeur (convertir les chaînes A1-range Categories et Values en vraies références tArea3D de plage de cellules dans le BRAI) reste un espace réservé — ces deux champs sont acceptés par l'API mais pas encore émis dans le sous-flux. Une version ultérieure les acheminera via le compilateur de formules et la table EXTERNSHEET pour terminer la seconde moitié de la Phase 2.

Version 2.41.0

  • HotXLS gagne la création programmatique de feuilles-graphique BIFF8. Un nouveau jeu de surcharges AddChartSheet sur Sheets écrit un sous-flux de graphique complet dans le fichier .xls enregistré, alors qu'auparavant les feuilles-graphique ne pouvaient être préservées que de manière opaque lors d'un round-trip load-save. Quatre surcharges couvrent les points d'entrée courants : nom seul / nom + type de graphique / + titre / + titre d'axe catégorie + titre d'axe valeur. L'IXLSWorksheet retourné apparaît dans la collection Sheets, reçoit une entrée boundsheet de feuille-graphique à l'enregistrement, et Excel l'ouvre comme onglet de graphique.
  • Une nouvelle énumération TXLSChartType sélectionne le type de graphique : xlsChartTypeColumn, xlsChartTypeBar, xlsChartTypeLine, xlsChartTypePie. L'énumération est ré-exportée depuis lxHandle pour que le code utilisateur n'ait pas besoin d'importer l'unité chart-builder directement.
  • Le sous-flux de graphique émis couvre le cadre BIFF8 requis par la spécification — BOF (dt=$0020), Chart / PlotGrowth / Frame / Series / SheetProperties / AxesUsed / AxisParent (POS + axe catégorie + axe valeur + PlotArea + Frame + ChartFormat + enregistrement de type + ChartFormatLink + Legend), EOF — pour qu'Excel reconnaisse le résultat comme un véritable onglet de graphique du type demandé. Le round-trip existant via TXLSCustomChart est inchangé.
  • C'est la première étape de Roadmap #10 (sous-flux CHART — le plus gros élément de l'audit BIFF8). La phase 1 livre le cadre et la surface API pour que les phases suivantes ajoutent la liaison de données de séries, les titres d'axes et le formatage détaillé par type.
  • Limitations : la nouvelle feuille-graphique affiche un graphique vide par défaut du type demandé. La liaison de données de séries, le texte de titre rempli et le formatage détaillé par type (gap width / overlap / hole size / marker style) sont reportés aux phases ultérieures. Excel préserve la présence et le type du graphique lors de la sauvegarde et réouverture, mais pas encore les données fournies par l'utilisateur.

Version 2.40.0

  • Nouvelle démo Delphi XlsCondFormat12 sous Demo/Delphi/XlsCondFormat12/ qui démontre l'API d'extension de mise en forme conditionnelle v2.34.0+ de bout en bout. Trois boutons permettent de générer CondFormat12.xls (backend BIFF8), CondFormat12.xlsx (backend XLSX) ou les deux côte à côte. Chaque feuille de sortie porte les mêmes quatre types de règles — Barre de données, échelle 3 couleurs, Jeu d'icônes (3 flèches) et échelle 2 couleurs — couvrant dix lignes de données pour ouvrir les fichiers dans Excel et vérifier visuellement.
  • Le chemin BIFF8 exerce en plus la substitution de style DXF v2.35.0 : la règle Barre de données attache la couleur de police blanche en gras pour que le texte de la cellule reste lisible.
  • Nouvelle fixture de test DUnitX à Tests/Delphi/HotXLS.CondFormat12Tests.pas couvre dix scénarios de round-trip et de surface d'API : round-trip BIFF8 pour les quatre types de règles, round-trip de style DXF pour les couleurs RGB, couleurs de thème et drapeaux de police, et round-trip XLSX pour Barre de données / échelle 3 couleurs / Jeu d'icônes avec ShowOnly. La fixture est câblée dans HotXLSDelphiTests.dpr et le .dproj correspondant.
  • Pour prendre en charge la fixture de test, TCondFormat expose deux nouveaux accesseurs publics : RuleCount et Rule(I).
  • Note de validation : ouvrez les .xls et .xlsx de la démo dans Excel pour voir les quatre règles d'extension CF12 / OOXML rendues côte à côte.

Version 2.39.0

  • La substitution de style XF différentiel (DXF) sur les règles de mise en forme conditionnelle prend désormais en charge l'encodage de couleur de thème en plus du mode RGB existant. Chaque emplacement de couleur — couleur de police, fond de remplissage, premier plan de remplissage — peut être défini contre un index de thème du classeur plus une valeur de teinte.
  • Trois nouvelles méthodes sur TXLSDxfStyle activent un emplacement en mode thème : SetFontColorTheme(themeId, tint), SetFillBgColorTheme(themeId, tint), SetFillFgColorTheme(themeId, tint). Tint est un single dans la plage [-1.0, +1.0]. Les méthodes existantes SetXxxColor(rgb) restent en mode RGB ; les deux modes sont mutuellement exclusifs par emplacement.
  • Interrogez le mode actif via les nouvelles propriétés en lecture seule XxxColorIsTheme / XxxColorThemeId / XxxColorThemeTint. HasXxxColor retourne True dans les deux modes.
  • Le format de fil BIFF8 suit la disposition standard XFProp Colour : xclrType=2 + LongWord BGR 4 octets pour RGB, xclrType=3 + tint signé 2 octets × 32767 + index de thème 4 octets pour le mode thème. Le décodeur de blob DXF reflète ce dispatch.
  • Limitations connues : le round-trip en mode thème n'est pris en charge que du côté BIFF8 (.xls) — le côté XLSX (.xlsx) émet et lit toujours uniquement <color rgb="..."/>.

Version 2.38.0

  • La lecture XLSX (.xlsx) reconnaît maintenant les règles de mise en forme conditionnelle d'extension Excel 2007+ dans les fichiers entrants — barre de données, échelle de couleurs (2 et 3 stops, détectés automatiquement du nombre de cfvo) et jeu d'icônes — et peuple l'objet TXLSXConditionalFormat correspondant pour que le code utilisateur puisse inspecter et faire round-trip de ces règles sans les perdre. Auparavant, les classeurs .xlsx sauvegardés par Excel avec ces types de règle étaient silencieusement abandonnés au chargement.
  • Le lecteur analyse l'enveloppe OOXML <cfRule type="dataBar|colorScale|iconSet"> et le corps intérieur <dataBar> / <colorScale> / <iconSet>, parcourant les entrées enfant <cfvo> pour récupérer le type et la val de chaque seuil, et les entrées <color> pour récupérer la couleur de la barre ou les couleurs par stop de l'échelle.
  • Les règles de jeu d'icônes font round-trip du nom de famille iconSet (les 17 jeux de référence Excel 2007), du drapeau reverse, et du drapeau showValue (mappé à ShowOnly).
  • Les valeurs de couleur analysées de l'attribut OOXML rgb="AARRGGBB" sont converties dans la même convention BGR LongWord utilisée par l'API d'écriture, donc un round-trip load-edit-save préserve les couleurs visuelles exactement.
  • Le traitement existant XLSX <cfRule type="cellIs"> est inchangé ; le dispatch choisit les nouveaux types de règle uniquement quand l'attribut type les nomme.
  • Limitations connues : les références de couleur de thème sont lues comme 0 au lieu d'être résolues contre la palette de thème du classeur ; les substitutions iconId par stop ne sont pas capturées ; l'attribut priority de <cfRule> est ignoré à la lecture.

Version 2.37.0

  • Le format d'enregistrement BIFF8 CFEX porte maintenant le tableau cfvo complet par stop (kind + chaîne de valeur + couleur, selon la sémantique cfvo de [MS-XLS]) au lieu de juste la couleur de barre/stop. Les règles de barre de données persistent maintenant les types et valeurs de seuil min/max, les échelles de couleurs persistent la combinaison kind + value + color de chaque stop, et les jeux d'icônes persistent kind + value de chaque seuil avec les drapeaux reverse / showOnly.
  • L'écriture CFEX ajoute un octet de drapeau de version (ver=1) pour que les anciens lecteurs HotXLS qui attendent la disposition minimale v2.34.0 CFEX retombent silencieusement sur l'interprétation héritée. Le lecteur v2.37.0 reconnaît aussi les enregistrements ver=0 produits par d'anciennes builds.
  • Le lecteur détecte maintenant les entrées mixtes CONDFMT + CONDFMT12 sur la même plage — un motif commun dans les fichiers sauvegardés par Excel. L'entrée CONDFMT plus ancienne est marquée via une nouvelle propriété IsShadowed sur TCondFormat. Le writer continue d'émettre les deux familles d'enregistrements lors de la sauvegarde.
  • Nouvelle propriété TotalRange sur TCondFormat expose la plage d'extension fusionnée précédemment privée.
  • Limitations connues : la détection shadow est limitée à une correspondance exacte de la boîte englobante. Le round-trip cfvo complet de ColorScale préserve les 8 valeurs kind standard mais ne préserve pas les métadonnées de teinte de couleur theme d'Excel.

Version 2.36.0

  • La sortie XLSX (.xlsx) prend désormais en charge les trois types de règles d'extension de mise en forme conditionnelle Excel 2007+ — barre de données, échelle de couleurs (2-stop et 3-stop), et jeu d'icônes — amenant le backend XLSX à parité avec le backend BIFF8 (.xls) de v2.34.0. Quatre nouvelles méthodes publiques sur TXLSXWorksheet reflètent l'API XLS : AddCondFormatDataBar, AddCondFormatColorScale2, AddCondFormatColorScale3, AddCondFormatIconSet.
  • Le fichier .xlsx sauvegardé émet maintenant l'élément OOXML <conditionalFormatting> avec la structure enfant appropriée pour chaque type de règle : <cfRule type="dataBar"><dataBar> pour les barres, <cfRule type="colorScale"><colorScale> avec 2 ou 3 cfvo + color stops, et <cfRule type="iconSet"><iconSet iconSet="..."> avec l'ensemble cfvo approprié.
  • Le mappage des noms de jeux d'icônes intégrés couvre les mêmes dix-sept jeux de référence Excel 2007 pris en charge par le backend XLS, produits comme chaîne d'attribut OOXML iconSet standard.
  • Les types de seuil et les valeurs de couleur utilisent la même énumération et convention de couleur que l'API XLS — même TXLSCfValueKind, même format LongWord BGR Delphi. Les appels existants AddConditionalFormat XLSX continuent à se comporter de manière identique.
  • Limitations connues : l'encodage de couleur de thème n'est pas encore émis ; les substitutions iconId par stop dans les jeux d'icônes ne sont pas prises en charge. La reconnaissance côté lecture XLSX des règles barres de données / échelles de couleurs / jeux d'icônes provenant de fichiers sauvegardés par Excel reste différée — seule l'écriture est connectée dans cette version.

Version 2.35.1

  • Le reader BIFF8 décode désormais les octets Differential XF (DXF) attachés à une règle CF12 dans le property bag TXLSDxfStyle de la règle, en plus de conserver les octets bruts dans DxfBlob. Le chargement d'un classeur sauvegardé par Excel avec des règles de barres de données / échelles de couleurs / jeux d'icônes stylisées expose maintenant la couleur de police, les couleurs de remplissage, gras / italique / soulignement et l'id de format de nombre directement via la paire HasXxx+valeur sur chaque Rule.Style.
  • Comportement round-trip : un cycle load-edit-save reflète maintenant toute mutation post-chargement de Rule.Style. Si un utilisateur lit un classeur, change Rule.Style.SetFontColor et sauvegarde, la nouvelle couleur l'emporte ; si l'utilisateur ne touche pas le Style, le fichier sauvegardé porte les mêmes substitutions que l'original.
  • Les valeurs xfPropType inconnues dans le blob DXF sont ignorées plutôt que rejetées, donc les fichiers Excel plus récents utilisant des types de propriété pas encore reconnus par cette version continuent à se charger (les octets bruts restent dans DxfBlob pour inspection ou support futur de round-trip).

Version 2.35.0

  • Les règles de mise en forme conditionnelle peuvent désormais porter une substitution de style XF différentiel (DXF), de sorte qu'une règle CF12 qui se déclenche dans Excel peut changer la couleur de police, le remplissage, la graisse, l'italique, le soulignement ou le format de nombre de la cellule sans altérer le XF de base de la cellule. La substitution est exposée comme une nouvelle propriété TXLSDxfStyle sur chaque TCondFormatRule, accessible après avoir créé une règle via les APIs existantes AddCondFormatDataBar / AddCondFormatColorScale* / AddCondFormatIconSet.
  • Substitutions de style prises en charge dans cette version : couleur de police, couleur de fond de remplissage, couleur de premier plan de remplissage, motif de remplissage, police en gras, police en italique, style de soulignement de police et id de format de nombre intégré. Chaque propriété a un drapeau HasXxx apparié — seules les propriétés explicitement définies via SetXxx sont émises dans le fichier BIFF8.
  • Le writer BIFF8 ajoute maintenant un bloc DXF non vide à l'enregistrement CF12 lorsque le Style de la règle a au moins une substitution définie. Le bloc DXF utilise la mise en page publique du tableau XFProp (cxfp + tuples par propriété de type / taille / données), permettant à Excel de capter les changements de style lorsque la règle s'applique.
  • Le reader BIFF8 préserve les octets DXF bruts d'un fichier sauvegardé par Excel dans la propriété DxfBlob de la règle, donc un round-trip load-edit-save ne perd plus silencieusement le style de cellule porté par les règles CF12. Le décodage des octets bruts en propriétés TXLSDxfStyle est planifié pour une version de suivi.
  • Le comportement par défaut est inchangé pour les règles qui ne s'inscrivent pas pour un style — cbdxf = 0 est émis, identique à v2.34.0, donc les règles existantes de barres de données / échelles de couleurs / jeux d'icônes sont rendues exactement comme avant.
  • Limitations connues : l'encodage de couleur de thème pour DXF n'est pas pris en charge (RGB uniquement) ; les substitutions de bordure et les arrêts de dégradé ne sont pas dans le jeu de propriétés de cette version ; l'ordre des octets pour les blobs de valeur XFProp suit les notes publiques [MS-XLS] et peut nécessiter de petits ajustements pour la fidélité round-trip Excel complète une fois validé avec BiffView. La parité côté XLSX pour les trois nouveaux types de règle reste différée.

Version 2.34.0

  • Nouvelle API publique de mise en forme conditionnelle sur la feuille pour les règles d'extension d'Excel 2007+ : AddCondFormatDataBar, AddCondFormatColorScale2, AddCondFormatColorScale3 et AddCondFormatIconSet. Chaque méthode accepte une plage sqref comme "A1:A10" ainsi que les paramètres spécifiques au type (couleur de la barre, couleurs des arrêts de dégradé ou famille de jeu d'icônes) et renvoie l'objet de règle créé.
  • Le writer BIFF8 (.xls) émet désormais les enregistrements CONDFMT12 / CF12 / CFEX aux côtés des enregistrements CONDFMT / CF existants, ce qui permet aux classeurs créés via la nouvelle API de persister leurs règles de barres de données, échelles 2 ou 3 couleurs et jeux d'icônes sur disque.
  • Le reader BIFF8 reconnaît les enregistrements CONDFMT12 / CF12 / CFEX entrants et les expose via le même modèle de règles en mémoire ; les fichiers .xls créés par Excel avec des règles d'extension ne sont plus silencieusement supprimés au chargement.
  • Catalogue intégré de jeux d'icônes couvrant les dix-sept jeux de référence Excel 2007 (familles 3-flèches / 3-drapeaux / 3-feux / 3-panneaux / 3-symboles, 4-flèches / 4-évaluations / 4-feux, et 5-flèches / 5-évaluations / 5-quarts), sélectionnables via l'énumération TXLSIconSetType.
  • Les types de seuil pour les bornes de barres et les arrêts d'échelles / jeux d'icônes peuvent être nombre, min / max de plage, pourcentage, centile ou formule, conformes aux types cfvo d'Excel.
  • Le comportement des règles de valeur de cellule existantes est inchangé ; seules de nouvelles APIs et la nouvelle gestion d'enregistrements BIFF8 ont été ajoutées.
  • Limitations connues dans cette version : la sortie XLSX pour les trois nouveaux types de règle n'est pas encore branchée (règles XLSX de valeur de cellule existantes non affectées) ; le bloc de style XF différentiel sur CF12 est émis vide, donc Excel peut afficher barres et échelles avec des couleurs par défaut plutôt que celles fournies par l'API ; les tableaux cfvo par arrêt dans CFEX ne portent que la couleur, pas la combinaison type / valeur. Ces lacunes sont prévues pour les versions de suivi v2.34.x / v2.35.x avec le classeur de démonstration et la validation du rendu Excel.

Version 2.33.3

  • Nouveau démo Delphi XlsTables sous Demo/Delphi/XlsTables/ démontrant de bout en bout le côté écriture des Tables BIFF8 (ListObjects). Il génère SalesTable.xls avec une région de ventes à quatre colonnes (Région / Produit / Trimestre / Revenu) liée comme une Table à A1:D10 en utilisant Sheet.AddTable('SalesTable', 'A1:D10', headers). Ouvrez le .xls produit dans Excel pour vérifier les listes déroulantes de colonne, les bandes de lignes alternées et le nom de référence structurée SalesTable dans la Boîte de Nom.
  • Le démo est la recette de bout en bout la plus courte pour adopter l''API AddTable de v2.33.0 : définit StyleName = 'TableStyleMedium2' et ShowRowStripes = True, remplit neuf lignes de données + une ligne d''en-tête, et écrit le classeur avec un seul appel SaveAs. La sortie va à côté de l''exécutable.
  • L''infrastructure de compilation est inchangée : le build-Win32-Demo.cmd existant ramasse XlsTables.dpr automatiquement via son balayage for /r Demo *.dpr — aucun changement aux scripts de build ou aux configurations .cbproj/.dproj n''est requis.

Version 2.33.2

  • Le SaveAs BIFF8 (.xls) supprime maintenant les enregistrements autonomes au niveau de la feuille AUTOFILTERINFO/AUTOFILTER ($009D / $009E) lorsqu''une Table sur la même feuille couvre entièrement la plage de filtre automatique. Excel intègre une liste déroulante de filtre automatique dans l''objet Table lui-même, donc émettre un filtre automatique supplémentaire au niveau de la feuille pour la plage identique déclenche la Validation des Fichiers Office à rejeter le fichier. Cela correspond à la correction côté XLSX livrée dans v2.29.4.
  • La vérification de couverture est conservatrice : une Table est considérée comme "couvrant" le filtre automatique uniquement lorsque sa première/dernière ligne et sa première/dernière colonne encadrent les limites du filtre automatique. Le chevauchement partiel maintient le comportement d''émission du filtre automatique au niveau de la feuille.
  • Les enregistrements BIFF5 et les feuilles de calcul sans Table ne sont pas affectés — la vérification de suppression ne s''exécute que lorsque le format du fichier est BIFF8 et que la feuille de calcul contient au moins une Table. Aucun changement d''API publique.

Version 2.33.1

  • Le côté lecture BIFF8 (.xls) reconnaît maintenant les enregistrements Tables de fonctionnalités partagées que v2.33.0 a ajoutés du côté écriture. L''ouverture d''un .xls enregistré par Excel (ou par HotXLS lui-même) avec un ou plusieurs ListObjects/Tables remplit maintenant la collection Tables de la feuille de calcul avec un TXLSTable par FEAT11 ($0872) analysé, reconstruisant la plage de la table à partir du Ref8U primaire, récupérant l''id, le nom et le nom d''affichage de la table lorsqu''ils sont présents, et remplissant le nom du style de table à partir de l''enregistrement LIST12 ($0877) apparié. Auparavant, ces enregistrements étaient silencieusement ignorés.
  • L''opcode FEATHEADR ($0867) partagé est maintenant distribué selon son champ Isf au lieu d''aller toujours à l''analyseur de protection. Isf=2 (Protection Améliorée) conserve le comportement existant ; Isf=4 (SharedList) est reconnu comme marqueur pour les Tables sur la feuille ; Isf=3 (SmartTags) et autres valeurs sont ignorés en toute sécurité. FEATHEADR11 ($0871) est également reconnu silencieusement comme marqueur Tables.
  • Le lecteur est au mieux de ses capacités et tolérant : les charges utiles FEAT11 mal formées ou de variantes Excel se dégradent élégamment vers une Table qui a au moins la plage de cellules correcte. La protection de feuille en round-trip est inchangée.

Version 2.33.0

  • Les feuilles de calcul BIFF8 (.xls) prennent désormais en charge les objets Table (ListObjects Excel). Appelez Worksheet.AddTable(Name, Range, Columns) sur une IXLSWorksheet pour attacher une région de table nommée à une plage de cellules — par exemple Sheet.AddTable('SalesTable', 'A1:F9', HeaderList). Le chemin d''enregistrement .xls émet désormais la famille d''enregistrements de fonctionnalités partagées BIFF8 qui marque la feuille comme contenant des tables : FEATHEADR ($0867 avec Isf=4), FEATHEADR11 ($0871), et une paire FEAT11 ($0872) + LIST12 ($0877) par table. Auparavant, l''appel AddTable sur la façade XLS n''était pas disponible ; les tables définies sur une feuille de calcul étaient silencieusement abandonnées lors de SaveAs(xlExcel97).
  • Nouvelle API publique sur IXLSWorksheet : propriété Tables: TXLSTables (collection en lecture seule) et méthode AddTable. La forme reflète TXLSXTable / TXLSXTables côté XLSX. TXLSTable expose Id, Name, DisplayName, Range, Columns, StyleName (par défaut 'TableStyleMedium2'), ShowFirstColumn, ShowLastColumn, ShowRowStripes (par défaut true), ShowColumnStripes et TotalsRowShown.
  • Les nouveaux enregistrements de flux de feuille sont émis juste avant l''EOF de la feuille de calcul, après la protection de feuille, uniquement lorsque le format de fichier est BIFF8 (xlExcel97). Les classeurs sans tables sont enregistrés exactement comme auparavant — aucun FEATHEADR n''est émis, aucun changement dans le flux d''enregistrements, aucun surcoût. Les enregistrements BIFF5 ne sont pas affectés.
  • Les ID de table sont attribués séquentiellement par feuille (1..N) au moment de l''enregistrement s''ils ne sont pas prédéfinis. Le nom de style par défaut 'TableStyleMedium2' correspond à celui qu''Excel et le côté XLSX utilisent déjà.
  • Limitations connues de cette version initiale (v2.33.0) : les formules de ligne de totaux et les plages auxiliaires de références structurées ne sont pas encore émises ; la suppression des conflits entre AUTOFILTERINFO au niveau de la feuille et une plage de Table sera ajoutée dans un suivi ; le côté lecture (analyse d''un .xls enregistré par Excel avec des tables vers la collection Tables) est également un suivi.

Version 2.32.1

  • Correction d'une erreur de compilation introduite par la fonctionnalité d'écriture FILEPASS de v2.32.0 qui empêchait la bibliothèque de se construire sur RAD Studio 12+ avec une vérification stricte des types. L'assistant EncryptAllBlobs déclarait son tampon de dispersion comme PByte dans un contexte où PByte se résolvait en alias local de lxHandle, tandis que la cible d'appel EncryptBlobData dans lxEncrypter attendait lxBLOB.PByte. Bien que les deux types aliasient tous deux ^Byte, Delphi les traite comme distincts sous la vérification stricte E2010. La variable de tampon est maintenant entièrement qualifiée comme lxBLOB.PByte, de sorte que le chemin de chiffrement par mot de passe v2.32.0 compile proprement sur toutes les versions RAD Studio prises en charge (12.0–37.0).

Version 2.32.0

  • Nouvelle propriété EncryptionPassword sur IXLSWorkbook. Définir un mot de passe non vide avant SaveAs produit désormais un fichier .xls protégé par mot de passe compatible Excel : Excel, LibreOffice Calc et autres lecteurs BIFF8 demandent le mot de passe à l'ouverture et refusent l'accès si le mot de passe est incorrect. Auparavant, le setter de mot de passe était silencieusement ignoré côté écriture.
  • Le chemin d'écriture émet l'enregistrement BIFF8 FILEPASS ($002F) immédiatement après le BOF du classeur et chiffre RC4 chaque corps d'enregistrement suivant avec le même algorithme que côté lecture (vMajor=1, vMinor=1 -- chiffrement "Office 97/2000 Compatible" d'Excel). Le Salt et le Verifier de 16 octets sont générés via CryptGenRandom de Windows plutôt que Random de Pascal. La re-dérivation de la clé de bloc à chaque limite de 1024 octets est préservée.
  • Le chiffrement s'applique uniquement à BIFF8 (xlExcel97) ; le chemin BIFF5 reste en clair. Un EncryptionPassword vide conserve le comportement en clair existant (valeur par défaut), les applications existantes ne sont pas affectées.
  • Côté lecture : correction d'un bug latent dans ParseFilePass qui faisait traiter le premier corps d'enregistrement après FILEPASS (typiquement CODEPAGE) comme texte clair. Les fichiers chiffrés écrits par HotXLS effectuent maintenant un aller-retour correct à travers HotXLS.
  • Note de sécurité : BIFF8 RC4 (vMajor=1/vMinor=1) utilise une clé de 40 bits, considérée comme cassée par les normes de 2025. Utilisez cette fonctionnalité pour la compatibilité avec l'interface de protection par mot de passe classique d'Excel, pas pour la confidentialité de données sensibles. Pour une vraie sécurité, préférez XLSX avec AES.

Version 2.31.0

  • Ajout de la propriété UseSharedFormulas sur IXLSWorkbook. Lorsqu'elle est activée (True), SaveAs en format BIFF8 regroupe les cellules partageant une formule modèle dans des enregistrements SHRFMLA natifs ($04BC), conformément au format compact de Microsoft Excel. Des colonnes de formules telles que =A1*B1, =A2*B2, …, =A99*B99 sont regroupées automatiquement, réduisant la taille du fichier de 30 à 60 % sur les feuilles à forte densité de formules modèles.
  • Le regroupement s'effectue vers le bas par colonne, de manière contiguë et basée sur le modèle : seules les cellules de la même colonne avec des lignes consécutives et des formules PTG équivalentes sont regroupées. Les cellules avec des formules matricielles ou des indicateurs de fusion sont exclues.
  • La valeur par défaut est False, conservant l'émission inchangée des enregistrements FORMULA par cellule. Activez la fonctionnalité en définissant Workbook.UseSharedFormulas := True avant d'appeler SaveAs.
  • La lecture n'est pas affectée. Il s'agit d'une version MINOR (2.30.x → 2.31.0) car une nouvelle propriété publique est ajoutée et le format de sortie BIFF8 change lorsque la fonctionnalité est activée.

Version 2.30.6

  • Correction d'une quatrième classe d'erreurs de compilation dans les démos C++Builder sous le compilateur bcc32 basé sur clang de RAD Studio 37.0 : le schéma d'indexation ->Borders[idx]->Prop sur un pointeur intelligent d'interface déclenchait l'erreur E5843 ("le type de référence membre n'est pas un pointeur"). Toutes les occurrences ont été remplacées par ->Borders->Item[idx]->Prop. Ce correctif touche les démos ApiTour, ExportWithColoring, PurchaseOrder et QuickStart et complète la compatibilité totale avec clang pour les neuf projets de démo C++Builder.

Version 2.30.5

  • Les neuf projets de démonstration C++Builder se compilent désormais correctement sous le compilateur bcc32 basé sur clang de RAD Studio 37.0. Trois classes d'erreurs de compilation ont été corrigées : la propriété EOF de lxFormula a été renommée IsEof pour éliminer un conflit avec la macro C stdio.h du même nom ; les constantes d'énumération de l'API XLS (xlHAlignCenter, xlAround, xlMedium, etc.) sont maintenant explicitement qualifiées avec l'espace de noms Lxhandle:: ; et les affectations de valeurs de cellules XLSX ont été modifiées de OleVariant(...) en Variant(...) car TXLSXCell.Value est de type System::Variant et le compilateur clang refuse la conversion implicite depuis la classe de base protégée OleVariant.

Version 2.30.4

  • La démo OrderCalc (exemple de bon de commande pour Delphi) prend désormais en charge l'export XLSX en plus des formats XLS, HTML et RTF existants. En sélectionnant « Excel 2007+ (*.xlsx) » dans la boîte de dialogue d'enregistrement, la commande est écrite via l'API native TXLSXWorkbook et produit directement un fichier XLSX conforme au standard, avec polices, remplissages, bordures, alignement, formats de nombre et formules Excel.

Version 2.30.3

  • SaveXLSWorkbookAsXLSX (le pont utilisé par TDataToXLS.SaveAs et TGridToXLS.SaveAs lorsque le nom de fichier cible se termine par .xlsx) copie désormais les couleurs de remplissage d'arrière-plan des cellules, les couleurs de police et les attributs de style de police (nom, taille, gras, italique) du classeur XLS sous-jacent vers la sortie XLSX. Les largeurs de colonnes -- y compris les colonnes décoratives intentionnellement étroites -- sont également copiées. Auparavant, seules les valeurs et les formats numériques étaient transférés, ce qui donnait une sortie XLSX sans mise en forme, avec toutes les largeurs de colonnes à la valeur par défaut, et une colonne décorative délibérément étroite apparaissant comme une large colonne vide.

Version 2.30.2

  • Correction d'un bug round-trip du lecteur XLS : la direction Outline.SummaryRow était inversée après Open. Le flag fRwSumsBelow du record WSBOOL (BIFF8 spec p278, octet 0 bit 6, masque $0040) signifie « les lignes de résumé apparaissent *en dessous* du détail », mais l'analyseur définissait SummaryRow = xlAbove quand le bit était positionné (et xlBelow quand il était à zéro) -- exactement l'inverse de la spécification. Le côté écriture était déjà correct (émet $0040 pour xlBelow), donc ouvrir un fichier Excel avec « lignes de résumé en dessous » puis le ré-enregistrer via HotXLS inversait silencieusement la direction de l'outline en « au-dessus ». La direction d'analyse correspond désormais à la spécification et à l'écrivain, et les configurations d'outline circulent correctement. fColSumsRight ($0080) était déjà géré correctement et n'a pas changé.

Version 2.30.1

  • L'écrivain XLS (BIFF8) émet désormais les enregistrements INTERFACEHDR / INTERFACEEND / WRITEACCESS dans la section des globals du classeur, en accord avec la disposition d'enregistrements native de Microsoft Excel. Excel lui-même écrit toujours ce trio entre CODEPAGE/DSF et WINDOW1, et certains lecteurs BIFF stricts ou chemins Office File Validation peuvent les attendre. INTERFACEHDR contient la page de code (1200, UTF-16), INTERFACEEND est un marqueur vide, et WRITEACCESS contient le nom d'utilisateur « enregistré par » (actuellement codé en dur à « HotXLS » ; une future version pourra le promouvoir en propriété Workbook). Les fichiers XLS générés correspondent désormais plus étroitement à la disposition d'octets native d'Excel.

Version 2.30.0

  • Ajout d'un pont d'export classique vers XLSX. TDataToXLS.SaveAs et TGridToXLS.SaveAs écrivent désormais les noms de fichiers .xlsx via le moteur XLSX tout en gardant inchangés les chemins existants .xls, .html et .rtf.
  • Ajout d'APIs de vue de feuille de calcul pour XLS et XLSX. IXLSWorksheet.View et TXLSXWorksheet.View prennent en charge la vue normale, l'aperçu des sauts de page et la vue mise en page, et le paramètre est conservé par le chemin d'écriture/lecture de fichier correspondant.
  • Ajout d'APIs de compatibilité classique pour les classeurs : IXLSWorkbook.SetCodePage et IXLSWorkbook.VBAProject. Les projets VBA peuvent maintenant être inspectés via les noms de modules et le texte source TXLSVBAProject/TXLSVBAModule lorsqu'un classeur contient un stockage VBA.
  • TXLSXWorkbook étendu avec ParsedVBAProject, une vue analysée en lecture seule sur une charge utile vbaProject.bin valide, tout en préservant le comportement existant de round-trip des octets bruts VbaProject.
  • Ajout de l'unité optionnelle cxGridAddExcel pour les flux d'export cxGrid DevExpress. Elle n'est intentionnellement pas incluse dans les packages par défaut afin que les installations sans DevExpress continuent à compiler proprement.
  • Correction du rendu des feuilles de graphique XLSX : les feuilles de graphique ajoutées via AddChartSheet apparaissaient vides dans Excel (les 3 icônes d'outils de graphique apparaissaient brièvement en haut à droite puis disparaissaient ; la feuille entière devenait vide). Cause : le dessin de la feuille de graphique utilisait <xdr:twoCellAnchor> + xfrm cx=0/cy=0, mais les feuilles de graphique n'ont pas de grille de cellules contre laquelle résoudre twoCellAnchor ; Excel se rabattait sur le xfrm 0×0 et rendait le graphique en taille zéro. Les dessins de feuilles de graphique utilisent désormais <xdr:absoluteAnchor> avec la taille par défaut 9525000×6858000 EMU (≈10×7,2 pouces), conformément à ECMA-376-1 14.2.3.2. Les ancres de graphique sur les feuilles de calcul sont inchangées.

Version 2.29.4

  • Correction d'un bug d'empaquetage XLSX qui provoquait l'invite de réparation d'Excel « Nous avons détecté un problème avec une partie du contenu de <fichier>.xlsx » lorsqu'un autoFilter au niveau de la feuille et une Table couvraient la même plage (par exemple la feuille Details de XlsxFeatureGallery.xlsx du démo MemoryDataExport, qui appelait AddTable('SalesTable', 'A1:F9', ...) suivi de SetAutoFilter('A1:F9')). OOXML interdit deux mécanismes de filtre sur la même plage ; le writer supprime désormais l'émission <autoFilter> au niveau de la feuille lorsque sa plage coïncide avec celle d'une table. L'autoFilter propre à la table (rendu sous forme de listes déroulantes d'en-tête) continue de fonctionner.
  • Correction d'une violation de schéma connexe dans <dataValidation> : l'attribut operator était émis pour chaque validation, mais ECMA-376-1 18.3.1.32 ne l'autorise que pour whole / decimal / date / time / textLength. AddListValidation produit type="list", et la valeur par défaut operator="between" passait à travers ; OFV est plus strict qu'Excel et peut rejeter le classeur. L'attribut operator est désormais omis pour list / custom / none.
  • Correction de l'élément <legacyDrawing r:id="..."/> sur les feuilles combinant des hyperliens internes et externes avec des commentaires (feuille Dashboard de XlsxFeatureGallery.xlsx : 1 interne + 1 externe + 1 commentaire). Le calcul du rId comptait tous les hyperliens au lieu des seuls externes (les internes utilisent l'attribut inline location= et ne consomment pas de rId), ce qui faisait pointer legacyDrawing vers la cible de relation des commentaires au lieu de celle du vmlDrawing. ECMA-376-1 18.3.1.51 exige une relation de type vmlDrawing. Le rId est désormais calculé uniquement à partir du nombre d'hyperliens externes.
  • Nettoyage complémentaire : les feuilles de graphique ajoutées via AddChartSheet n'émettent plus de fichier xl/worksheets/_rels/sheetN.xml.rels redondant. Ce fichier orphelin pointait vers un part de feuille de calcul inexistant ; les feuilles de graphique n'écrivent désormais que la relation correcte sous xl/chartsheets/_rels/sheetN.xml.rels.
  • Mise à jour du démo MemoryDataExport (XlsxFeatureGallery) : suppression de l'appel redondant SetAutoFilter('A1:F9') sur la feuille Details -- AddTable attache déjà un autoFilter à la plage de la table, donc l'appel supplémentaire déclenchait le rejet OFV ci-dessus. La suppression défensive dans le writer couvre le code client qui ne reçoit pas la mise à jour du démo.

Version 2.29.3

  • Correction d'une régression XLSX round-trip où les bordures dessinées sur des lignes autrement vides étaient perdues après Open + modification + SaveAs. Le séparateur horizontal de la ligne 8 d'ApiTour (produit par un appel Range.SetBorders sur une ligne sans données) s'affichait correctement dans le fichier ApiTour.xlsx fraîchement généré, mais disparaissait dans ApiTour-XLSX-Modified.xlsx après que l'étape Modify du démo réenregistrait le fichier, laissant Excel afficher une ligne de grille verticale brisée en C8 / D8 uniquement dans le fichier modifié (le fichier ApiTour.xlsx d'origine n'était pas affecté). L'analyseur XLSX applique désormais aussi les styles de cellule lorsqu'un élément `<c>` est auto-fermant ou ne possède aucun enfant valeur/formule, ce qui permet aux cellules stylées sans valeur de survivre au round-trip.

Version 2.29.2

  • Correction d'une régression XLSX round-trip dans le flux Open + modification + SaveAs. ParseWorksheetXml stockait l'index cellXf directement dans cell.FormatIndex ; lors du SaveAs, les cellXfs sont reconstruits à partir des pools de style du classeur (avec éventuellement des entrées composites), et le même index numérique n'a presque jamais la même sémantique dans la nouvelle disposition ; la cellule réenregistrée pointait vers un cellXf incorrect, voire au-delà de la nouvelle table cellXfs, et Excel signalait « Office a détecté un problème avec ce fichier ». ApplyStyle mappe désormais cellStyle inversement vers FontIndex / FillIndex / BorderIndex / NumberFormatIndex / AlignmentIndex / ProtectionIndex via les tables CellXfXxxMap déjà remplies par ParseStylesXml, ce qui permet de réémettre la cellule contre les cellXfs reconstruits.

Version 2.29.1

  • Correction de deux régressions de rendu XLSX : (1) Range.SetBorders pouvait émettre les cellules d'une ligne dans un ordre de colonne non monotone (le passage outline crée A8/C8, le passage inside crée B8 -- sortie A8/C8/B8 au lieu de A8/B8/C8) ; Excel signalait alors « Office a détecté un problème avec ce fichier » et forçait l'affichage protégé. L'écriture XLSX trie maintenant chaque ligne par colonne avant l'émission (schéma OOXML CT_Row). (2) Les cellules avec 2+ index de style (Font + Fill + Border, etc.) étaient auparavant écrasées via une chaîne de priorité sur une seule dimension (FontIndex gagnait, Border/Fill étaient perdus). L'écriture collecte désormais un pool composite-cellXf pendant SaveAs et achemine les cellules multi-dim vers un cellXf synthétisé qui préserve toutes les dimensions.

Version 2.29.0

  • L'unité d'aide interne `lxList2` a été renommée en `lxKeyList` et les classes à clé WideString `TXLSKeyList` / `TXLSKeyEntry` / `TXLSKeyArray` de `lxList` ont été renommées en `TXLSStringKeyList` / `TXLSStringKeyEntry` / `TXLSStringKeyArray` afin que le nom de l'unité corresponde à sa classe principale `TXLSObjectKeyList` et que les deux générations de key-list soient explicites (`TXLSStringKey*` pour l'ancien pool à clé WideString, `TXLSObjectKey*` pour le nouveau pool de déduplication basé sur THashtableKey). Si votre code référence l'ancien nom d'unité ou les anciens noms de classes, mettez à jour les clauses uses et les noms de types en conséquence.

Version 2.28.3

  • Correction d'une régression de l'écriture de cellule XLSX : les bordures définies sur des lignes par ailleurs vides disparaissaient. `Range[''A3:C10''].SetBorders(xlsxEdgeOutline,...)` sur une feuille dont la ligne 8 ne contenait aucune donnée affichait une ligne verticale brisée entre les colonnes C et D, car l'écriture sautait toute cellule dont la valeur n'était pas assignée -- même si la cellule possédait un BorderIndex / FontIndex / FillIndex / NumberFormatIndex / AlignmentIndex / ProtectionIndex. L'écriture émet désormais `` pour les cellules sans valeur qui portent un index de style.

Version 2.28.2

  • Correction d'une violation de schéma de feuille XLSX qui empêchait Excel de charger les feuilles combinant cellules fusionnées et AutoFilter. Le générateur XLSX émet désormais l'élément <autoFilter> avant <mergeCells>, conformément à la séquence OOXML CT_Worksheet (autoFilter est #11, mergeCells est #15). Auparavant, ces classeurs déclenchaient la boîte de dialogue de réparation d'Excel avec Load error. Line 1, column 0 sur sheet1.xml et la récupération supprimait également tableParts / autoFilter des feuilles Details voisines.

Version 2.28.1

  • Ajout d'API simplifiées à la façade XLS classique. IXLSRange expose désormais les propriétés en lecture seule Width et WidthInPixels, ainsi que SaveAsCSV(FileName). IXLSWorksheet et IXLSWorkbook exposent désormais les méthodes SaveAsCSV(FileName / Stream) pour la plage utilisée ou la feuille active. IXLSPageSetup expose Order, Draft, BlackAndWhite, PrintNotes, et la propriété en lecture seule IsFitToPages. L'enregistrement SETUP lors de la sauvegarde/ouverture conserve désormais ces paramètres d'impression.

Version 2.28.0

  • Ajout de l'export RTF sur TXLSXWorkbook. Les nouvelles méthodes SaveAsRTF (FileName / Stream x feuille active par défaut / index de feuille explicite) écrivent la feuille sélectionnée en tant que document RTF 1.6 contenant un tableau simple. La largeur des colonnes est dérivée des données ColWidth de la feuille (1 unité de caractère Excel est approximée à 96 twips RTF). Les colonnes sans largeur explicite utilisent la largeur StandardWidth si elle est définie, sinon 809 twips (environ 8,43 caractères). Le gras (\\b), l'italique (\\i) et la taille de police (\\fsN en demi-points) par cellule sont appliqués à partir de l'index de police de la cellule. Les caractères non-ASCII sont encodés en tant qu'échappements RTF \\uN? Unicode en 16 bits signés, conformément à la section 2.4.2 de la norme RTF 1.6, couvrant toute la plage BMP. Les cellules fusionnées ne sont pas étendues ; la cellule d'origine contient le contenu, et les autres cellules dans la plage sont émises comme des cellules vides. SheetIndex par défaut écrit la feuille active ; une valeur hors de portée renvoie -1. Les feuilles vides produisent un document RTF minimal valide.

Version 2.27.0

  • Ajout de l'export HTML sur TXLSXWorkbook. Les nouvelles méthodes SaveAsHTML (FileName / Stream x feuille active par défaut / index de feuille explicite) écrivent la feuille sélectionnée en tant que document HTML UTF-8 avec une BOM UTF-8. La sortie est un seul tableau <table> à l'intérieur d'une page HTML minimale. Les cellules fusionnées sont exprimées par les attributs colspan / rowspan. Le style des cellules est émis en tant que CSS en ligne : famille de police, taille (pt), gras (font-weight:bold), italique (font-style:italic), barré (text-decoration:line-through) et couleur de police explicite ; la couleur de remplissage solide est utilisée comme couleur de fond (background-color) ; l'alignement horizontal (gauche / centre / droite / justifié) et WrapText (white-space:pre-wrap). Les valeurs de variante de date sont affichées au format 'aaaa-mm-jj hh:nn:ss' ; les cellules avec du texte enrichi sont aplaties en concaténant le texte de chaque exécution. Les couleurs de thème sont ignorées silencieusement (aucune résolution de theme1.xml dans l'export HTML simple). SheetIndex par défaut écrit la feuille active ; une valeur hors de portée renvoie -1.

Version 2.26.0

  • Ajout du support des couleurs de thème, des couleurs indexées et des nuances/ombres sur TXLSXFont, TXLSXFill et TXLSXBorderEdge. Chaque emplacement de couleur comporte désormais trois nouveaux champs, en plus des champs RGB existants : ColorTheme (entier ; -1 = non défini ; 0 à 11 = emplacement de thème OOXML), ColorIndex (entier ; -1 = non défini ; 0 à 63 = emplacement de palette hérité OOXML — associé à Workbook.IndexedColor[N] et XlsxDefaultIndexedPalette) et TintAndShade (double entre -1,0 et 1,0 ; émis uniquement avec le thème). TXLSXFill expose les variantes avant-plan/arrière-plan pour les trois. Priorité de l'écrivain : thème > indexé > RGB ; l'ancienne méthode "ColorIsAuto = True" continue de supprimer complètement l'élément. SaveAs et Open assurent la compatibilité des ensembles d'attributs complets <color theme="N" tint="..."/> et <color indexed="N"/> sur les couleurs de police/remplissage/bordure. Gestion interne : TXLSXBorders.LookupOrAdd compare désormais les trois nouveaux champs afin d'éviter que les bordures de couleur thème ne soient en conflit avec les entrées de couleur RGB dans le pool.

Version 2.25.0

  • Ajout de la compatibilité des liens vers des classeurs externes sur TXLSXWorkbook. Nouveaux types : TXLSXExternalLink (URL cible + liste des noms de feuilles) + collection TXLSXExternalLinks. La propriété TXLSXWorkbook.ExternalLinks expose la collection ; Add(Target) ajoute un nouveau lien et le renvoie à l'appelant, qui le remplit. SaveAs génère un bloc <externalReferences> au niveau du classeur dans xl/workbook.xml, une relation externalLink dans xl/_rels/workbook.xml.rels (à la fin de la plage rid pour maintenir la stabilité des rid existants), le fichier xl/externalLinks/externalLink{N}.xml pour chaque entrée (<externalBook><sheetNames>) et son fichier .rels associé, qui pointe vers l'URL du classeur distant avec TargetMode="External", ainsi que les remplacements de ContentType correspondants. Open analyse les paires externalLink{N}.xml + .rels en commençant à l'index 1 et s'arrête au premier espace. La version actuelle assure la compatibilité de l'URL cible et des noms de feuilles ; les valeurs de cellule mises en cache dans <sheetDataSet> ne sont pas conservées.

Version 2.24.0

  • Ajout d'une fonction d'aide pour la composition des bordures : TXLSXRange.SetBorders. Nouvelle énumération TXLSXBorderEdgeKind (xlsxEdgeAll / Outline / Inside / InsideHorizontal / InsideVertical / Top / Bottom / Left / Right / DiagonalUp / DiagonalDown) qui sélectionne les bords à écrire. SetBorders(Kind, Style, Color) / SetBorders(Kind, Style) (par défaut, noir opaque) itère sur chaque cellule de la plage, calcule le masque de bordure en fonction de la position de chaque cellule (les cellules d'angle ont deux bords externes, les cellules des bords ont un, les cellules intérieures ont des lignes de grille intérieures, etc.), combine Style + Color sur une copie de la bordure actuelle de la cellule (les appels successifs Outline + Inside s'ajoutent plutôt que d'écraser), puis effectue une recherche ou une addition au niveau du classeur dans Workbook.Borders et écrit l'index de bordure résultant (1-based) sur la cellule. La nouvelle fonction d'aide TXLSXBorders.LookupOrAdd renvoie 0 pour les bordures vides, empêchant ainsi l'accumulation d'entrées inutiles.

Version 2.23.0

  • Ajout de fonctions de surcharge pour l'exportation CSV dans TXLSXWorkbook. Nouveaux points d'entrée : SaveAsCSV(FileName) / SaveAsCSV(FileName, SheetIndex, Delimiter) / SaveAsCSV(Stream) / SaveAsCSV(Stream, SheetIndex, Delimiter) écrivent la zone remplie de la feuille sélectionnée en UTF-8 avec un BOM initial et des terminaux de ligne CRLF. Les variantes par défaut sélectionnent la feuille active et la virgule comme délimiteur ; la surcharge SheetIndex/Delimiter accepte n'importe quel caractère WideChar (généralement la tabulation #9 pour TSV). Le guillemotage des champs suit la RFC 4180 : les valeurs contenant le délimiteur, le double guillemet, CR ou LF sont entourées de guillemets, les guillemets internes étant doublés. Les valeurs de date sont affichées au format 'aaaa-mm-jj hh:nn:ss' ; les cellules de texte enrichi sont aplaties en concaténant le texte de chaque exécution ; les cellules vides à l'intérieur du rectangle délimiteur sont affichées sous forme de délimiteurs nus et la ligne s'arrête à la dernière colonne remplie.

Version 2.22.0

  • Ajout de remplacements de palette de couleurs indexées au niveau du classeur dans TXLSXWorkbook. Nouveaux points d'entrée : IndexedColor[Index: Integer]: LongWord (lecture/écriture, emplacements valides 0..63, LongWord ARGB), HasCustomIndexedColor(Index): Boolean (indique si l'appelant a remplacé un emplacement), CustomIndexedColorCount: Integer (nombre d'emplacements remplacés ; 0 = la palette émet la valeur par défaut), ResetIndexedColors: procédure (supprime toutes les remplacements). La constante XlsxDefaultIndexedPalette expose la palette héritée OOXML ECMA-376 pour les emplacements 0..63. SaveAs émet <colors><indexedColors> avec les 64 enfants <rgbColor> uniquement si au moins un emplacement a été remplacé ; les emplacements non modifiés utilisent la palette par défaut, ce qui permet de conserver les fichiers propres lorsqu'ils sont enregistrés sans modifications. Open analyse le bloc et supprime silencieusement les emplacements dont la valeur correspond à la valeur par défaut, ce qui réduit au minimum les opérations de relecture. Les affectations d'emplacements hors plage (< 0 ou > 63) sont ignorées au lieu de générer une erreur.

Version 2.21.0

  • Ajout de six propriétés d'affichage pour la vue feuille dans TXLSXWorksheet. Zoom : Entier représentant le pourcentage de zoom affiché dans la barre d'état d'Excel (10..400, par défaut 100 ; les valeurs hors plage sont ramenées à la valeur la plus proche). DisplayGridLines / DisplayZeros : Booléen (par défaut True) pour masquer les lignes de la grille des cellules ou afficher les cellules avec une valeur de zéro comme vides lorsque défini sur False. DisplayRightToLeft : Booléen (par défaut False) pour inverser la disposition de la feuille en mode RTL (de droite à gauche) pour l'arabe, l'hébreu, etc. StandardWidth / StandardHeight : Double pour définir la largeur par défaut des colonnes (unités de caractères Excel) / la hauteur par défaut des lignes (points) ; 0 = non défini, auquel cas Excel applique ses valeurs par défaut intégrées de 8,43 / 15. SaveAs génère les balises <sheetView showGridLines / showZeros / rightToLeft / zoomScale> et <sheetFormatPr defaultColWidth / defaultRowHeight> uniquement lorsque les valeurs diffèrent des valeurs par défaut d'Excel ; Open les analyse pour les restaurer. La gestion existante de la sélection des onglets et de la mise en surbrillance des cellules est inchangée et utilise désormais un seul composant d'émission.

Version 2.20.7

  • Ajout de surcharge TStream dans TXLSXWorkbook pour la sérialisation en mémoire. Nouveaux points d'entrée : SaveAs(Stream: TStream) / SaveAs(Stream: TStream; FileFormat: TXLSXFileFormat) écrit l'intégralité du package .xlsx dans le flux spécifié, en commençant à la position actuelle ; Open(Stream: TStream) le lit. L'appelant est propriétaire du flux et doit le libérer. Utile pour les réponses HTTP, le stockage blob, les pipelines en mémoire et les tests unitaires qui contournent le système de fichiers local. Les surcharges SaveAs / Open basées sur des fichiers existantes sont inchangées et délèguent désormais aux mêmes fonctions internes d'écriture / de lecture.

Version 2.20.6

  • Ajout des propriétés Hidden / Visible / Comment à TXLSXDefinedName. Hidden correspond à l'attribut OOXML <definedName hidden="1"/> (par défaut False / Visible=True ; True masque le nom dans l'interface utilisateur du gestionnaire de noms d'Excel). Visible est un alias booléen (inverse de Hidden) pour un code plus clair au niveau de l'appel. Comment correspond à <definedName comment="..."/> . SaveAs génère les deux attributs uniquement lorsque les valeurs diffèrent des valeurs par défaut ; Open les analyse pour les restaurer. SheetIndex (la liaison de portée locale existante via localSheetId) est inchangée.

Version 2.20.5

  • Ajout de cinq traits de police supplémentaires à TXLSXFont. Nouvelle énumération TXLSXFontVertAlign (xlsxVertAlignBaseline / Superscript / Subscript) qui contrôle les cases à cocher "Superscript" / "Subscript" existantes dans Excel via une seule propriété VertAlign (mutuellement exclusives dans l'interface utilisateur). Nouvelles propriétés OutlineFont et Shadow de type Boolean pour les effets de police correspondants dans Excel. Nouvel entier Family (numéro de famille de police OOXML : 1=Roman / 2=Swiss / 3=Modern / 4=Script / 5=Decorative ; 0=non défini) et CharSet (numéro de jeu de caractères GDI : 0=ANSI / 1=Default / 134=GB2312 / 136=ChineseBig5 / etc. ; -1=non défini). SaveAs génère les éléments enfants correspondants <vertAlign> / <outline/> / <shadow/> / <family> / <charset> à l'intérieur de <font> ; Open les analyse pour les restaurer. ColorIndex / ThemeColor / TintAndShade seront implémentés dans une prochaine version axée sur les thèmes.

Version 2.20.4

  • Ajout de commutateurs pour la direction des diagonales des bordures. TXLSXBorder expose maintenant DiagonalUp: Boolean et DiagonalDown: Boolean. Ces deux indicateurs partagent le Style et la Couleur de la bordure diagonale existante et déterminent quelle(s) direction(s) diagonale(s) Excel doit afficher : uniquement vers le haut (inférieur gauche vers supérieur droit), uniquement vers le bas (supérieur gauche vers inférieur droit), ou les deux. SaveAs génère les attributs diagonalUp / diagonalDown sur l'élément <border> lorsqu'ils sont définis ; Open les lit pour les restaurer. Auparavant, le moteur écrivait une seule bordure diagonale sans contrôle de direction, ce qui empêchait Excel de dessiner l'une ou l'autre ligne diagonale.

Version 2.20.3

  • Ajout du commutateur workbook Date1904. TXLSXWorkbook expose maintenant une propriété Date1904: Boolean qui permet de choisir entre l'époque Windows 1900 (par défaut ; correspond à Excel pour Windows) et l'époque Mac 1904 (héritage Excel pour Mac). SaveAs génère <workbookPr date1904="1"/> dans xl/workbook.xml lorsqu'il est défini ; Open le lit pour le restaurer. Cet indicateur est une métadonnée uniquement ; le moteur ne transforme pas les numéros de série stockés ; les appelants doivent définir Date1904 avant d'assigner des valeurs de cellule de type TDateTime afin que la conversion aller-retour se fasse correctement dans le calendrier approprié.

Version 2.20.2

  • Ajout du support des critères de filtre automatique par colonne. Nouveaux types : TXLSXAutoFilterOp (Égal / DifférentDe / SupérieurÀ / InférieurÀ / SupérieurOuÉgalÀ / InférieurOuÉgalÀ), TXLSXAutoFilterColumn (ColId + 1 ou 2 critères + connecteur AND/OR), TXLSXAutoFilterColumns. TXLSXWorksheet expose la propriété AutoFilterColumns et les méthodes AddAutoFilterColumn(ColId, Op, Criteria) / AddAutoFilterColumn(ColId, Op1, Criteria1, Op2, Criteria2, AndConnector) / ClearAutoFilterColumns. SaveAs étend l'élément <autoFilter ref="..."/> existant en un corps de <filterColumn colId=N><customFilters and=0|1><customFilter operator="..." val="..."/>...</customFilters></filterColumn> par colonne lorsque des critères sont définis ; Open analyse la même structure. Auparavant, le moteur ne stockait que la plage de filtre automatique (sqref) et Excel affichait des menus déroulants de filtre vides.

Version 2.20.1

  • Ajout du support des sauts de page manuels sur TXLSXWorksheet. Nouvelles entrées : AddRowBreak(BeforeRow) / AddColBreak(BeforeCol) pour insérer un saut de page horizontal ou vertical avant une ligne/colonne donnée (sémantique "Avant" de l'interface utilisateur Excel - la ligne N commence une nouvelle page). Vérification HasRowBreak / HasColBreak ; RemoveRowBreak / RemoveColBreak supprime une seule entrée ; ClearRowBreaks / ClearColBreaks / ClearAllPageBreaks efface en masse. RowBreakCount / ColBreakCount + RowBreaks(Index) / ColBreaks(Index) indexés exposent les indices "Avant" basés sur 1 pour l'itération. SaveAs génère <rowBreaks> / <colBreaks> avec des enfants <brk id="N-1" max="..." man="1"/> entre <headerFooter> et <drawing> ; Open les analyse.

Version 2.20.0

  • Ajout de la visibilité des feuilles (Masquée / TrèsMasquée), de la sélection par feuille et du suivi de la feuille active sur TXLSXWorkbook / TXLSXSheets / TXLSXWorksheet. Nouveaux types : TXLSXSheetVisibility (xlsxSheetVisible / xlsxSheetHidden / xlsxSheetVeryHidden). Nouvelles propriétés de TXLSXWorksheet : Visibility, Visible (alias booléen), IsSelected (lecture seule). Nouveaux membres de TXLSXSheets : ActiveIndex, Activate(Index), Move(FromIndex, ToIndex). Nouveau proxy TXLSXWorkbook.ActiveSheet. SaveAs génère <sheet state="..."/> sur les entrées de feuilles du classeur, <bookViews><workbookView activeTab=N/></bookViews> lorsque la feuille active n'est pas la valeur par défaut 0, et tabSelected="1" sur l'élément <sheetView> de la feuille active ; Open analyse les trois. La première feuille ajoutée est à la fois visible et active par défaut, afin que les anciens sites d'appel continuent de fonctionner.

Version 2.19.2

  • Ajout de quatre options supplémentaires pour l'attribut PageSetup dans TXLSXWorksheet afin de couvrir complètement l'élément OOXML <pageSetup> : BlackAndWhite (rendu noir et blanc), Draft (supprime les graphiques pour un aperçu plus rapide), PrintNotes (affiche les commentaires des cellules au lieu de les masquer) et PrintOverThenDown (parcourt les lignes de gauche à droite au lieu de la disposition par défaut de haut en bas). SaveAs génère les attributs correspondants blackAndWhite / draft / cellComments / pageOrder ; Open les analyse pour les réutiliser. Les valeurs par défaut restent désactivées afin que les feuilles de calcul inchangées n'acquiert pas d'attributs supplémentaires.

Version 2.19.1

  • Ajout de propriétés pratiques pour les en-têtes et pieds de page en trois parties dans TXLSXWorksheet. Nouvelles entrées : LeftHeader / CenterHeader / RightHeader et LeftFooter / CenterFooter / RightFooter. Chacune lit ou écrit la section &L / &C / &R de la chaîne brute existante HeaderText / FooterText ; l'écriture d'une seule section reconstruit la forme brute complète afin que l'enregistreur et le lecteur fonctionnent sans modifications.
  • Ajout d'options d'impression pour la sortie des pages au niveau de la feuille. Nouvelles propriétés TXLSXWorksheet : CenterHorizontally, CenterVertically, PrintGridlines, PrintHeadings. SaveAs génère un élément <printOptions horizontalCentered / verticalCentered / gridLines / headings/> lorsque l'une de ces quatre options est activée ; Open analyse les mêmes attributs. Les valeurs par défaut restent désactivées afin que les feuilles de calcul inchangées n'acquiert pas d'élément <printOptions/> supplémentaire.
  • Ajout de la prise en charge de la sauvegarde et de la lecture des zones d'impression (PrintArea), des lignes d'en-tête (PrintTitleRows) et des colonnes d'en-tête (PrintTitleCols) au niveau de chaque feuille. Ceux-ci correspondent aux définitions de noms intégrés au niveau du classeur OOXML _xlnm.Print_Area et _xlnm.Print_Titles, définies via localSheetId. PrintArea prend une référence A1 simple (par exemple, "$A$1:$D$10"); PrintTitleRows et PrintTitleCols prennent des références de lignes ou de colonnes uniquement (par exemple, "$1:$3" ou "$A:$B") et les combinent en une seule entrée Print_Titles. L'enregistreur ajoute le nom de la feuille avec les guillemets appropriés (guillemets simples autour des noms contenant des espaces ou des caractères spéciaux) ; le lecteur supprime le préfixe et renvoie les entrées à la feuille correspondante, de sorte qu'elles ne se retrouvent pas dans la collection user-facing TXLSXWorkbook.DefinedNames.

Version 2.19.0

  • Ajout d'opérations d'insertion et de suppression de lignes/colonnes avec décalage complet au niveau de la feuille dans TXLSXWorksheet. Nouvelles entrées : InsertRows(BeforeRow, Count), DeleteRows(StartRow, Count), InsertCols(BeforeCol, Count), DeleteCols(StartCol, Count). InsertRows / InsertCols déplace les lignes/colonnes existantes vers la zone coupée de Count ; DeleteRows / DeleteCols supprime la plage [Start, Start+Count-1] et déplace tout ce qui se trouve après la zone coupée de Count.
  • Ce déplacement s'applique à tous les éléments de géométrie de la feuille qui dépendent de la position de la ligne/colonne : les ancres de cellules (Cells), les coins des plages fusionnées (MergedCells - les plages chevauchantes sont tronquées aux bords restants et les plages internes sont supprimées), les listes de métadonnées de lignes/colonnes (FRowHeights / FColWidths / niveaux de contour / masqué / réduit), les ancres de liens hypertexte et de commentaires (les entrées situées dans une bande supprimée sont supprimées), FreezePane (FFreezeRow / FFreezeCol), AutoFilterRange, et la chaîne de plage par entrée pour chaque ConditionalFormat, DataValidation et tableau Excel (une entrée dont la plage se trouve entièrement dans la zone supprimée est supprimée).
  • De nouveaux membres Delete(Index) ont été ajoutés aux collections associées afin que la logique de déplacement puisse supprimer une seule entrée sans effacement : TXLSXHyperlinks, TXLSXComments, TXLSXConditionalFormats, TXLSXDataValidations, TXLSXTables.
  • Hors du champ de cette version : les images et les graphiques ne sont pas déplacés (leurs ancres EMU en pixels les séparent de la grille de cellules et un déplacement fidèle nécessiterait de recalculer les décalages EMU) ; les formules des noms définis au niveau du classeur ne sont pas réécrites. Les deux sont suivis pour une version ultérieure.

Version 2.18.2

  • Des fonctions d'ajustement automatique (AutoFit) ont été ajoutées pour les largeurs de colonnes et les hauteurs de lignes. TXLSXWorksheet expose AutoFitColumn(ACol) / AutoFitColumns(ColMin, ColMax) et AutoFitRow(ARow) / AutoFitRows(RowMin, RowMax) ; TXLSXRange expose AutoFitColumns et AutoFitRows qui transmettent l'appel à la feuille, en respectant les limites de la plage. La largeur est estimée en unités de caractères Excel (Calibri 11pt, les caractères ASCII comptent pour 1, les caractères CJK comptent pour 2) avec une correction de 1,20 px par caractère et un espacement de 1,0, et est limitée à [8,43 ; 255,0]. La hauteur de ligne par défaut est de 15 pt et augmente de 12,75 pt par saut de ligne dans le texte de la cellule. Les plages larges (EntireRow / EntireColumn) sont limitées à la dernière ligne/colonne contenant une cellule de la feuille afin que l'ajustement automatique ne fasse pas itérer jusqu'aux limites de la grille Excel.

Version 2.18.1

  • Ajout d'une fonctionnalité de protection au niveau de la cellule, avec conversion aller-retour vers le moteur XLSX. TXLSXCell expose de nouvelles propriétés pratiques Locked : Boolean (par défaut True) et FormulaHidden : Boolean (par défaut False) qui reflètent le modèle de protection des cellules d'Excel. Elles exposent l'index du pool TXLSXCell.ProtectionIndex (de 1 à 1 dans le nouveau pool au niveau du classeur TXLSXProtections) ; l'écriture de la propriété pratique recherche ou ajoute la paire (Locked, FormulaHidden) dans le pool. Les valeurs par défaut (Locked=True, FormulaHidden=False) correspondent à ProtectionIndex=0, ce qui maintient le pool vide pour les cellules standard.
  • Ajout des fonctions TXLSXRange.SetLocked(ALocked) et TXLSXRange.SetFormulaHidden(AHidden) pour simplifier le déverrouillage ou la dissimulation d'une plage entière, en effectuant une seule recherche ou ajout et en appliquant le résultat à chaque cellule du rectangle.
  • Ajout des mécanismes de lecture/écriture correspondants. La fonction SaveAs génère un cellXf avec un élément enfant inline <protection locked="N" hidden="M"/> pour chaque entrée de Protections dans le classeur ; Open analyse l'élément <protection> et le réintègre dans Workbook.Protections, et transmet le nouveau CellXfProtMap via ParseStylesXml et ParseWorksheetXml afin que l'index de protection de chaque cellule soit conservé avec les index existants de police, de remplissage, de bordure, de format de nombre et d'alignement.

Version 2.18.0

  • Ajout de l'objet TXLSXRange pour l'accès à plusieurs cellules et les opérations par lots sur TXLSXWorksheet. Nouveaux points d'entrée : Worksheet.Range['A1:C5'], Worksheet.RCRange[r1,c1,r2,c2], Worksheet.UsedRange, Worksheet.EntireRow(r), Worksheet.EntireColumn(c). La plage retournée expose SetValue / SetFormula / Clear / ClearAll / Merge / Unmerge / Offset / Resize, ainsi que les setters d'index de style par cellule (SetFontIndex / SetFillIndex / SetBorderIndex / SetNumberFormatIndex / SetAlignmentIndex), et une fonction pratique SetNumberFormat(Fmt) qui recherche ou ajoute la chaîne de format dans le pool du classeur. Les objets TXLSXRange appartiennent à la feuille et sont libérés lors de la destruction de la feuille ; les appelants ne les libèrent pas.
  • Ajout de TXLSXCell.NumberFormat: WideString, qui s'associe à l'existing NumberFormatIndex. La lecture renvoie la chaîne de format à partir du pool du classeur ; l'écriture recherche ou ajoute la chaîne et met à jour NumberFormatIndex de manière transparente. Nécessite que la cellule soit attachée à un classeur (le flux standard via TXLSXWorkbook.Sheets.Add(...).Cells[r, c]).
  • Ajout de références arrière cellule -> feuille -> classeur afin que chaque TXLSXCell puisse déterminer son classeur propriétaire sans nécessiter de gestion externe. TXLSXSheets, TXLSXWorksheet et TXLSXCells ont acquis des références internes Owner, connectées via leurs constructeurs ; TXLSXCell expose une propriété Workbook en lecture seule et une fonction interne SetWorkbook utilisée par TXLSXCells.GetItem lors de la création automatique d'une cellule lors de l'accès.

Version 2.17.42

  • Correction du problème de conversion des cellules XLSX lors de la réouverture. Les cellules écrites par SaveAs étaient supprimées lors de l'ouverture, avec HasCell(row, col) renvoyant False et toutes les informations d'état au niveau de la cellule (valeur, formule, index de police, index de remplissage, index de bordure, index de format numérique) étaient perdues. La cause était un appel inutile à MoveToAttribute('r') dans l'analyseur de feuille de calcul, qui modifiait le type de nœud du lecteur en attribut, ce qui rendait la vérification IsEmptyElement renvoyer True et désactivait l'analyse des cellules pour chaque élément <c> avec un attribut r="", c'est-à-dire chaque cellule. La suppression de ce déplacement de curseur inutile restaure la conversion des cellules texte, numériques, de formule et de date.
  • Correction de la restauration de l'index de style XLSX lors de la réouverture. Les index de police, de remplissage, de bordure et de format numérique personnalisés des cellules étaient lus comme zéro, même après que les pools correspondants (Workbook.Fonts/Fills/Borders/NumberFormats) avaient été correctement convertis. L'analyseur cellXf suivait sa position avec un compteur qui n'était incrémenté que sur la balise de fin </xf>, mais Excel émet souvent des entrées auto-fermantes <xf .../> (sans balise <alignment> interne), de sorte que le compteur ne dépassait jamais zéro et chaque mappage cellXf écrasait le précédent. L'analyseur incrémente maintenant le compteur pour les balises auto-fermantes <xf />, ce qui permet la conversion des index FontIndex / FillIndex / BorderIndex / NumberFormatIndex par cellule.
  • Correction de la conversion des cellules de date XLSX. L'écriture d'une valeur TDateTime dans TXLSXCell.Value passait auparavant par le pool de chaînes partagées avec t="s" parce que Delphi's VarIsNumeric() renvoie False pour varDate. SaveAs écrit maintenant le numéro de série de la date directement dans <v> et applique la celluleXf de date, de sorte que les cellules de date s'ouvrent en tant que Variant varDate au lieu d'une chaîne localisée que l'appelant ne pouvait pas reconvertir en TDateTime.

Version 2.17.41

  • Correction de l'erreur "le flux zlib ne prend pas en charge la recherche" qui se produisait lors de la réouverture des fichiers .xlsx contenant des images intégrées ou un projet VBA (.xlsm). Les chemins de rechargement des images et de la charge utile VBA acheminaient tous deux le flux d'entrée décompressé via TMemoryStream.CopyFrom(Source, 0), ce qui réinitialisait Source pour dériver le nombre d'octets ; cette réinitialisation n'est pas autorisée sur un flux Deflate en lecture seule. Les deux emplacements d'appel utilisent maintenant une fonction d'assistance de lecture par blocs jusqu'à la fin de fichier, de sorte que les fichiers .xlsx contenant des images ou des macros sont convertis via SaveAs/Open sans générer d'erreur.

Version 2.17.40

  • Ajout du support des feuilles de graphique (feuille de calcul graphique en pleine page) dans le moteur XLSX. L'objet TXLSXWorksheet expose un nouveau champ IsChartSheet, ainsi qu'une fonction utilitaire Workbook.AddChartSheet(Name, ChartType, Title) au niveau du classeur, qui crée la feuille, active le champ, et initialise Charts[0] avec une valeur par défaut appropriée. La fonction SaveAs écrit les feuilles IsChartSheet dans xl/chartsheets/sheetN.xml avec un fichier rels dédié pointant vers la partie graphique partagée, les enregistre comme types de contenu de feuille de graphique, et génère la relation de feuille de graphique dans xl/_rels/workbook.xml.rels. Les feuilles de calcul ordinaires conservent leur chemin d'accès existant dans xl/worksheets/sheetN.xml. L'ouverture reconnaît les feuilles de graphique via le type de relation, mais les charge actuellement comme des feuilles de calcul ordinaires (leurs données de graphique arrivent toujours via les parties graphiques partagées).

Version 2.17.39

  • Ajout de la prise en charge de la rétractabilité des lignes/colonnes pour les groupes de contours dans le moteur XLSX. L'objet TXLSXWorksheet expose les propriétés booléennes RowCollapsed[Row] et ColCollapsed[Col], ainsi que les fonctions utilitaires SetRowCollapsed / SetColCollapsed / ClearRowCollapsed / ClearColCollapsed. La fonction SaveAs génère l'attribut collapsed="1" sur les entrées <row> et <col> correspondantes ; l'ouverture analyse cet attribut. Combiné aux attributs outlineLevel et hidden existants, cela permet au moteur XLSX de gérer une hiérarchie de groupement entièrement rétractable.

Version 2.17.38

  • Ajout de la prise en charge de la rétractabilité des lignes/colonnes pour le moteur XLSX. L'objet TXLSXWorksheet expose les propriétés booléennes RowHidden[Row] et ColHidden[Col], ainsi que les fonctions utilitaires SetRowHidden / SetColHidden / ClearRowHidden / ClearColHidden. La fonction SaveAs génère l'attribut hidden="1" sur les entrées <row> et <col> correspondantes ; l'ouverture analyse cet attribut et le stocke dans la feuille de calcul, de sorte que les lignes/colonnes masquées survivent à la sauvegarde sans nécessiter une largeur personnalisée ou un niveau de contour.

Version 2.17.37

  • Ajout de la prise en charge de la sauvegarde de la couleur de l'onglet de la feuille de calcul dans le moteur XLSX. L'objet TXLSXWorksheet expose les propriétés TabColor (ARGB) et TabColorIsAuto. La fonction SaveAs génère un bloc <sheetPr><tabColor rgb="..."/></sheetPr> comme premier enfant de <worksheet> lorsque la couleur de l'onglet est définie ; l'ouverture analyse l'élément <tabColor> et le stocke dans la feuille de calcul, de sorte que les onglets de feuille de calcul colorés survivent à la sauvegarde. Les classeurs par défaut ne contiennent pas ce bloc supplémentaire (TabColorIsAuto = True).

Version 2.17.36

  • Ajout de la fonctionnalité de sauvegarde et de restauration de l'alignement des cellules dans le moteur XLSX. Nouvelles énumérations de jetons TXLSXHorizontalAlignment et TXLSXVerticalAlignment, classe TXLSXAlignment (Horizontal, Vertical, WrapText, ShrinkToFit, Indent, TextRotation), et une collection TXLSXAlignments au niveau du classeur (Workbook.Alignments). TXLSXCell contient désormais un AlignmentIndex (index basé sur 1 dans Workbook.Alignments). La fonction SaveAs ajoute un cellXf avec un élément enfant <alignment> en ligne pour chaque entrée d'alignement du classeur ; la fonction Open lit les attributs <alignment> et les mappe dans Workbook.Alignments, puis associe le cellXf à TXLSXCell.AlignmentIndex. Les fonctions ParseWorksheetXml et ParseStylesXml ont reçu un paramètre CellXfAlignMap pour gérer la correspondance entre les deux phases.

Version 2.17.35

  • Ajout de l'API de chiffrement AES (chiffrement selon la norme ECMA-376) au moteur XLSX. TXLSXWorkbook expose les fonctions SaveAsEncrypted(FileName, Password) / OpenEncrypted(FileName, Password) / CanReadEncrypted(FileName), ainsi qu'une exception EXlsxEncryptionNotImplemented. CanReadEncrypted reconnaît les octets magiques du fichier binaire Microsoft Compound File ($D0 $CF $11 $E0 $A1 $B1 $1A $E1), permettant aux appelants de détecter les archives chiffrées avant de décider comment les ouvrir ; OpenEncrypted revient de manière transparente à la fonction Open standard pour les fichiers .xlsx non chiffrés. Le pipeline AES-128/256 + SHA + OLE Compound File lui-même n'est pas encore implémenté ; la lecture et l'écriture de fichiers réellement chiffrés génèrent l'exception spécifiée jusqu'à la prochaine version, qui implémentera l'algorithme. Le type d'exception est distinct pour permettre aux appelants existants de la capturer et de revenir à Worksheet.Protect / Workbook.ProtectWorkbook pour le verrouillage visuel.

Version 2.17.34

  • Performances : remplacement de la concaténation de chaînes WideString, qui avait une complexité O(N^2) pour la construction des lignes de cellules de chaque feuille, par un TXLSWideStringBuilder. Les grandes feuilles (10 000 cellules ou plus) restent linéaires en termes de mémoire et de CPU lors de la sauvegarde. Ajout d'une nouvelle fonction utilitaire WriteWorksheetXmlStreaming et d'un indicateur opt-in TXLSXWorkbook.StreamingWrite ; lorsque cet indicateur est activé, SaveAs ne conserve plus toutes les feuilles XML dans un cache sheetXmls simultanément ; chaque feuille est construite, écrite et supprimée avant de passer à la suivante. Le fichier sharedStrings.xml est généré en dernier, de sorte que le chemin de streaming produit toujours un SST entièrement rempli. Le comportement par défaut reste inchangé.

Version 2.17.33

  • Ajout d'opérations sur les plages de cellules au moteur XLSX. L'objet TXLSXWorksheet expose ClearRange(R1, C1, R2, C2), CopyRange(SrcR1, SrcC1, SrcR2, SrcC2, DstR, DstC) pour la copie dans la même feuille, CopyRangeTo(... TargetSheet, DstR, DstC) pour la copie entre feuilles, et MoveRange(SrcR1, SrcC1, SrcR2, SrcC2, DstR, DstC) pour le copier-coller. Chaque opération duplique la valeur de la cellule, la formule, les quatre indices de style et toute charge utile de texte enrichi ; MoveRange évite les chevauchements avec la destination, de sorte que les chevauchements partiels conservent leurs valeurs copiées. L'objet TXLSXCells gagne également une fonction utilitaire Remove(Row, Col).

Version 2.17.32

  • Ajout d'ancres de liens internes au moteur XLSX. L'objet TXLSXHyperlink possède maintenant une propriété Location (par exemple, "Sheet2!A1") et une fonction utilitaire IsInternal ; TXLSXHyperlinks expose AddInternal, et TXLSXWorksheet ajoute trois versions surchargées de AddHyperlinkToCell. SaveAs génère des liens internes avec l'attribut inline location="" et omet l'entrée de relations de la feuille ; Open reconnaît les liens location="" et les redirige vers AddInternal. Les liens URL externes continuent de transiter à travers le fichier de relations sans modification.

Version 2.17.31

  • Ajout du support aller-retour du texte enrichi au moteur XLSX. Nouvelle classe TXLSXRichTextRun (par exécution : Nom / Taille / Gras / Italique / Barré / Souligné / Couleur) et conteneur TXLSXRichText qui expose AddRun / AddRunText / Clear / PlainText. L'objet TXLSXCell possède maintenant une propriété RichText associée ; SaveAs écrit la cellule en tant que chaîne partagée avec plusieurs exécutions <r>/<rPr>/<t> et Open reconstruit l'objet TXLSXRichText à partir de l'entrée SST analysée, la valeur Variant de la cellule affichant toujours le texte brut concaténé pour les appelants qui ignorent la mise en forme.

Version 2.17.30

  • Ajout du support aller-retour des graphiques au moteur XLSX. Nouvel énumérateur TXLSXChartType (colonne / barre / ligne / circulaire), TXLSXChartSeries (Nom, PlageDeCatégories, PlageDeValeurs) et TXLSXChart (TypeDeGraphique, Titre, titres des axes, cellules d'ancrage From/To, Séries) ainsi qu'une collection TXLSXCharts par feuille (Worksheet.Charts). TXLSXWorksheet expose AddChart(Type, Titre, FromRow, FromCol, ToRow, ToCol). SaveAs génère xl/charts/chartN.xml (numérotation globale du classeur) et le lie à une ancre à deux cellules / cadre graphique dans le fichier xl/drawings/drawingN.xml partagé ; Open analyse à la fois l'ancre et la définition du graphique et les reconstitue dans la collection. Les titres de graphiques, les titres des axes, les noms des séries et les plages sources sont pris en charge dans le cycle aller-retour.

Version 2.17.29

  • Correction d'une erreur EListError "Opération non autorisée sur une liste triée" levée par SetColWidth, SetRowHeight, SetRowOutlineLevel et SetColOutlineLevel. Les quatre champs TStringList étaient créés avec Sorted=True, mais modifiés via le setter Values[Name] := X, ce que l'environnement d'exécution (RTL) de RAD Studio refuse sur une liste triée. Les listes sont maintenant créées non triées; les recherches continuent via IndexOfName, ce qui est acceptable pour les nombres typiques de colonnes/lignes par feuille.

Version 2.17.28

  • Correction de TZipArchive.Exists, qui était un stub qui renvoyait toujours false. Le chemin d'accès XLSX Open utilise zip.Exists(...) pour vérifier chaque partie avant de la lire, ce qui signifie que chaque tentative précédente de sauvegarde (cellules, styles, commentaires, dessins, propriétés du document, noms définis, protection, VBA, etc.) perdait silencieusement son contenu lors de la lecture. Exists délègue désormais à la recherche existante Fcd.Entries.Exists, ce qui correspond au modèle OpenFile / CreateFile.

Version 2.17.27

  • Ajout de la préservation des projets VBA au moteur XLSX. TXLSXWorkbook expose une charge utile VBA Project ainsi que les fonctions LoadVbaProjectFromFile(FileName), ClearVbaProject et HasVbaProject. SaveAs écrit les octets dans xl/vbaProject.bin, enregistre le type de contenu .bin, modifie le type de contenu du classeur vers la variante activée pour les macros et ajoute une relation vbaProject au fichier rels du classeur; Open lit les octets de xl/vbaProject.bin dans la propriété. Les octets ne sont pas analysés ni modifiés, de sorte que les projets .xlsm existants sont sauvegardés et restaurés exactement. Note : les classeurs activés pour les macros doivent être enregistrés avec l'extension .xlsm pour que Excel active les macros.

Version 2.17.26

  • Ajout de la protection des classeurs et des feuilles au moteur XLSX. TXLSXWorksheet expose Protect / Protect(Password) / UnProtect ainsi que IsProtected et SheetProtectHash; TXLSXWorkbook ajoute ProtectWorkbook (avec les drapeaux facultatifs password, LockStructure, LockWindows) et UnProtectWorkbook ainsi que IsWorkbookProtected / WorkbookProtectHash / LockStructure / LockWindows. SaveAs émet <sheetProtection> pour chaque feuille protégée et <workbookProtection> pour les classeurs protégés; Open analyse les deux blocs et les remet dans l'API. Les mots de passe sont stockés sous la forme du hachage standard en 4 hexadécimaux pour garantir la fidélité de la sauvegarde et de la restauration (le texte brut d'origine n'est pas récupérable).

Version 2.17.25

  • Ajout de la sauvegarde et de la restauration des propriétés du document au moteur XLSX. TXLSXWorkbook expose désormais les propriétés Title, Author, Subject, Keywords, Description, Category, LastModifiedBy, Created, Modified, Company, Application et AppVersion. SaveAs émet docProps/core.xml et docProps/app.xml (et les enregistre dans [Content_Types].xml + _rels/.rels) chaque fois qu'une propriété est modifiée; Open analyse les deux fichiers et les remet dans l'API, ce qui permet aux auteurs, aux horodatages de modification et aux métadonnées de l'application de survivre à une sauvegarde et à une réouverture.

Version 2.17.24

  • Ajout de la fonctionnalité de sauvegarde et de restauration des tableaux au format Excel dans le moteur XLSX. Nouvelle classe TXLSXTable (Id, Name, DisplayName, Range, Columns, StyleName, ShowFirstColumn / ShowLastColumn / ShowRowStripes / ShowColumnStripes) et une collection TXLSXTables par feuille. TXLSXWorksheet expose les tableaux et la méthode AddTable(Name, Range, ColumnNames). SaveAs génère xl/tables/tableN.xml (numérotation globale du classeur), met à jour les relations de la feuille avec les relations des tableaux, ajoute <tableParts> à la feuille et enregistre le type de contenu du tableau. Open analyse les relations des tableaux et tableN.xml pour les réintégrer dans la feuille, ce qui permet aux bandes de tableaux formatées de survivre à une sauvegarde et à une réouverture.

Version 2.17.23

  • Ajout de la fonctionnalité de sauvegarde et de restauration des filtres automatiques dans le moteur XLSX. TXLSXWorksheet expose la propriété AutoFilterRange ainsi que les méthodes SetAutoFilter(Row1, Col1, Row2, Col2) / SetAutoFilter(Range) / ClearAutoFilter. SaveAs génère la balise <autoFilter ref="..."/> après le bloc de fusion de cellules lorsque la plage n'est pas vide ; Open analyse l'attribut ref et le réintègre dans la propriété, ce qui permet à la bande de filtre d'une feuille de survivre à une sauvegarde et à une réouverture.

Version 2.17.22

  • Ajout de la fonctionnalité de sauvegarde et de restauration des paramètres de page dans le moteur XLSX. TXLSXWorksheet expose les propriétés Margin{Left,Right,Top,Bottom,Header,Footer}, PageLandscape, PaperSize, PageScale, FitToWidth, FitToHeight, HeaderText et FooterText, ainsi que les méthodes de commodité SetPageMargins(L, R, T, B[, H, F]). SaveAs génère les blocs correspondants <pageMargins>, <pageSetup> et <headerFooter> entre les hyperliens et les dessins ; Open les analyse et les réintègre. Les feuilles par défaut restent inchangées (l'indicateur PageSetupTouched contrôle la sortie).

Version 2.17.21

  • Ajout de la fonctionnalité de sauvegarde et de restauration de la fonction de "figer" des volets dans le moteur XLSX. TXLSXWorksheet expose les méthodes FreezePane(Col, Row) / UnfreezePane ainsi que les propriétés en lecture seule FreezeCol et FreezeRow. SaveAs écrit un bloc <sheetViews>/<pane state="frozen"> avant <sheetData> avec l'état activePane et la sélection correspondants ; Open analyse le bloc <pane state="frozen"> et le réintègre dans la position de "figer", ce qui permet aux dispositions "figer-haut/gauche/coin" de survivre à une sauvegarde et à une réouverture.

Version 2.17.20

  • Ajout des niveaux de regroupement de lignes et de colonnes dans le moteur XLSX. TXLSXWorksheet expose les propriétés indexées RowOutlineLevel[Row] et ColOutlineLevel[Col], ainsi que les méthodes SetRowOutlineLevel / HasRowOutlineLevel / ClearRowOutlineLevels et les méthodes correspondantes pour les colonnes. SaveAs génère les attributs outlineLevel sur les entrées <row> et les entrées <col> fusionnées (combinés avec les largeurs personnalisées lorsqu'elles sont présentes) ; Open analyse les deux attributs et les réintègre dans la feuille, ce qui permet aux hiérarchies de lignes/colonnes regroupées de survivre à la sauvegarde et à la restauration.

Version 2.17.19

  • Ajout du support de la mise en forme conditionnelle et de la validation des données dans le moteur XLSX. Nouvelles énumérations TXLSXCfOperator et classes TXLSXConditionalFormat (Range, Op, Formula1, Formula2) ainsi qu'une collection TXLSXConditionalFormats pour chaque feuille de calcul (Worksheet.ConditionalFormats). Nouvelles classes TXLSXDataValidationType, TXLSXDvOperator, TXLSXDataValidation (Range, ValidationType, Op, Formula1, Formula2, AllowBlank, ShowInputMessage, ShowErrorMessage) et une collection TXLSXDataValidations (Worksheet.DataValidations) avec un raccourci AddList(Range, Items) pour les listes déroulantes courantes. TXLSXWorksheet expose les fonctions AddConditionalFormat et AddDataValidation / AddListValidation. La fonction SaveAs écrit les blocs <conditionalFormatting> (avec cfRule type="cellIs") et un bloc <dataValidations> après sheetData ; la fonction Open analyse ces blocs et les remet dans les collections.

Version 2.17.18

  • Ajout du support des noms définis dans le moteur XLSX. Nouvelle classe TXLSXDefinedName (Name, Formula, SheetIndex) et une collection TXLSXDefinedNames au niveau du classeur (Workbook.DefinedNames) avec les méthodes Add(Name, Formula[, SheetIndex]) et IndexOfName. La fonction SaveAs génère un bloc <definedNames> dans xl/workbook.xml ; les entrées avec SheetIndex >= 0 ont un attribut localSheetId (portée de feuille) et les entrées avec SheetIndex = -1 sont de portée globale. La fonction Open analyse les éléments <definedName> et les remet dans la collection, ce qui permet de conserver les plages nommées lors de l'ouverture et de la réouverture des classeurs.

Version 2.17.17

  • Ajout du support des images dans le moteur XLSX. Nouvelles énumérations TXLSXImageFormat (png, jpeg, gif, bmp), classe TXLSXImage (Row/Col anchor, WidthEMU/HeightEMU, Format, Data) et une collection TXLSXImages par feuille de calcul. TXLSXWorksheet expose la collection Images ainsi que les fonctions AddImage(Row, Col, Data, Format) et AddImageFromFile(Row, Col, FileName). La fonction SaveAs écrit les octets de l'image dans xl/media/imageN.<ext>, génère xl/drawings/drawingN.xml avec une ancre de cellule unique par image (et un fichier _rels correspondant), enregistre les types de contenu et les relations feuille de calcul/dessin, et génère une référence <drawing r:id="..."/> dans la feuille de calcul. La fonction Open analyse drawingN.xml + drawing rels + media pour remettre les images dans Worksheet.Images.

Version 2.17.16

  • Ajout d'un formatage numérique personnalisé pour la conversion aller-retour dans le moteur XLSX. Nouvelle classe TXLSXNumberFormat et collection TXLSXNumberFormats au niveau du classeur (Workbook.NumberFormats) qui suppriment les doublons des codes de format via Add(FormatCode). TXLSXCell expose une nouvelle propriété NumberFormatIndex ; SaveAs génère un bloc <numFmts> dans xl/styles.xml (les identifiants personnalisés commencent à la base 164 réservée par OOXML) et associe chaque format à un cellXf dédié. Open analyse les numFmts personnalisés et inverse la correspondance cellXf->numFmtId en NumberFormatIndex lors de la lecture. Priorité en cas de conflit : FormatIndex > FontIndex > FillIndex > BorderIndex > NumberFormatIndex.

Version 2.17.15

  • Ajout du formatage des bordures de cellule pour la conversion aller-retour dans le moteur XLSX. Nouvel énumérateur TXLSXBorderStyle, classe TXLSXBorderEdge (Style + Color + ColorIsAuto pour chaque côté), classe TXLSXBorder avec les bords Gauche/Droite/Haut/Bas/Diagonale, ainsi que des fonctions utilitaires SetAll(Style[, Color]), et une collection TXLSXBorders au niveau du classeur (Workbook.Borders) avec un raccourci Borders.AddBox(Style[, Color]). TXLSXCell expose une nouvelle propriété BorderIndex ; SaveAs génère chaque bordure dans xl/styles.xml et l'associe à un cellXf dédié. Open analyse les bordures et traduit la correspondance cellXf->borderId en BorderIndex lors de la lecture. La priorité reste FormatIndex > FontIndex > FillIndex > BorderIndex lorsque plusieurs sont définis sur la même cellule.

Version 2.17.14

  • Ajout du formatage de remplissage de cellule pour la conversion aller-retour dans le moteur XLSX. Les nouveaux énumérateurs TXLSXFillPattern et la classe TXLSXFill décrivent patternType, fgColor et bgColor ; la collection TXLSXFills au niveau du classeur est accessible via Workbook.Fills, avec une fonction utilitaire Fills.AddSolid(color) pour le cas courant de remplissage de couleur unie. TXLSXCell expose une nouvelle propriété FillIndex ; SaveAs génère chaque remplissage dans xl/styles.xml et l'associe à un cellXf dédié. Open les analyse et inverse les attributs de la cellule en FillIndex lors de la lecture. FontIndex conserve la priorité lorsque les deux sont définis.

Version 2.17.13

  • Finalisation du formatage des polices pour XLSX. Open analyse maintenant xl/styles.xml et le reconstruit dans Workbook.Fonts et une table cellXf->fontId ; chaque attribut s de la cellule est mappé vers TXLSXCell.FontIndex afin que les classeurs enregistrés et rouverts conservent les polices personnalisées (Nom, Taille, Gras, Italique, Barré, Souligné, Couleur).

Version 2.17.12

  • Ajout d'une classe TXLSXFont ainsi qu'une collection Workbook.Fonts pour que les cellules XLSX puissent choisir une police personnalisée. TXLSXCell possède une nouvelle propriété FontIndex ; SaveAs génère la liste des polices dans xl/styles.xml et un cellXf par police, puis fait référence au cellXf correspondant de chaque cellule dans son attribut s. La conversion aller-retour de FontIndex est prévue pour la prochaine version.

Version 2.17.11

  • Ajout de la gestion des hauteurs de ligne dans le moteur XLSX. L'objet TXLSXWorksheet expose une propriété RowHeight[Row] ainsi que les fonctions SetRowHeight, HasRowHeight et ClearRowHeights. La fonction SaveAs écrit les attributs "ht" et "customHeight="1"" sur chaque balise <row> avec une hauteur personnalisée (y compris les lignes qui ne contiennent qu'une hauteur, sans données de cellule) ; la fonction Open lit l'attribut "ht" et le stocke dans la carte des hauteurs de ligne.

Version 2.17.10

  • Ajout de la gestion des largeurs de colonne dans le moteur XLSX. L'objet TXLSXWorksheet expose une propriété ColWidth[Col] ainsi que les fonctions SetColWidth, HasColWidth et ClearColWidths. La fonction SaveAs génère un bloc <cols> avec une entrée <col> par colonne personnalisée ; la fonction Open relit les entrées <col min/max/width> dans la feuille de calcul, de sorte que les largeurs non modifiées reprennent les valeurs par défaut d'Excel.

Version 2.17.9

  • Ajout de la gestion des commentaires de cellule dans le moteur XLSX. L'objet TXLSXWorksheet expose une collection Comments et les fonctions AddComment(Row, Col, Text[, Author]). La fonction SaveAs génère les fichiers xl/commentsN.xml (avec une liste d'auteurs dédupliquée) et un fichier compagnon xl/drawings/vmlDrawingN.vml afin qu'Excel puisse afficher les ballons de commentaires ; la fonction Open lit les commentairesN.xml et les stocke dans la collection. Les relations de la feuille de calcul, les types de contenu et la configuration de <legacyDrawing> sont gérés automatiquement.

Version 2.17.8

  • Ajout de la gestion des hyperliens dans le moteur XLSX. L'objet TXLSXWorksheet expose une collection Hyperlinks et les fonctions AddHyperlink(Row, Col, Url[, Display[, Tooltip]]). La fonction SaveAs écrit un bloc <hyperlinks> dans chaque feuille de calcul et génère un fichier correspondant xl/worksheets/_rels/sheetN.xml.rels contenant les URL cibles externes ; la fonction Open lit d'abord les relations de la feuille de calcul pour résoudre les entrées <hyperlink r:id="..."/> en URL dans la collection.

Version 2.17.7

  • Ajout de la gestion des cellules fusionnées dans le moteur XLSX. L'objet TXLSXWorksheet expose une collection MergedCells et une fonction MergeCells(R1, C1, R2, C2) qui reproduit le style de l'interface BIFF. La fonction SaveAs génère un bloc <mergeCells> après sheetData, et la fonction Open analyse les entrées <mergeCell ref="A1:B2"/> et les stocke dans la collection.

Version 2.17.6

  • Le moteur XLSX effectue désormais une conversion aller-retour des valeurs de date et des formules. Les valeurs de cellule TDateTime sont sérialisées en tant que numéros de série Excel et marquées avec un style de cellule intégré pour que Excel les affiche comme des dates ; lors de l'ouverture, les cellules dont le style fait référence au style de cellule pour la date sont décodées en variantes TDateTime. TXLSXCell expose une nouvelle propriété Formula ; SaveAs écrit la formule en tant qu'élément enfant <f> et Open analyse le texte de <f> et le stocke dans la cellule.

Version 2.17.5

  • Un modèle de fichier styles.xml a été ajouté au moteur XLSX. SaveAs génère maintenant un fichier xl/styles.xml minimal et valide avec les polices, les remplissages, les bordures, les cellStyleXfs et les cellXfs par défaut, ainsi que les enregistrements de type de contenu et de relation de classeur correspondants. Les cellules possèdent une propriété FormatIndex et émettent l'attribut de cellule s="N" lorsqu'il est différent de zéro, et Open lit s="N" et le stocke dans FormatIndex. Les descripteurs de style concrets (polices, remplissages, bordures, cellXfs en tant que collections au niveau du classeur) seront ajoutés dans les commits suivants.

Version 2.17.4

  • La prise en charge des chaînes partagées (SST) a été ajoutée au moteur XLSX. SaveAs crée un tableau de chaînes dédupliquées et génère le fichier xl/sharedStrings.xml, remplaçant l'émission de chaînes intégrées. Open lit d'abord xl/sharedStrings.xml et résout les références de cellule t="s" via le SST. Les cellules de chaîne intégrées provenant de fichiers XLSX tiers sont toujours acceptées lors de l'ouverture.

Version 2.17.3

  • Le tableau d'enregistrements de cellules dans TXLSXWorksheet a été remplacé par des objets TXLSXCell et une collection TXLSXCells. Le site d'appel d'accès aux cellules lit désormais Worksheet.Cells.Item[Row, Col].Value, ce qui correspond à la forme IXLSCells / IXLSRange sur la façade BIFF. Worksheet.Cells.HasCell / Cells.Count / Cells.CellByIndex / Cells.Clear sont également disponibles.

Version 2.17.2

  • La classe de collection TXLSXSheets a été introduite dans TXLSXWorkbook, reflétant la collection IXLSWorkSheets sur la façade BIFF. Le code lit désormais Workbook.Sheets.Add / Workbook.Sheets.Count / Workbook.Sheets[i] / Workbook.Sheets.IndexByName au lieu des méthodes Workbook.AddSheet / Workbook.SheetCount / Workbook.Sheet[i] précédentes.

Version 2.17.1

  • Renommé TXLSXWorkbook.SaveToFile en SaveAs et TXLSXWorkbook.LoadFromFile en Open, pour correspondre au style de nommage existant de IXLSWorkBook. Ajouté des surcharges pour le format de fichier et le mot de passe afin que la façade XLSX se comporte de la même manière que la façade BIFF. AddSheet offre maintenant une surcharge sans argument qui génère un nom de feuille par défaut.

Version 2.17.0

  • TXLSXWorkbook.SaveAs produit une archive .xlsx OOXML minimale avec les valeurs des cellules (nombres, booléens et chaînes intégrées). L'archive contient les types de contenu, les relations racines, le classeur + les relations, et une feuille de calcul par feuille.
  • TXLSXWorkbook.Open lit l'archive .xlsx OOXML minimale : les noms des feuilles sont lus à partir de xl/workbook.xml et les valeurs des cellules sont lues à partir de xl/worksheets/sheetN.xml. Les chaînes partagées, les styles, les dates et les formules ne sont pas encore pris en charge.
  • Ajouté l'espace de noms OOXML, les types de contenu et les constantes de relation, ainsi que les fonctions d'aide pour les références / l'analyse / l'échappement (XlsxColumnLabel, XlsxCellRef, XlsxColumnIndex, XlsxParseCellRef, XlsxParseRangeRef, XlsxEscapeText, XlsxEscapeAttr) pour être utilisés par les futures fonctionnalités XLSX.

Version 2.16.4

  • L'unité de façade XLSX (lxHandleX) définit maintenant ses propres types de classeur et de feuille de calcul (TXLSXWorkbook, TXLSXWorksheet), indépendamment de la façade BIFF. Les points d'entrée de sauvegarde et de chargement sont réservés ; la configuration OOXML sera complétée dans une version ultérieure.
  • Ajout d'un sujet de référence pour les développeurs concernant la nouvelle façade XLSX, décrivant comment lxHandle et lxHandleX coexistent et quelles unités auxiliaires ils partagent.

Version 2.16.3

  • Introduction de lxHandleX, une unité de façade XLSX dédiée coexistant avec la façade BIFF existante lxHandle. Les deux unités partagent la même infrastructure sous-jacente (pools de styles, utilitaires XML, archive ZIP) mais exposent des hiérarchies de classes indépendantes : lxHandle gère TXLSWorkBook et les chemins classiques XLS/HTML/RTF/CSV ; lxHandleX gérera TXLSXWorkbook et toutes les API spécifiques à XLSX. Trois stubs de méthodes ajoutés accidentellement à lxHandle (SetCodePage, GetColumnXFIndex, GetRowXFIndex) ont été supprimés afin de conserver l’API publique de la façade BIFF identique à celle de v2.15.0. Le code existant utilisant lxHandle ne nécessite aucune modification.

Version 2.16.2

  • Ajout de trois unités internes de structures de données complétant les fondations du moteur XLSX : lxAvlTree fournit un arbre AVL O(log N) (TAVLTree/TAVLNode) pour les recherches triées ; lxCols et lxRows sont des conteneurs d’informations de colonnes et de lignes avec déduplication fine et réécriture d’index, utilisés par les cartes de largeur de colonne et de hauteur de ligne par feuille du moteur XLSX. Les trois unités sont dormantes dans cette version et seront activées dans v2.17.0 lors de la première activation du moteur de lecture/écriture XLSX.

Version 2.16.1

  • Ajout de six unités internes d’utilitaires XML et ZIP complétant la couche d’infrastructure du moteur XLSX : lxWStream (flux de fichier en caractères larges avec vérification d’existence du fichier et assistant d’écriture AnsiString) ; lxCacheStream (enveloppe de flux avec tampon réduisant les appels E/S sous-jacents) ; lxZlibStream (flux deflate/inflate en avance uniquement, indépendant de la liaison de chiffrement BIFF loZlib existante) ; lxXmlReader (lecteur à extraction de style SAX pour une analyse XML à haute vitesse) ; lxXmlWriter (écrivain XML en flux avec réutilisation des noms d’éléments) ; lxZipArchive (lecteur/écrivain ZIP à répertoire central avec flux deflate par entrée). Associées aux sept unités de v2.16.0, elles forment la fondation interne complète du moteur XLSX.

Version 2.16.0

  • Ajout de sept unités internes d’infrastructure de styles constituant la fondation du prochain moteur XLSX : lxHashTable (tables de hachage génériques avec variantes de clé entière, WideString et objet) ; lxKeyList (liste à clé objet avec recherche rapide et réécriture d’index) ; lxStyleColor (gestionnaire de couleurs de thème Office et de slots de palette) ; lxStyleFont, lxStyleFill et lxStyleBorder (pools dédupliqués pour les styles de police, de remplissage et de bordure couvrant les 12 types de lignes BIFF et les mappages de style XLSX) ; lxStyleXf (agrège les cinq pools de styles avec une liste de formats numériques en un seul enregistrement XF). Les sept unités sont dormantes dans cette version et n’affectent pas les chemins XLS existants.

Version 2.15.1

  • Ajout des fonctions utilitaires de couleur lxRgb : RGBtoHLS, HLStoRGB, RGBTint et GetRGBTint effectuent des conversions entre les espaces colorimétriques RGB et HLS (plage HLS 0–240). Elles sous-tendent les calculs de teinte de couleur de thème, la mise en forme conditionnelle par échelle de couleurs et l’interpolation de palette dans la sortie XLSX.
  • Ajout des constructeurs de chaînes haute performance lxStrBuilder : TXLSStringBuilder (AnsiChar) et TXLSWideStringBuilder (WideChar) utilisent des tampons pré-alloués à croissance doublante pour éliminer la réallocation mémoire par concaténation des chaînes Pascal standard. La variante AnsiChar alimente le chemin de sérialisation XML XLSX ; la variante WideChar gère l’assemblage de chaînes larges dans l’analyseur XLSX.

Version 2.15.0

  • Refonte de la documentation HtmlHelp en une structure adaptée au web, avec des dossiers dédiés pour les sujets, les ressources, les scripts, les styles et les sources.
  • Ajout d'une page d'accueil et d'une page de navigation du contenu conviviales pour les navigateurs, avec des en-têtes, des raccourcis vers les sujets et des pieds de page uniformes.
Retour en haut