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
ResolvexlswrsConflict Addavvisar kollisioner på exakt nyckel, alias och dubletter av arbetsböcker; olika fullständiga sökvägar och olika filändelser kan samexisteraRemoveochClearå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 ärnil, 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 ochMaxWorkbookCountsom 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
FindDependentsOfCelloch grafens kantkonstruktion använder radintervallträd med beskärning på största ändpunkt;LastRangeCandidateChecksochEdgeCandidateChecksexponerar 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! TXLSWorkspaceRecalcResultexponerar 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
Recalculatepå samma arbetsyta serialiseras, så att två beräkningssessioner aldrig samtidigt ändrar den gemensamma grafen eller arbetsbokscacherna RemoveellerClearkan köras medan ett pass pågår; passet behåller säkra adapterögonblicksbilder och returnerarxlswrcWorkspaceChangedi 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
- Klassen TXLSXExternalLinks — API för att lista och uppdatera externa kalkylbladslänkar
- Gränssnittet IXLSWorkbook — Arbetsboksegenskaper på översta nivån
- Egenskapen IXLSRange.Formula — Läs och skriv formler över arbetsböcker