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

var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.MetadataOnly := True;      // set before Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] is 1-based
      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

Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Later, when the user opens a tab you skipped.
// LoadSheet takes the 0-based position and needs the source file,
// so it does not work on a workbook opened from a stream
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

// Pass 1: discovery
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pass 2: targeted load
Workbook := TXLSXWorkbook.Create(nil);
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-taulukkolaskentakomponenttisivulta tuetut muodot ja lisensöinti