Tekninen artikkeli

Vain-metatiedot- ja valikoiva XLSX-lataus HotXLS:llä

HotXLS voi avata XLSX-työkirjan jättämällä jäsentämättä yhtäkään laskentataulukon solua. TXLSXWorkbook.MetadataOnly lukee työkirjan ominaisuudet, määritellyt nimet, taulukoiden nimet ja näkyvyystilat, tyylit, teeman, yhteydet ja ulkoiset linkit ja pysähtyy sitten ennen solu-XML:ää. Skannerille jonka pitää tietää mitä työkirjojen hakemistossa on, tuo on ero minuuttien ja sekuntien välillä

Kolme liittyvää kytkintä täydentää kuvan: SelectedSheets jäsentää solut nimetylle osajoukolle, LoadSheet materialisoi ohitetun taulukon myöhemmin alkuperäisestä arkistosta, ja PreserveRawParts kopioi muuttamattomien osien pakatut tavut suoraan läpi tallennettaessa. Käytettynä yhdessä ne muuttavat "avaa työkirja" -operaation yhdestä kaikkitai-ei-mitään -toimenpiteestä joksikin mitä voit rajata

Mitä voit oppia jäsentämättä ainuttakaan solua?

Enemmän kuin useimmat löytötehtävät vaativat. Kun MetadataOnly on asetettu ennen Open:a, työkirja palaa kantaen taulukoidensa nimet ja näkyvyystilat, määritellyt nimensä, asiakirjan ominaisuutensa, tyylinsä ja teemansa, ulkoiset linkkinsä ja yhteytensä. Taulukot ovat läsnä objekteina joilla on nolla solua

Se on juuri se tieto jonka varassa luettelo, auditointi tai reitityspäätös pyörii. Mitkä työkirjat määrittelevät nimellä TaxRate? Millä on piilotettuja taulukoita? Mitkä linkittävät palvelimeen joka on poistettu käytöstä? Niihin vastaaminen lataamalla jokainen tiedosto kokonaan on se miten yöllinen työ muuttuu koko yön työksi

HotXLS MetadataOnly lukee työkirjan ominaisuudet, taulukkonimet, tyylit ja linkit Delphi XLSX -arkistossa ja pysähtyy ennen mitään laskentataulukon solu-XML:ää
MetadataOnly lukee jokaisen arkiston rakenteellisen osan ja pysähtyy ennen laskentataulukon solu-XML:ää. Delphi-työkirja palaa taulukoiden nimien, näkyvyyksien, määritettyjen nimien ja tyylien kanssa sekä nollalla solulla
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // aseta ennen Open-kutsua
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] on 1-pohjainen
      if not Workbook.Sheets[I].Visible then
        Report.Add(FileName + ': hidden sheet ' +
          Workbook.Sheets[I].Name);
  finally
    Workbook.Free;
  end;
end;

Kahden taulukon lataaminen neljästäkymmenestä

SelectedSheets on TStringList taulukoiden nimiä. Kun se on ei-tyhjä, Open jäsentää solu-XML:n vain niille taulukoille jotka se nimeää; jokainen muu taulukko pitää oikean nimensä ja näkyvyystilansa eikä pidä soluja. Tyhjä lista tarkoittaa aiempaa käytöstä, eli kaiken lataamista

Vuorovaikutus MetadataOnly:n kanssa kannattaa sanoa suoraan, koska sen sekoittaminen tuottaa hämmentävän tyhjän työkirjan: MetadataOnly = True ohittaa valinnan ja ohittaa kaikki taulukot. Käytä toista tai toista. Löytö käyttää vain-metatietoa; kohdennettu työ käyttää valintaa

HotXLS SelectedSheets jäsentää solut kahdelle nimetylle taulukolle neljästäkymmenestä Delphissä, kun taas LoadSheet materiaalistoi ohitetun taulukon yhä avoimesta arkistosta
SelectedSheets jäsentää solu-XML:n vain nimetyille taulukoille ja jättää loput tyhjiksi tynkiksi, jotka säilyttävät nimen ja näkyvyyden. LoadSheet materialisoi tynkän myöhemmin, kunhan lähdearkisto on yhä auki
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Myöhemmin, kun käyttäjä avaa väliin jätetyn välilehden.
// LoadSheet ottaa 0-pohjaisen sijainnin ja tarvitsee lähdetiedoston,
// joten se ei toimi streamista avatussa työkirjassa
if Workbook.LoadSheet(ZeroBasedPosition) then
  Grid.Refresh;

LoadSheet(Index) materialisoi ohitetun taulukon tarvittaessa alkuperäisestä arkistosta, mikä on se mikä tekee tästä mallista käyttökelpoisen interaktiivisessa sovelluksessa eikä vain erässä. Avaa taulukolla jota käyttäjä katsoo, lataa muut kun hän klikkaa. Arkisto pysyy auki juuri siksi, joten pidä työkirja hengissä niin kauan kuin käyttäjä saattaa pyytää toista taulukkoa

Miksi edestakainen matka muuttaa osia joita et koskenut?

Koska naiivi tallennus tuottaa kaiken uudelleen. Pakkaamaton teema, oliomallin rakentaminen, sarjoitus takaisin, uudelleenpakkaus — ja nyt tavut eroavat vaikka mitään teemassa ei muuttunut. VBA-projekteille ja pivot-välimuisteille se on pahempaa kuin tuhlailevaaa, koska nuo osat kantavat rakennetta jota oliomalli mallintaa vain osittain

PreserveRawParts vastaa tähän kopioimalla muuttamattomien osien pakatun esityksen suoraan lähdearkistosta SaveAs:n aikana. Teema, VBA-projekti, pivot-taulukot ja pivot-välimuistit siirtyvät tavuina kun niitä ei ollut muutettu. Ei purkamista, ei uudelleenpakkausta, ei riskiä menettää jotain sarjoitusedestakaisissa

Hinta on rajoite joka sinulla jo oli: lähdearkiston on oltava yhä saatavilla tallennushetkellä. Jos työnkulkusi lukee tiedoston muistiin, sulkee sen ja tallentaa tunnin kuluttua, raakakopiopolulla ei ole mitään kopioitavaa. Pidä lähde tavoitettavissa työkirjan eliniän ajan, mikä on sama vaatimus jonka LoadSheet asettaa

Löytöputki joka avaa uudelleen tarkoituksella

Malli joka toimii tuotannossa on kaksivaiheinen eikä oveluutta. Ensimmäinen vaihe avaa vain-metatiedolla ja päättää. Toinen vaihe avaa uudelleen tiedostot jotka merkitsevät taulukkovalinnalla ja tekee työn. Uudelleenavaus tuntuu tuhlailevalta kunnes lasket mitä ensimmäinen vaihe vältti: toinen avaus on ainoa joka jäsentää soluja, ja se jäsentää vain ne taulukot jotka ensimmäinen vaihe valitsi

Kaksivaiheinen HotXLS-kartoitusputki Delphissä: vain metadatan kierros päättää, mitkä työkirjat ja taulukot ovat merkityksellisiä, sitten kohdistettu kierros jäsentää vain valitut taulukot
Ensimmäinen kierros skannaa hakemiston vain metatiedoista ja päättää, mitkä tiedostot ja taulukot merkitsevät; toinen kierros avaa osumat uudelleen taulukkovalinnalla. Vain toinen avaus jäsentää solu-XML:ää koskaan
// Vaihe 1: löytö
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Vaihe 2: kohdennettu lataus
Workbook := TXLSXWorkbook.Create;
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);

Älä yritä promoted vain-metatieto-työkirjaa paikallaan tyhjentämällä lippu Open:n jälkeen. Lippu luetaan avaamisen aikana; sen tyhjentäminen jälkeenpäin ei muuta mitään työkirjassa jonka solu-XML:ssä ei koskaan käyty

Mihin tämä sopii muiden suurten tiedostojen vipujen kanssa

Valikoiva lataus vähentää mitä jäsentät. Se ei vähennä mitä taulukko maksaa kerran ladattuna, eikä se auta kun aidosti tarvitset joka solun joka taulukosta. Siihen tapaukseen liittyvä työ on tallennuspuolella, kuvattuna muistiinpanoissa rivilohkosolujen tallennus ja välistyylikerrokset, ja jäsennyspuolella rinnakkainen XLSX-jäsennys ja muistivaraaja. Kun tehtävä on puhdas skannaus ilman muokkausta lainkaan, suoratoistinen suora lukija ohittaa oliomallin kokonaan ja voittaa minkä tahansa latausstrategian joka rakentaa sellaisen

HotXLS avaa XLS- ja XLSX-tiedostoja natiivista Delphi- ja C++Builder-koodista ilman Excel-riippuvuutta, joten palvelinpuolen löytötyö ajetaan ilman asennettua muuta kuin oma suoritettava tiedostosi — katso HotXLS-Delphi-taulukkolaskentakomponenttisivulta tuetut muodot ja lisensöinti