Références externes de classeur
Vue d'ensemble
Les modèles de feuille de calcul tirent souvent leurs données de classeurs secondaires à l'aide de formules de référence croisée ; HotXLS prend en charge l'analyse, l'écriture et la préservation des références externes de classeur à la fois dans les documents BIFF8 (XLS classique) et OpenXML (XLSX)
Espace de travail des classeurs connectés
TXLSWorkbookWorkspace dans lxWorkbookWorkspace est le noyau partagé d'identité et d'enregistrement pour les classeurs externes connectés ; TXLSWorkbook et TXLSXWorkbook exposent tous deux CreateWorkspaceWorkbook et possèdent un ExternalWorkspace utilisé par leurs évaluateurs de formules, tandis qu'un classeur ODS ouvert via TXLSXWorkbook signale le type de moteur OpenDocument par le même adaptateur
var
Host, Target: TXLSXWorkbook;
begin
Host.ExternalWorkspace.Add(
'..\Data\Target.xlsx',
'..\Data\Target.xlsx',
'C:\Models\Host.xlsx',
Target.CreateWorkspaceWorkbook);
// The compatibility facade maps an unambiguous name to the
// relationship target already stored in Host.ExternalLinks
Host.RegisterExternalWorkbook('Target.xlsx', Target);
// The matching call revokes a facade-level registration
Host.UnregisterExternalWorkbook('Target.xlsx');
end;
Les classeurs classiques utilisent les mêmes méthodes de compatibilité avec des cibles TXLSWorkbook ; RegisterExternalWorkbook et UnregisterExternalWorkbook ne gèrent que le mappage de noms au niveau de la façade, tandis que ExternalWorkspace.Remove et Clear révoquent les enregistrements de l'espace de travail eux-mêmes. Les appelants multi-moteurs ajoutent directement à ExternalWorkspace n'importe quel adaptateur Classic, XLSX ou ODS
- La normalisation d'identité est lexicale et insensible à la casse, préserve les chemins et extensions, résout les cibles relatives par rapport à l'identité source du propriétaire, réduit les segments de points et n'effectue aucun accès au système de fichiers ou au réseau
- Les identités exactes et les alias explicites sont résolus en premier ; la recherche par seul nom de base ne réussit que lorsqu'exactement un enregistrement connecté correspond, sinon
ResolverenvoiexlswrsConflict Addrejette les collisions de clé exacte, d'alias et de classeur en double ; des chemins complets distincts et des extensions distinctes peuvent coexisterRemoveetClearrévoquent les enregistrements, tandis que la destruction directe d'une cible Classic ou XLSX déconnecte son adaptateur et attend les lecteurs actifs avant que le modèle ne soit libéré- Les feuilles de calcul externes sont résolues par nom déclaré avant le repli positionnel en base un, de sorte que l'ordre des feuilles du classeur cible n'a pas besoin de correspondre au répertoire de liens source
- L'évaluateur de formules lit d'abord un classeur connecté résolu, puis se replie sur le cache typé du fichier hôte ; les hôtes XLS classiques décodent les valeurs XCT et CRN éparses, tandis que les hôtes XLSX utilisent le cache de liens externes déjà détenu par le modèle de package
OnLoadWorkbookest une demande de ressource contrôlée facultative ; sa valeur par défaut estnil, si bien que le recalcul n'effectue toujours aucun accès au système de fichiers ou au réseau sauf si le code applicatif fournit explicitement cette politique- Chaque identité normalisée invoque le chargement au plus une fois jusqu'à
ResetLoadAttempts; les requêtes de premier niveau concurrentes partagent le résultat en cours, y compris les issues typées introuvable et erreur, au lieu d'ouvrir la même ressource de façon répétée MaxLoadDepthvaut 16 par défaut etMaxWorkbookCount64 ; la réentrance sur une même identité, les dépendances imbriquées sur une identité déjà en cours, l'épuisement de profondeur et l'épuisement du nombre de classeurs renvoient des diagnostics typés sans blocage dans un cycle de chargement- Les IRI de sources externes ODF restent des identités lexicales complètes, y compris les schémas URI et les caractères entre guillemets, mais n'autorisent jamais d'accès implicite aux fichiers ou au réseau
- Un conflit d'identité reste
#REF!afin que des données en cache périmées ne puissent masquer un routage ambigu ; une cellule absente du cache n'est une valeur vide que lorsque le fichier déclare un cache valide pour cette feuille
Resolve effectue la recherche dans les enregistrements puis le chargement contrôlé facultatif ; son résultat est un TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop ou xlswrsLoadError), et ResolveWithLoader renvoie également un TXLSWorkspaceLoadDiagnostic qui associe un TXLSWorkspaceLoadDiagnosticCode à un TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) pour distinguer les issues introuvable, erreur de chargement, résultat déconnecté, limite de profondeur ou de nombre de classeurs, réentrance d'identité, dépendance concurrente et conflit d'enregistrement. Le callback de chargement reçoit un TXLSWorkspaceLoadRequest (identité, profondeur, nombre d'enregistrements, limites) et répond par un TXLSWorkspaceLoadResponse
Recalculate signale un TXLSWorkspaceRecalcStatus, éventuellement accompagné d'une décomposition TXLSWorkspaceRecalcResult, et l'évaluateur enregistre la provenance de chaque cellule sous forme de TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache ou xlswrlError) afin que les diagnostics puissent distinguer une lecture connectée d'un repli sur le cache
L'adaptateur IXLSWorkspaceWorkbook expose EngineKind (type TXLSWorkspaceEngineKind : xlsweClassic, xlsweOpenXml ou xlsweOpenDocument), SourceIdentity, InstanceIdentity et Generation, teste la connexion avec IsConnected, lit une cellule via TryGetCellValue (renvoyant un TXLSWorkspaceCellStatus typé : valeur, manquante, référence invalide, déconnectée ou erreur, plus un indicateur hors plage utilisée), actualise le modèle avec Recalculate et se détache du modèle de classeur avec Disconnect
Le registre ajoute AddAlias pour des noms supplémentaires liés à une identité enregistrée, TryResolve comme variante de recherche sans exception, et BaseNameMatchCount pour prévisualiser combien d'enregistrements connectés partagent un nom de base avant de choisir une cible non ambiguë
Graphe de dépendances inter-classeurs
BuildDependencyGraph capture un instantané de tous les adaptateurs de classeurs enregistrés et extrait les nœuds de formules des modèles Classic XLS, XLSX et ODS dans un seul TXLSWorkspaceDepGraph ; la méthode renvoie False sans graphe partiel lorsqu'un adaptateur enregistré ne peut pas fournir les métadonnées de dépendance
- Chaque nœud de formule conserve son identité canonique de classeur, le nom et la position en base un de la feuille de calcul, la position de cellule en base zéro, le rectangle de sortie de formule matricielle, la volatilité et l'état des références non résolues
- Les références de cellules et de plages rectangulaires conservent les identités canoniques du classeur et de la feuille de calcul cibles ; les références de colonne entière, de ligne entière et de feuille entière restent un seul intervalle au lieu de s'étendre à des millions de cellules
- Les noms définis locaux restent interrogeables comme dépendances symboliques et s'étendent également à leurs dépendances concrètes de cellules ou de plages lorsque la définition peut être résolue statiquement
- Les noms définis externes préservent l'emplacement de lien externe, le nom déclaré, l'étendue facultative de feuille de calcul et l'identité canonique de la cible, sans traiter les métadonnées DDE, OLE ou de fonctions utilisateur comme des noms de classeur
FindDependentsOfCellet la construction des arêtes du graphe utilisent des arbres d'intervalles de lignes avec élagage par fin maximale ;LastRangeCandidateChecksetEdgeCandidateChecksexposent le nombre de vérifications exactes de rectangles pour la vérification des performances- L'extraction des formules s'exécute sous baux de lecture du classeur et ne balaye que les objets formules matérialisés, si bien que le stockage de valeurs compacté reste compacté et que la création du graphe ne modifie pas les générations du classeur
Recalcul planifié
Recalculate conserve le graphe partagé et ne le reconstruit que lorsque l'enregistrement de l'espace de travail ou la génération de dépendances de formules d'un classeur change ; les générations de valeurs amorcent une nouvelle passe sur les cellules dirty, et l'état dirty se propage le long des arêtes de dépendances inter-classeurs
var
RecalcInfo: TXLSWorkspaceRecalcResult;
Status: TXLSWorkspaceRecalcStatus;
begin
Status := Workspace.Recalculate(RecalcInfo);
if Status <> xlswrcOk then
HandleWorkspaceCalculation(Status, RecalcInfo);
end;
- Les composantes fortement connexes sont calculées sur les cellules de formules, si bien que des classeurs peuvent se lier dans les deux sens tout en restant acycliques lorsque leurs chemins de dépendances au niveau des cellules ne forment pas de boucle
- Les vrais membres de cycles et les descendants dirty bloqués par un cycle sont invalidés et exclus de l'ordre topologique, empêchant que des valeurs en cache périmées soient présentées comme des résultats valides
- Les références volatiles ou non résolues statiquement imposent le comportement dirty conservateur exigé pour la correction, tandis que les graphes stables réutilisent le travail de dépendances antérieur
- Les lectures externes au sein d'une passe utilisent un cache exact par instance de classeur, feuille de calcul, ligne et colonne ; une formule planifiée invalide sa plage de sortie avant évaluation afin que les dépendants ultérieurs observent la nouvelle valeur
- Le cache local à la passe n'accorde jamais d'autorité de ressource ; les classeurs enregistrés et le chargement facultativement contrôlé par l'appelant restent les seules sources de résolution connectées, suivies des caches de fichiers typés et de
#REF! TXLSWorkspaceRecalcResultexpose si le graphe a été reconstruit ainsi que les compteurs dirty, évaluées, invalidées, cycles, bloquées, succès et échecs de cache- Le statut distingue succès, adaptateurs non pris en charge, classeurs déconnectés, références circulaires, erreurs de calcul et mutation de l'espace de travail pendant la passe
- Les appels à
Recalculatesur un même espace de travail sont sérialisés, de sorte que deux sessions de calcul ne modifient jamais simultanément le graphe partagé ni les caches du classeur RemoveouClearpeut s'exécuter pendant qu'une passe est active ; la passe conserve des instantanés d'adaptateurs sûrs et renvoiexlswrcWorkspaceChangedau lieu de déréférencer un enregistrement supprimé- La destruction d'un espace de travail attend la fin de sa passe active, tandis que la destruction d'un classeur enregistré déconnecte son adaptateur et fait échouer sans risque les résolutions ultérieures
- Les échecs de chargement et les résultats introuvables restent en cache une seule fois par identité normalisée jusqu'à
ResetLoadAttempts, et un calcul échoué conserve l'état dirty local pour une nouvelle tentative explicite - Le graphe conservé rend une passe de suivi sans changement proportionnelle aux classeurs enregistrés plutôt qu'au nombre de formules ; l'analyse de composantes non récursive et les arêtes de plages compactes maintiennent les modèles profonds et larges bornés par les métadonnées de formules matérialisées
Détacher les noms définis externes
ConvertExternalDefinedNamesToRefErrors fournit la même opération publique sur TXLSWorkbook et TXLSXWorkbook ; elle renvoie le nombre de définitions d'étendue classeur et d'étendue feuille de calcul remplacées par des #REF! natifs
var Converted: Integer; begin Converted := Workbook.ConvertExternalDefinedNamesToRefErrors; // External-link parts and ordinary cell formulas remain intact end;
- La sélection en XLS classique utilise des tokens de référence BIFF compilés et l'identité XTI du classeur de prise en charge, de sorte que les références tridimensionnelles au sein d'un même classeur et les flux de tokens incertains restent inchangés
- La sélection en XLSX utilise des emplacements numériques de classeurs sensibles à la syntaxe dans l'ordre du document de relations et n'accepte que les parties de liens externes de classeur, à l'exclusion de DDE, OLE, des emplacements non résolus, des références de tables et du texte entre crochets dans les chaînes
- Tous les remplacements sont préparés avant la première mutation et validés comme une seule opération d'écriture ; un second appel est idempotent
- Le texte du nom, l'étendue classeur ou feuille de calcul, la visibilité, les commentaires, les flags macro et intégrés, les attributs XLSX inconnus et le répertoire de liens externes restent disponibles après la conversion et l'aller-retour
- Les définitions malformées ou non prises en charge restent préservées octet par octet ou au niveau du texte lorsque c'est possible et ajoutent des diagnostics
xlsDiagnosticDefinedNameConversionSkippedau lieu d'être devinées - Les formules dépendantes se recalculent vers la valeur d'erreur Excel correspondante, tandis qu'un résultat en cache valide pour une formule externe directe ordinaire reste disponible si son classeur connecté se déconnecte ultérieurement
- L'opération est spécifique à Excel et ne réinterprète pas la sémantique des formules de noms OpenDocument
Références externes XLS classique
Dans les classeurs XLS classiques, les liens externes sont stockés dans le bloc de répertoire global à l'aide d'enregistrements EXTERNALBOOK et EXTERNNAME ; HotXLS maintient ces répertoires durant les cycles de lecture/écriture de fichier, garantissant que les références de plage distantes survivent aux boucles de modification
Relations externes XLSX
Pour les classeurs OOXML, le mappage des liens externes est géré via des parties de relation ; consultez les détails des interfaces de prise en charge ci-dessous
- Classe TXLSXExternalLinks — API pour lister et mettre à jour les liens externes de la feuille de calcul
- Interface IXLSWorkbook — Propriétés de classeur de niveau supérieur
- Propriété IXLSRange.Formula — Lire et écrire des formules inter-classeurs