HotXLS-dokumentation

Externa arbetsboksreferenser

Översikt

Kalkylbladsmodeller hämtar ofta data från sekundära arbetsböcker via korsreferensformler; HotXLS stöder tolkning, skrivning och bevarande av externa arbetsboksreferenser i både BIFF8 (klassisk XLS)- och OpenXML (XLSX)-dokument

Arbetsyta för aktiva arbetsböcker

TXLSWorkbookWorkspace i lxWorkbookWorkspace är den gemensamma identitets- och registreringskärnan för aktiva externa arbetsböcker; både TXLSWorkbook och TXLSXWorkbook exponerar CreateWorkspaceWorkbook och äger en ExternalWorkspace som deras formelutvärderare använder, medan en ODS-arbetsbok som öppnas via TXLSXWorkbook rapporterar motortypen OpenDocument genom samma adapter

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;

Klassiska arbetsböcker använder samma kompatibilitetsmetoder med TXLSWorkbook-mål; RegisterExternalWorkbook och UnregisterExternalWorkbook hanterar bara namnmappningen på facadenivå, medan ExternalWorkspace.Remove och Clear återkallar själva arbetsyteregistreringarna. Anropare över motorer lägger till valfri Classic-, XLSX- eller ODS-adapter direkt i ExternalWorkspace

  • Identitetsnormaliseringen är lexikal och skiljer inte på versaler och gemener, bevarar sökvägar och filändelser, löser relativa mål mot ägarens källidentitet, kollapsar dot-segment och gör ingen filsystems- eller nätverksåtkomst
  • Exakta identiteter och explicita alias matchas först; uppslag på enbart basnamn lyckas bara när exakt en ansluten registrering matchar, annars returnerar Resolve xlswrsConflict
  • Add avvisar kollisioner på exakt nyckel, alias och dubletter av arbetsböcker; olika fullständiga sökvägar och olika filändelser kan samexistera
  • Remove och Clear återkallar registreringar, medan att en Classic- eller XLSX-målinstans förstörs direkt kopplar ifrån dess adapter och väntar på aktiva läsare innan modellen släpps
  • Externa kalkylblad matchas mot deklarerat namn före den ettbaserade positionella fallbacken, så bladordningen i målarbetsboken behöver inte motsvara källans länkkatalog
  • Formelutvärderaren läser först en matchad aktiv arbetsbok och faller sedan tillbaka på värdfilens typade cache; Classic XLS-värdar avkodar glest lagrade XCT- och CRN-värden, medan XLSX-värdar använder den externlänkscache som paketmodellen redan håller
  • OnLoadWorkbook är en valfri, styrd resursförfrågan; dess standardvärde är nil, så omberäkning gör fortfarande ingen filsystems- eller nätverksåtkomst om inte programkoden uttryckligen tillhandahåller den policyn
  • Varje normaliserad identitet anropar loadern högst en gång tills ResetLoadAttempts; samtidiga toppnivåförfrågningar delar det pågående resultatet, inklusive typade not found- och felutfall, i stället för att öppna samma resurs upprepade gånger
  • MaxLoadDepth är som standard 16 och MaxWorkbookCount som standard 64; återinträde med samma identitet, nästlade beroenden till en identitet som redan är på gång, uttömd djupgräns och uttömd arbetsboksräknare returnerar typad diagnostik utan att blockera i en inläsningscykel
  • ODF:s externa käll-IRI:er förblir fullständiga lexikala identiteter, inklusive URI-scheman och citattecken, men auktoriserar aldrig implicit fil- eller nätverksåtkomst
  • En identitetskonflikt förblir #REF! så att inaktuell cached data inte kan dölja tvetydig dirigering; en saknad cachad cell är ett tomt värde bara när filen deklarerar en giltig cache för det bladet

Resolve gör registrerad uppslagning och därefter den valfria styrda inläsningen; utfallet är en TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop eller xlswrsLoadError), och ResolveWithLoader returnerar dessutom en TXLSWorkspaceLoadDiagnostic som parar en TXLSWorkspaceLoadDiagnosticCode med en TXLSWorkspaceLoadResponseStatus (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) för att skilja på utfallen not found, loader-fel, frånkopplat resultat, djup- eller arbetsboksgräns, identitetsåterinträde, samtidigt beroende och registreringskonflikt. Loader-återanropet tar emot en TXLSWorkspaceLoadRequest (identitet, djup, antal registrerade, gränser) och svarar med en TXLSWorkspaceLoadResponse

Recalculate rapporterar en TXLSWorkspaceRecalcStatus, valfritt med en uppdelning i TXLSWorkspaceRecalcResult, och utvärderaren registrerar ursprunget per cell som en TXLSWorkspaceRuntimeLookup (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache eller xlswrlError) så att diagnostiken kan skilja en aktiv läsning från en cachad fallback

Adaptern IXLSWorkspaceWorkbook exponerar EngineKind (typ TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml eller xlsweOpenDocument), SourceIdentity, InstanceIdentity och Generation, testar livlighet med IsConnected, läser en cell via TryGetCellValue (returnerar en typad TXLSWorkspaceCellStatus med värde, saknas, ogiltig referens, frånkopplad eller fel, plus flagga för utanför använt område), uppdaterar modellen med Recalculate och kopplar ifrån arbetsboksmodellen med Disconnect

Registret lägger till AddAlias för extra namn bundna till en registrerad identitet, TryResolve som den undantagsfria uppslagsvarianten, och BaseNameMatchCount för att förhandsgranska hur många anslutna registreringar som delar ett basnamn innan ett entydigt mål väljs

Beroendegraf mellan arbetsböcker

BuildDependencyGraph tar ögonblicksbilder av alla registrerade arbetsboksadapterer och extraherar formelnoder från Classic XLS-, XLSX- och ODS-modeller till en gemensam TXLSWorkspaceDepGraph; metoden returnerar False och ingen partiell graf när någon registrerad adapter inte kan tillhandahålla beroendemetadata

  • Varje formelnod behåller sin kanoniska arbetsboksidentitet, bladnamn och ettbaserade bladposition, nollbaserad cellposition, utmatningsrektangel för matrisformler, volatilitet och tillstånd för olösta referenser
  • Cell- och rektangulära områdesreferenser behåller kanoniska mål- och bladidentiteter; helkolumns-, helrads- och helbladsreferenser förblir ett intervall i stället för att expandera till miljontals celler
  • Lokala definierade namn förblir frågbara som symboliska beroenden och expanderar också till sina konkreta cell- eller områdesberoenden när definitionen kan lösas upp statiskt
  • Externa definierade namn bevarar externlänksplatsen, det deklarerade namnet, valfritt kalkylbladsomfång och kanonisk målidentitet, utan att behandla DDE-, OLE- eller användarfunktionsmetadata som arbetsboksnamn
  • FindDependentsOfCell och grafens kantkonstruktion använder radintervallträd med beskärning på största ändpunkt; LastRangeCandidateChecks och EdgeCandidateChecks exponerar antalet exakta rektangelkontroller för prestandaverifiering
  • Formelextraktionen körs under arbetsbokens läslån och skannar bara materialiserade formelobjekt, så den packade värdeslagringen förblir packad och grafskapandet ändrar inte arbetsboksgenerationerna

Schemalagd omberäkning

Recalculate behåller den gemensamma grafen och bygger om den bara när arbetsyteregistreringen eller en arbetsboks formelberoendegeneration ändras; värdegenerationer startar ett nytt dirty-pass, och dirty-statusen propagerar genom de beroendekanter som går mellan arbetsböcker

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • Starkt sammanhängande komponenter beräknas på formelceller, så arbetsböcker kan länka i båda riktningarna och ändå förblir cyklfria när deras beroendevägar på cellnivå inte bildar en loop
  • Verkliga cykelmedlemmar och dirty-efterföljare som blockeras av en cykel ogiltigförklaras och utesluts ur den topologiska ordningen, så att inaktuella cachade värden inte presenteras som lyckade resultat
  • Volatila eller statiskt olösta referenser tvingar fram det konservativa dirty-beteende som krävs för korrekthet, medan stabila grafer återanvänder tidigare beroendearbete
  • Externa läsningar inom ett pass använder en exakt cache per arbetsboksinstans, kalkylblad, rad och kolumn; en schemalagd formel ogiltigförklarar sitt utdataområde före utvärderingen så att senare beroenden ser det nya värdet
  • Passets lokala cache ger aldrig resursauktoritet; registrerade arbetsböcker och den valfria anroparstyrda loadern förblir de enda aktiva uppslagskällorna, följt av typade filcachar och #REF!
  • TXLSWorkspaceRecalcResult exponerar huruvida grafen byggdes om plus räknarna för dirty, utvärderade, ogiltigförklarade, cykler, blockerade, cache-träffar och cache-missar
  • Statusen skiljer på framgång, adapterer som inte stöds, frånkopplade arbetsböcker, cirkulära referenser, beräkningsfel och arbetsytemutation under passet
  • Anrop till Recalculate på samma arbetsyta serialiseras, så att två beräkningssessioner aldrig samtidigt ändrar den gemensamma grafen eller arbetsbokscacherna
  • Remove eller Clear kan köras medan ett pass pågår; passet behåller säkra adapterögonblicksbilder och returnerar xlswrcWorkspaceChanged i stället för att avreferera en borttagen registrering
  • Förstörs en arbetsyta väntar den på att sitt aktiva pass ska avslutas, medan förstörelse av en registrerad arbetsbok kopplar ifrån dess adapter och får senare uppslagning att misslyckas säkert
  • Loader-fel och not found-utfall ligger kvar i cachen en gång per normaliserad identitet tills ResetLoadAttempts, och en misslyckad beräkning behåller lokal dirty-status för ett explicit nytt försök
  • Den kvarhållna grafen gör ett oförändrat uppföljningspass proportionellt mot antalet registrerade arbetsböcker i stället för formelantalet; icke-rekursiv komponentanalys och kompakta områdeskanter håller djupa och breda modeller avgränsade av materialiserad formelmetadata

Koppla bort externa definierade namn

ConvertExternalDefinedNamesToRefErrors erbjuder samma offentliga åtgärd på TXLSWorkbook och TXLSXWorkbook; den returnerar antalet arbetsboks- och kalkylbladsomfattade definitioner som ersatts med inbyggda #REF!

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • Urvalet i Classic XLS använder kompilerade BIFF-referenstokens och XTI-identiteten för stödarbetsboken, så tredimensionella referenser inom samma arbetsbok och osäkra tokenströmmar lämnas oförändrade
  • Urvalet i XLSX använder syntaktiskt medvetna numeriska arbetsboksplatser i relationsdokumentens ordning och accepterar bara arbetsbokens externlänkdelar, exklusive DDE, OLE, olösta platser, tabellreferenser och klammertext inuti strängar
  • Alla ersättningar förbereds före den första mutationen och verkställs som en enda skrivoperation; ett andra anrop är idempotent
  • Namntext, arbetsboks- eller kalkylbladsomfång, synlighet, kommentarer, makro- och inbyggd-flaggor, okända XLSX-attribut och externlänkskatalogen förblir tillgängliga efter konvertering och roundtrip
  • Felformade definitioner och sådana som inte stöds hålls byte- eller textbevarande där det är möjligt och ger xlsDiagnosticDefinedNameConversionSkipped-diagnostik i stället för att gissas
  • Beroende formler räknas om till motsvarande Excel-felvärde, medan ett giltigt cachat resultat för en vanlig direkt extern formel förblir tillgängligt om dess aktiva arbetsbok kopplas ifrån senare
  • Åtgärden är Excel-specifik och tolkar inte om OpenDocuments namnformelsemantik

Klassiska XLS-externa referenser

I klassiska XLS-arbetsböcker lagras externa länkar i det globala katalogblocket via EXTERNALBOOK- och EXTERNNAME-poster; HotXLS bevarar dessa kataloger under filens läs-/skrivcykler och säkerställer att fjärrområdesreferenser överlever ändringsloopar

Externa XLSX-relationer

För OOXML-arbetsböcker hanteras mappning av externa länkar via relationsdelar; se de stödjande gränssnittsdetaljerna nedan