HotXLS-dokumentaatio

Ulkoiset työkirjaviittaukset

Yleiskatsaus

Taulukkomallit keräävät usein tietoja toissijaisista työkirjoista ristiviittauskaavojen avulla; HotXLS tukee ulkoisten työkirjaviittausten jäsentämistä, kirjoittamista ja säilyttämistä sekä BIFF8 (klassinen XLS)- että OpenXML (XLSX) -asiakirjoissa

Elävä työkirjatyötila

TXLSWorkbookWorkspace yksikössä lxWorkbookWorkspace on elävien ulkoisten työkirjojen yhteinen identiteetti- ja rekisteröintiydin; sekä TXLSWorkbook että TXLSXWorkbook tarjoavat CreateWorkspaceWorkbook-metodin ja omistavat ExternalWorkspace-työtilan, jota niiden kaavojen evaluointi käyttää, kun taas TXLSXWorkbook kautta avattava ODS-työkirja ilmoittaa OpenDocument-moottorityypin saman adapterin kautta

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;

Klassiset työkirjat käyttävät samoja yhteensopivuusmetodeja TXLSWorkbook-kohteilla; RegisterExternalWorkbook ja UnregisterExternalWorkbook hallitsevat vain fasaditason nimimappingia, kun taas ExternalWorkspace.Remove ja Clear mitätöivät itse työtilarekisteröinnit. Moottoriylittävät kutsujat lisäävät minkä tahansa Classic-, XLSX- tai ODS-adapterin suoraan ExternalWorkspace-työtilaan

  • Identiteettien normalisointi on leksikaalista ja kirjainkokoriippumatonta: se säilyttää polut ja tiedostopäätteet, ratkaisee suhteelliset kohteet omistajan lähdeidentiteetin perusteella, yhdistää pistesegmentit eikä tee mitään tiedostojärjestelmä- tai verkkokutsuja
  • Tarkat identiteetit ja eksplisiittiset aliakset ratkaistaan ensin; pelkällä perusnimellä tehty haku onnistuu vain, kun täsmälleen yksi yhdistetty rekisteröinti täsmää, muuten Resolve palauttaa xlswrsConflict-tilan
  • Add hylkää tarkan avaimen, aliaksen ja kaksoistyökirjan törmäykset; eri kokoiset polut ja eri tiedostopäätteet voivat elää rinnakkain
  • Remove ja Clear mitätöivät rekisteröinnit, kun taas klassisen tai XLSX-kohteen suora tuhoaminen katkaisee sen adapterin ja odottaa aktiivisia lukijoita ennen mallin vapauttamista
  • Ulkoiset laskentataulukot ratkaistaan ilmoitetun nimen perusteella ennen yksiin perustuvaa sijaintipohjaista varakeinoa, joten kohdetyökirjan taulukoiden järjestyksen ei tarvitse vastata lähdelinkkien hakemistoa
  • Kaavojen evaluator lukee ensin ratkaistun elävän työkirjan ja siirtyy sitten isäntätiedoston tyypitettyyn välimuistiin; klassiset XLS-isännät purkavat harvoja XCT- ja CRN-arvoja, kun taas XLSX-isännät käyttävät pakettimallin jo hallussaan pitämää ulkoisten linkkien välimuistia
  • OnLoadWorkbook on valinnainen, hallittu resurssipyyntö; sen oletusarvo on nil, joten uudelleenlaskenta ei edelleenkään käytä tiedostojärjestelmää tai verkkoa, ellei sovelluskoodi eksplisiittisesti tarjoa kyseistä käytäntöä
  • Jokainen normalisoitu identiteetti kutsuu loaderia korkeintaan kerran ResetLoadAttempts-kutsuun asti; samanaikaiset ylätason pyynnöt jakavat keskenään meneillään olevan tuloksen, mukaan lukien tyypitetyt ei-löytynyt- ja virhetulokset, sen sijaan että avaisivat saman resurssin toistuvasti
  • MaxLoadDepth on oletuksena 16 ja MaxWorkbookCount 64; saman identiteetin uudelleensisääntulo, sisäkkäiset riippuvuudet jo käsittelyssä olevaan identiteettiin, syvyyden loppuminen ja työkirjamäärän loppuminen palauttavat tyypitetyt diagnostiikat ilman lataussyklin lukitsemista
  • ODF:n ulkoisten lähteiden IRI:t säilyvät täydellisinä leksikaalisina identiteetteinä, mukaan lukien URI-skeemat ja lainatut merkit, mutta ne eivät koskaan valtuuta implisiittiä tiedosto- tai verkkokäyttöä
  • Identiteettiristiriita pysyy #REF!-virheenä, jotta vanhentunut välimuistidata ei voi peittää monitulkainta reititystä; puuttuva välimuistissa oleva solu on tyhjä arvo vain, kun tiedosto ilmoittaa kyseiselle laskentataulukolle kelvollisen välimuistin

Resolve suorittaa rekisteröidyn haun ja sen jälkeen valinnaisen hallitun latauksen; sen tulos on TXLSWorkspaceResolveStatus (xlswrsResolved, xlswrsNotFound, xlswrsConflict, xlswrsDisconnected, xlswrsLoadNotFound, xlswrsLoadLimit, xlswrsLoadLoop tai xlswrsLoadError), ja ResolveWithLoader palauttaa lisäksi TXLSWorkspaceLoadDiagnostic-tuloksen, joka yhdistää TXLSWorkspaceLoadDiagnosticCode- ja TXLSWorkspaceLoadResponseStatus-arvot (xlswlrsNotFound, xlswlrsResolved, xlswlrsError) erottaakseen ei-löytynyt-, loader-virhe-, katkaistu-, syvyys- tai työkirjaraja-, identiteetin uudelleensisääntulo- ja rekisteröintiristiriitatulokset. Loaderin takaisinkutsu vastaanottaa TXLSWorkspaceLoadRequest-pyynnön (identiteetti, syvyys, rekisteröityjen määrä, rajat) ja vastaa TXLSWorkspaceLoadResponse-vastauksella

Recalculate raportoi TXLSWorkspaceRecalcStatus-tilan, valinnaisesti TXLSWorkspaceRecalcResult-erittelyllä, ja evaluator kirjaa solukohtaisen alkuperän TXLSWorkspaceRuntimeLookup-tietueena (xlswrlInactive, xlswrlResolved, xlswrlFallbackCache tai xlswrlError), joten diagnostiikka erottaa suoraan työkirjasta tehdyn lukeman välimuistista poimitusta varakeinosta

IXLSWorkspaceWorkbook-adapteri paljastaa EngineKind-jäsenen (tyyppi TXLSWorkspaceEngineKind: xlsweClassic, xlsweOpenXml tai xlsweOpenDocument) sekä SourceIdentity-, InstanceIdentity- ja Generation-jäsenet, testaa elävyyden IsConnected-metodilla, lukee yhden solun TryGetCellValue-metodilla (palauttaen tyypitetyn TXLSWorkspaceCellStatus-tilan: arvo, puuttuva, virheellinen viittaus, katkaistu tai virhe sekä used-rangen ulkopuolella -lippu), virkistää mallin Recalculate-metodilla ja irrottaa työkirjamallista Disconnect-metodilla

Rekisteri lisää AddAlias-metodin lisänimille, jotka sidotaan yhteen rekisteröityyn identiteettiin, TryResolve-variantin poikkeuksettomana hakutapana ja BaseNameMatchCount-jäsenen, jolla voi ennalta tarkistaa, kuinka moni yhdistetty rekisteröinti jakaa saman perusnimen ennen yksiselitteisen kohteen valintaa

Työkirjojen välinen riippuvuusgraafi

BuildDependencyGraph ottaa tilannekuvan jokaisesta rekisteröidystä työkirjaadapterista ja poimii kaavasolmut Classic XLS-, XLSX- ja ODS-malleista yhdeksi TXLSWorkspaceDepGraph-graafiksi; metodi palauttaa arvon False eikä tuota osittaista graafia, jos jokin rekisteröity adapteri ei pysty tarjoamaan riippuvuusmetatietoja

  • Jokainen kaavasolmu säilyttää kanonisen työkirjaidentiteetin, laskentataulukon nimen ja yksiin perustuvan taulukkosijainnin, nollapohjaisen solusijainnin, taulukkotuloston suorakulmion, volatiliteetin ja ratkaisemattoman viittauksen tilan
  • Solu- ja suorakulmaisten alueiden viittaukset säilyttävät kanoniset kohdetyökirjan ja laskentataulukon identiteetit; kokonaisen sarakkeen, kokonaisen rivin ja kokonaisen taulukon viittaukset pysyvät yhtenä välinä eivätkä laajene miljooniksi soluiksi
  • Paikalliset määritellyt nimet pysyvät kyseltävinä symbolisina riippuvuuksina ja laajenevat lisäksi konkreettisiksi solu- tai alueriippuvuuksiksi, kun määrittelyn voi ratkaista staattisesti
  • Ulkoiset määritellyt nimet säilyttävät ulkoisen linkin paikan (slot), ilmoitetun nimen, valinnaisen laskentataulukon laajuuden ja kanonisen kohdeidentiteetin käsittelemättä DDE-, OLE- tai käyttäjäfunktio-metadataa työkirjoina
  • FindDependentsOfCell ja graafin särmien rakentaminen käyttävät rivivälipuita maksimipääkarsinnalla; LastRangeCandidateChecks ja EdgeCandidateChecks paljastavat tarkkojen suorakulmotarkistusten määrän suorituskyvyn varmistamista varten
  • Kaavojen poiminta tapahtuu työkirjan lukuleasejen alla ja skannaa vain materialisoidut kaavaobjektit, joten pakattu arvotallennus pysyy pakattuna eikä graafin luonti muuta työkirjageneraatioita

Ajastettu uudelleenlaskenta

Recalculate säilyttää jaetun graafin ja rakentaa sen uudelleen vain, kun työtilan rekisteröinti tai työkirjan kaavarippuvuusgeneraatio muuttuu; arvogeneraatiot käynnistävät uuden dirty-kierroksen, ja dirty-tila leviää eteenpäin työkirjojen välisiä riippuvuussärmiä pitkin

var
  RecalcInfo: TXLSWorkspaceRecalcResult;
  Status: TXLSWorkspaceRecalcStatus;
begin
  Status := Workspace.Recalculate(RecalcInfo);
  if Status <> xlswrcOk then
    HandleWorkspaceCalculation(Status, RecalcInfo);
end;
  • Vahvasti yhtenäiset komponentit lasketaan kaavasoluille, joten työkirjat voivat viitata molempiin suuntiin pysyen edelleen syklittöminä, kun niiden solutason riippuvuuspolut eivät muodosta silmukkaa
  • Aitojen syklien jäsenet ja syklien tukemat dirty-jälkeläiset mitätöidään ja jätetään topologisen järjestyksen ulkopuolelle, jolloin vanhentuneita välimuistiarvoja ei esitetä onnistuneina tuloksina
  • Volatiilit tai staattisesti ratkaisemattomat viittaukset pakottavat oikeellisuuden vaatiman konservatiivisen dirty-käyttäytymisen, kun taas vakaat graafit hyödyntävät aiemman riippuvuustyön tulokset
  • Kierroksen aikaiset ulkoiset lukemat käyttävät tarkkaa työkirjainstanssi-, laskentataulukko-, rivi- ja sarakevälimuistia; ajastettu kaava mitätöi tulostealueensa ennen evaluointia, joten myöhemmät riippuvaiset näkevät uuden arvon
  • Kierroksikohtainen välimuisti ei koskaan myönnä resurssivaltaa; rekisteröidyt työkirjat ja valinnainen kutsujan hallitsema loader pysyvät ainoisina elävinä ratkaisulähteinä, niiden jälkeen tulevat tyypitetyt tiedostovälimuistit ja #REF!
  • TXLSWorkspaceRecalcResult paljastaa, rakennettiinko graafi uudelleen, sekä dirty-, evaluoitujen, mitätöityjen, sykli-, tukossa-, välimuistiosuma- ja välimuistihuti-laskurit
  • Tila erottaa onnistumisen, ei-tuetut adapterit, katkaistut työkirjat, kehämäiset viittaukset, laskentavirheet ja työtilan muutokset kierroksen aikana
  • Recalculate-kutsut samalle työtilalle sarjoitetaan, joten kaksi laskentasessiota ei koskaan muuta jaettua graafia tai työkirjojen välimuisteja rinnakkain
  • Remove tai Clear voi suoriutua kesken aktiivisen kierroksen; kierros pitää kiinni turvallisista adapteritilannekuvista ja palauttaa xlswrcWorkspaceChanged-tilan poistetun rekisteröinnin dereferoinnin sijaan
  • Työtilan tuhoaminen odottaa aktiivisen kierroksen päättymistä, kun taas rekisteröidyn työkirjan tuhoaminen katkaisee sen adapterin ja saa myöhemmät ratkaisut epäonnistumaan turvallisesti
  • Loader-virheet ja ei-löytynyt-tulokset pysyvät välimuistissa kerran kullekin normalisoidulle identiteetille ResetLoadAttempts-kutsuun asti, ja epäonnistunut laskenta säilyttää paikallisen dirty-tilan eksplisiittistä uudelleenyritystä varten
  • Säilytetty graafi tekee muuttumattomasta jatkokierroksesta työkirjojen määrän suhdeltaisen kaavojen määrän sijaan; ei-rekursiivinen komponenttianalyysi ja kompaktit aluesärmät pitävät syvät ja leveät mallit rajattuina materialisoituihin kaavametatietoihin

Ulkoisten määriteltyjen nimien irrottaminen

ConvertExternalDefinedNamesToRefErrors tarjoaa saman julkisen operaation sekä TXLSWorkbook- että TXLSXWorkbook-luokissa; se palauttaa työkirja- ja laskentataulukokohtaisten määrittelyjen määrän, jotka on korvattu natiiveilla #REF!-virheillä

var
  Converted: Integer;
begin
  Converted := Workbook.ConvertExternalDefinedNamesToRefErrors;
  // External-link parts and ordinary cell formulas remain intact
end;
  • Classic XLS -valinta käyttää käännettyjä BIFF-viittaustokeneja ja XTI:n tukityökirjan identiteettiä, joten saman työkirjan kolmiulotteiset viittaukset ja epävarmat tokenvirrat pysyvät muuttumattomina
  • XLSX-valinta käyttää syntaksitietoisia numeerisia työkirjapaikkoja relaatioasiakirjan järjestyksessä ja hyväksyy vain työkirjojen ulkoisten linkkien osat, jättäen pois DDE:n, OLE:n, ratkaisemattomat paikat, taulukkoviittaukset ja hakasulkeissa olevan tekstin merkkijonojen sisällä
  • Kaikki korvaukset valmistellaan ennen ensimmäistä muutosta ja vahvistetaan yhtenä kirjoitusoperaationa; toinen kutsu on idempotentti
  • Nimen teksti, työkirjan tai laskentataulukon laajuus, näkyvyys, kommentit, makro- ja sisäänrakennetut liput, tuntemattomat XLSX-attribuutit sekä ulkoisten linkkien hakemisto säilyvät käytettävissä muunnoksen ja roundtripin jälkeen
  • Virheelliset ja ei-tuetut määrittelyt säilytetään mahdollisimman tavu- tai tekstitarkkoina, eikä niitä arvata, vaan niistä lisätään xlsDiagnosticDefinedNameConversionSkipped-diagnostiikka
  • Riippuvaiset kaavat lasketaan uudelleen vastaavaksi Excelin virhearvoksi, kun taas tavallisen suoran ulkoisen kaavan kelvollinen välimuistitulos pysyy käytettävissä, jos sen elävä työkirja katkaistaan myöhemmin
  • Operaatio on Excel-kohtainen, eikä se tulkitse uudelleen OpenDocumentin nimi-kaavasemantiikkaa

Klassiset XLS-ulkoiset viittaukset

Klassisissa XLS-työkirjoissa ulkoiset linkit tallennetaan globaaliin hakemistolohkoon EXTERNALBOOK- ja EXTERNNAME-tietueiden avulla; HotXLS säilyttää nämä hakemistot tiedoston luku-/kirjoitussyklien aikana ja varmistaa, että etäalueviittaukset säilyvät muutosluuppien läpi

Ulkoiset XLSX-suhteet

OOXML-työkirjoissa ulkoisten linkkien kartoitus hoidetaan suhdeosien kautta; katso tukevat rajapintatiedot alla