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