HotXLS Docs

Externe werkmapverwijzingen

Overzicht

Werkbladmodellen halen vaak gegevens uit secundaire werkmappen met behulp van kruisverwijzingsformules; HotXLS ondersteunt het parseren, schrijven en behouden van externe werkmapverwijzingen in zowel BIFF8 (klassiek XLS)- als OpenXML (XLSX)-documenten

Werkruimte voor live werkmappen

TXLSWorkbookWorkspace in lxWorkbookWorkspace is de gedeelde identiteits- en registratiekern voor live externe werkmappen; zowel TXLSWorkbook als TXLSXWorkbook bieden CreateWorkspaceWorkbook aan en hebben een ExternalWorkspace die door hun formule-evaluators wordt gebruikt, terwijl een ODS-werkmap die via TXLSXWorkbook wordt geopend via dezelfde adapter het OpenDocument-enginetype meldt

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;

Klassieke werkmappen gebruiken dezelfde compatibiliteitsmethoden met TXLSWorkbook-doelen; RegisterExternalWorkbook en UnregisterExternalWorkbook beheren alleen de naamtoewijzing op facadeniveau, terwijl ExternalWorkspace.Remove en Clear de werkruimteregistraties zelf intrekken. Aanroepers die engines combineren voegen elke Classic-, XLSX- of ODS-adapter rechtstreeks toe aan ExternalWorkspace

  • Normalisatie van identiteiten is lexicaal en hoofdletterongevoelig, behoudt paden en extensies, lost relatieve doelen op tegen de bronidentiteit van de eigenaar, verwijdert puntsegmenten en voert geen bestands- of netwerktoegang uit
  • Exacte identiteiten en expliciete aliassen krijgen voorrang; zoeken op alleen de bestandsnaam slaagt alleen als precies één verbonden registratie matcht, anders geeft Resolve xlswrsConflict terug
  • Add wijst botsingen met een bestaande exacte sleutel, alias of werkmap af; verschillende volledige paden en verschillende extensies kunnen naast elkaar bestaan
  • Remove en Clear trekken registraties in, terwijl het direct vrijgeven van een Classic- of XLSX-doel de adapter loskoppelt en op actieve lezers wacht voordat het model wordt vrijgegeven
  • Externe werkbladen worden eerst op hun opgegeven naam opgelost en pas daarna op de één-gebaseerde positie, zodat de werkbladvolgorde van de doelwerkmap niet hoeft overeen te komen met de koppelingsmap van de bron
  • De formule-evaluator leest eerst een opgeloste live werkmap en valt daarna terug op de getypeerde cache van het hostbestand; Classic XLS-hosts decoderen schaarse XCT- en CRN-waarden, terwijl XLSX-hosts de externe-koppelingscache gebruiken die het pakketmodel al vasthoudt
  • OnLoadWorkbook is een optionele, gecontroleerde resourceaanvraag; de standaardwaarde is nil, dus herberekening voert nog steeds geen bestands- of netwerktoegang uit tenzij applicatiecode dat beleid expliciet aanlevert
  • Elke genormaliseerde identiteit roept de loader maximaal één keer aan tot ResetLoadAttempts; gelijktijdige top-level aanvragen delen het lopende resultaat, inclusief getypeerde niet-gevonden- en foutuitkomsten, in plaats van dezelfde resource herhaaldelijk te openen
  • MaxLoadDepth staat standaard op 16 en MaxWorkbookCount op 64; herintreding met dezelfde identiteit, geneste afhankelijkheden van een identiteit die al in behandeling is, uitgeputte diepte en een uitgeput werkmapaantal leveren getypeerde diagnostiek op zonder een laadcyclus te blokkeren
  • ODF-IRI's van externe bronnen blijven volledige lexicale identiteiten, inclusief URI-schema's en gequote tekens, maar authoriseren nooit impliciete bestands- of netwerktoegang
  • Een identiteitsconflict blijft #REF!, zodat verouderde cachedata dubbelzinnige routing niet kunnen verhullen; een ontbrekende gecachte cel is alleen een lege waarde als het bestand een geldige cache voor dat werkblad declareert

Resolve doet eerst de geregistreerde opzoeking en daarna de optionele gecontroleerde load; de uitkomst is een TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop of xlswrsLoadError), en ResolveWithLoader geeft bovendien een TXLSWorkspaceLoadDiagnostic terug die een TXLSWorkspaceLoadDiagnosticCode koppelt aan een TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) om niet gevonden, loaderfout, verbroken resultaat, diepte- of werkmaplimiet, herintreding van een identiteit, gelijktijdige afhankelijkheid en registratieconflict van elkaar te onderscheiden. De loader-callback ontvangt een TXLSWorkspaceLoadRequest (identiteit, diepte, geregistreerd aantal, limieten) en antwoordt met een TXLSWorkspaceLoadResponse

Recalculate meldt een TXLSWorkspaceRecalcStatus, optioneel met een TXLSWorkspaceRecalcResult-uitsplitsing, en de evaluator legt de herkomst per cel vast als een TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache of xlswrlError), zodat diagnostiek een live lezing van een cache-fallback kan onderscheiden

De IXLSWorkspaceWorkbook-adapter legt EngineKind (type TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml of xlsweOpenDocument), SourceIdentity, InstanceIdentity en Generation bloot, toetst of de verbinding leeft met IsConnected, leest één cel via TryGetCellValue (met een getypeerde TXLSWorkspaceCellStatus: waarde, ontbreekt, ongeldige verwijzing, verbroken of fout, plus een vlag voor buiten het gebruikte bereik), ververst het model met Recalculate en ontkoppelt met Disconnect van het werkmapmodel

Het register voegt AddAlias toe voor extra namen die aan één geregistreerde identiteit hangen, TryResolve als uitzonderingsvrije opzoekvariant en BaseNameMatchCount om vooraf te zien hoeveel verbonden registraties dezelfde bestandsnaam delen voordat je een eenduidig doel kiest

Afhankelijkheidsgrafiek tussen werkmappen

BuildDependencyGraph maakt een momentopname van elke geregistreerde werkmapadapter en haalt formuleknooppunten uit Classic XLS-, XLSX- en ODS-modellen samen naar één TXLSWorkspaceDepGraph; de methode geeft False terug en geen gedeeltelijke grafiek zodra een geregistreerde adapter geen afhankelijkheidsmetadata kan aanleveren

  • Elk formuleknooppunt houdt zijn canonieke werkmapidentiteit, werkbladnaam en één-gebaseerde werkbladpositie, nul-gebaseerde celpositie, matrixuitvoerrechthoek, volatiliteit en de status van onopgeloste verwijzingen vast
  • Verwijzingen naar cellen en rechthoekige bereiken behouden canonieke doelwerkmap- en werkbladidentiteiten; verwijzingen naar volledige kolommen, rijen en werkbladen blijven één interval in plaats van uit te dijen tot miljoenen cellen
  • Lokale gedefinieerde namen blijven als symbolische afhankelijkheden opvraagbaar en worden bovendien omgezet naar hun concrete cel- of bereikafhankelijkheden zodra de definitie statisch op te lossen is
  • Externe gedefinieerde namen behouden de externe-koppelingssleuf, de opgegeven naam, de optionele werkbladscope en de canonieke doelidentiteit, zonder DDE-, OLE- of gebruikersfunctiemetadata als werkmapnamen te behandelen
  • FindDependentsOfCell en de opbouw van grafiekranden gebruiken rij-intervalbomen met maximum-end-pruning; LastRangeCandidateChecks en EdgeCandidateChecks leggen het aantal exacte rechthoekcontroles bloot voor prestatieverificatie
  • Formule-extractie draait onder werkmapleesleases en scant alleen gerealiseerde formuleobjecten, zodat verpakte waardeopslag verpakt blijft en het aanmaken van de grafiek werkmapgeneraties niet verandert

Geplande herberekening

Recalculate houdt de gedeelde grafiek vast en bouwt hem alleen opnieuw wanneer de werkruimteregistratie of de formuleafhankelijkheidsgeneratie van een werkmap verandert; waardegeneraties starten een nieuwe dirty-pass en de dirty-status loopt via de afhankelijke randen tussen werkmappen door

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • Sterk samenhangende componenten worden op formulecellen berekend, zodat werkmappen in beide richtingen kunnen koppelen maar acyclisch blijven zolang hun afhankelijkheidspaden op celniveau geen lus vormen
  • Echte cyclusleden en dirty-afstammelingen die door een cyclus worden geblokkeerd, worden ongeldig verklaard en uit de topologische volgorde gehouden, zodat verouderde cachewaarden niet als geslaagde resultaten worden gepresenteerd
  • Volatiele of statisch onopgeloste verwijzingen dwingen het conservatieve dirty-gedrag af dat correctheid vereist, terwijl stabiele grafieken eerder afhankelijkheidswerk hergebruiken
  • Externe lezingen binnen een pass gebruiken een exacte cache op werkmapexemplaar-, werkblad-, rij- en kolomniveau; een geplande formule maakt zijn uitvoerbereik ongeldig vóór de evaluatie, zodat latere afhankelijken de nieuwe waarde te zien krijgen
  • De pass-lokale cache verleent nooit resource-autoriteit; geregistreerde werkmappen en de optionele, door de aanroeper gestuurde loader blijven de enige live-resolutiebronnen, gevolgd door getypeerde bestandscaches en #REF!
  • TXLSWorkspaceRecalcResult legt bloot of de grafiek opnieuw is opgebouwd, plus aantallen voor dirty, geëvalueerd, ongeldig verklaard, cyclus, geblokkeerd, cache-hit en cache-miss
  • De status onderscheidt succes, niet-ondersteunde adapters, verbroken werkmappen, kringverwijzingen, rekenfouten en mutatie van de werkruimte tijdens de pass
  • Aanroepen van Recalculate op dezelfde werkruimte worden geserialiseerd, dus twee calculatiesessies wijzigen de gedeelde grafiek of werkmapcaches nooit tegelijk
  • Remove of Clear kan draaien terwijl een pass actief is; de pass houdt veilige adaptermomentopnames vast en geeft xlswrcWorkspaceChanged terug in plaats van een verwijderde registratie te dereferentiëren
  • Het vrijgeven van een werkruimte wacht tot de actieve pass klaar is, terwijl het vrijgeven van een geregistreerde werkmap de adapter loskoppelt en latere resolutie veilig laat falen
  • Loaderfouten en niet-gevonden-resultaten blijven per genormaliseerde identiteit één keer gecacht tot ResetLoadAttempts, en een mislukte berekening houdt de lokale dirty-status vast voor een expliciete herpoging
  • De vastgehouden grafiek maakt een ongewijzigde vervolgpass evenredig aan het aantal geregistreerde werkmappen in plaats van het aantal formules; niet-recursieve componentanalyse en compacte bereikranden houden diepe en brede modellen begrensd op gerealiseerde formulemetadata

Externe gedefinieerde namen ontkoppelen

ConvertExternalDefinedNamesToRefErrors biedt dezelfde openbare bewerking op TXLSWorkbook en TXLSXWorkbook; hij geeft het aantal definities op werkmap- en werkbladniveau terug dat is vervangen door native #REF!

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • Selectie in Classic XLS gebruikt gecompileerde BIFF-verwijzingstokens en de XTI-identiteit van de ondersteunende werkmap, dus driedimensionale verwijzingen binnen dezelfde werkmap en onzekere tokenstromen blijven ongewijzigd
  • Selectie in XLSX gebruikt syntaxbewuste numerieke werkmapsleuven in documentvolgorde van de relaties en accepteert alleen externe-koppelingsonderdelen van de werkmap, met uitsluiting van DDE, OLE, onopgeloste sleuven, tabelverwijzingen en haakjestekst in tekenreeksen
  • Alle vervangingen worden vóór de eerste mutatie voorbereid en als één schrijfbewerking vastgelegd; een tweede aanroep is idempotent
  • Naamtekst, werkmap- of werkbladscope, zichtbaarheid, opmerkingen, macro- en ingebouwde vlaggen, onbekende XLSX-attributen en de externe-koppelingsdirectory blijven na conversie en roundtrip beschikbaar
  • Misvormde en niet-ondersteunde definities blijven waar mogelijk byte- of tekstbehoudend en leveren xlsDiagnosticDefinedNameConversionSkipped-diagnostiek op in plaats van dat er wordt gegokt
  • Afhankelijke formules herberekenen naar de bijbehorende Excel-foutwaarde, terwijl een geldig gecacht resultaat voor een gewone directe externe formule beschikbaar blijft als de live werkmap later de verbinding verliest
  • De bewerking is Excel-specifiek en herinterpreteert de naam-formule-semantiek van OpenDocument niet

Externe verwijzingen in klassiek XLS

In klassieke XLS-werkmappen worden externe koppelingen opgeslagen in het globale directoryblok met behulp van EXTERNALBOOK- en EXTERNNAME-records; HotXLS behoudt deze directory's tijdens lees-/schrijfcycli van bestanden, zodat verwijzingen naar bereiken op afstand wijzigingslussen overleven

Externe relaties in XLSX

Voor OOXML-werkmappen wordt de toewijzing van externe koppelingen beheerd via relatieonderdelen; raadpleeg de ondersteunende interfacedetails hieronder