Tehnični članak

Nalaganje XLSX samo z metapodatki in izbirno z HotXLS

HotXLS lahko odpre delovni zvezek XLSX in sploh ne razčleni nobene celice delovnega lista. TXLSXWorkbook.MetadataOnly prebere lastnosti delovnega zvezka, določena imena, imena listov in stanja vidnosti, sloge, temo, povezave in zunanje povezave, nato pa se ustavi pred XML celic. Za pregledovalnik, ki mora vedeti, kaj je v mapi delovnih zvezkov, je to razlika med minutami in sekundami

Tri povezane stikala dopolnjujejo sliko: SelectedSheets razčleni celice za imenovano podmnožico, LoadSheet pozneje materializira preskočeni list iz izvirnega arhiva, PreserveRawParts pa ob shranjevanju neposredno prekopira stisnjene bajte nespremenjenih delov. Skupaj uporabljeni spremenijo "odpri delovni zvezek" iz ene same vse-ali-nič operacije v nekaj, kar lahko obsegate

Kaj lahko izveste brez razčlenjevanja ene same celice?

Več, kot potrebuje večina nalog odkrivanja. Z MetadataOnly, nastavljenim pred Open, se delovni zvezek vrne z imeni listov in stanji vidnosti, z določenimi imeni, lastnostmi dokumenta, slogi in temo, zunanjimi povezavami in povezavami. Listi so prisotni kot objekti z nič celicami

To je natanko informacija, na kateri teče katalog, revizija ali odločitev o usmerjanju. Kateri delovni zvezki določajo ime z imenom TaxRate? Kateri imajo skrite liste? Kateri se povezujejo s strežnikom, ki je bil izločen? Odgovarjanje na to s popolnim nalaganjem vsake datoteke je način, kako nočna naloga postane celonočna naloga

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;

Nalaganje dveh listov od štiridesetih

SelectedSheets je TStringList imen listov. Ko ni prazen, Open razčleni XML celic samo za liste, ki jih imenuje; vsak drug list obdrži pravilno ime in stanje vidnosti ter ne drži celic. Prazen seznam pomeni prejšnje obnašanje, to je naložiti vse

Interakcija z MetadataOnly se splača povedati naravnost, ker obratno vrstni red daje zbegan prazen delovni zvezek: MetadataOnly = True prekrije izbiro in preskoči vse liste. Uporabite enega ali drugega. Odkrivanje uporablja samo metapodatke; ciljno delo uporablja izbiro

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) na zahtevo materializira preskočeni list iz izvirnega arhiva, kar naredi ta vzorec uporaben v interaktivni aplikaciji in ne le v paketu. Odprite z listom, na katerega uporabnik gleda, naložite ostale, ko kliknejo. Arhiv ostane odprt natanko iz tega razloga, zato obdržite delovni zvezek živ, dokler lahko uporabnik prosi za drugi list

Zakaj povratni klic spremeni dele, ki se jih niste nikoli dotaknili?

Ker naivno shranjevanje regenerira vse. Dekodirajte temo, zgradite model objektov, ga serializirajte nazaj, ponovno stisnite — in zdaj se bajti razlikujejo, čeprav se ni nič spremenilo pri temi. Za projekte VBA in predpomnilnike vrtilnih tabel je to huje od razmetavanja, ker ti deli nosijo strukturo, ki je model objektov ne predstavlja v celoti

PreserveRawParts odgovarja na to tako, da med SaveAs neposredno iz izvornega arhiva prekopira stisnjeno predstavitev nespremenjenih delov. Tema, projekt VBA, vrtilne tabele in predpomnilniki vrtilnih tabel se premaknejo kot bajti, ko niso bili spremenjeni. Brez dekompresije, brez ponovnega stiskanja, brez tveganja izgube česa v povratnem klicu serializacije

Strošek je omejitev, ki ste jo že imeli: izvorni arhiv mora ob času shranjevanja še vedno biti na voljo. Če vaš delovni tok prebere datoteko v pomnilnik, jo zapre in shrani uro pozneje, surova pot kopiranja nima česa kopirati. Obdržite vir dosegljiv za življenjsko dobo delovnega zvezka, kar je ista zahteva, ki jo vsiljuje LoadSheet

Cevovod odkrivanja, ki se namensko znova odpre

Vzorec, ki deluje v proizvodnji, ima dva prehoda in nič zvijač. Prvi prehod odpre samo z metapodatki in odloči. Drugi prenehoda znova odpre datoteke, ki štejejo, z izbiro listov in opravi delo. Znova odpiranje se zdi razmetano, dokler ne preštejete, česa se je prvi prehod izognil: drugo odpiranje je edino, ki razčlenjuje celice, in sicer samo liste, ki jih je izbral prvi prehod

// 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);

Ne poskušajte napredovati delovnega zvezka samo z metapodatki na mestu tako, da po Open počistite zastavico. Zastavica se bere med odpiranjem; njeno čiščenje pozneje ne spremeni ničesar pri delovnem zvezku, katerega XML celic nikoli ni bil obiskan

Kam se to pripenja z drugimi ročkami za velike datoteke

Izbirno nalaganje zmanjšuje tisto, kar razčlenite. Ne zmanjšuje tistega, kar list stane, ko je enkrat naložen, in ne pomaga, ko resnično potrebujete vsako celico vsakega lista. Za ta primer je relevantno delo na strani shrambe, opisano v zapiskih o shrambi celic v blokih vrstic in prekrivnih slogih intervalov, na strani razčlenjevanja pa v vzporednem razčlenjevanju XLSX in dodeljevalniku pomnilnika. Ko je naloga čisto optično branje brez urejanja, neposredni bralnik toka povsem preskoči model objektov in premagala bo katerokoli strategijo nalaganja, ki ga gradi

HotXLS odpira datoteke XLS in XLSX iz izvorne kode Delphi in C++Builder brez odvisnosti od Excel, tako da služi odkrivanja na strežniku teče z ničimer nameščenim onstran lastne izvršljive datoteke — glejte stran komponente preglednic HotXLS za podprte formate in licenciranje