Tehnički članak

Učitavanje XLSX-a samo s metapodacima i selektivno s HotXLS-om

HotXLS može otvoriti XLSX radnu knjigu i uopće ne raščlaniti ćelije radnog lista. TXLSXWorkbook.MetadataOnly čita svojstva radne knjige, definirana imena, imena listova i stanja vidljivosti, stilove, temu, veze i vanjske poveznice, a zatim staje prije XML-a ćelija. Za alat za pretragu koji treba znati što je u direktoriju radnih knjiga, to je razlika između minuta i sekundi

Tri povezana prekidača upotpunjuju sliku: SelectedSheets raščlanjuje ćelije za imenovani podskup, LoadSheet materijalizira preskočeni list kasnije iz izvorne arhive, a PreserveRawParts kopira komprimirane bajtove nepromijenjenih dijelova izravno pri spremanju. Zajedno upotrijebljeni pretvaraju otvaranje radne knjige iz jedne sve-ili-ništa operacije u nešto što možete opsegom ograničiti

Što možete saznati bez raščlambe ijedne ćelije?

Više nego što većini zadataka otkrivanja treba. S MetadataOnly postavljenim prije Open, radna knjiga vraća se noseći imena listova i stanja vidljivosti, definirana imena, svojstva dokumenta, stilove i temu, vanjske poveznice i veze. Listovi su prisutni kao objekti s nula ćelija

To je upravo onaj podatak na kojem radi katalog, revizija ili odluka usmjeravanja. Koje radne knjige definiraju ime koje se zove TaxRate? Koje imaju skrivene listove? Koje se povezuju s poslužiteljem koji je povučen? Odgovaranje na to potpunim učitavanjem svake datoteke način je na koji noćni posao postaje posao cijele noći

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;

Učitavanje dva lista od četrdeset

SelectedSheets jest TStringList imena listova. Kad je neprazan, Open raščlanjuje XML ćelija samo za listove koje imenuje; svaki drugi list zadržava ispravno ime i stanje vidljivosti i ne drži ćelije. Prazan popis znači prethodno ponašanje, a to jest učitavanje svega

Međudjelovanje s MetadataOnly vrijedi izreći jasno, jer obrtanje stvara zbunjujuću praznu radnu knjigu: MetadataOnly = True nadjačava odabir i preskače sve listove. Koristite jedno ili drugo. Otkrivanje koristi samo metapodatke; ciljani rad koristi odabir

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) materijalizira preskočeni list na zahtjev iz izvorne arhive, što je što ovaj obrazac čini upotrebljivim u interaktivnoj aplikaciji, a ne samo u seriji. Otvorite s listom na kojem korisnik gleda, učitate ostale kad on klikne. Arhiva ostaje otvorena upravo iz tog razloga, pa držite radnu knjigu na životu onoliko dugo koliko korisnik može zatražiti drugi list

Zašto povratni put promijeni dijelove koje nikad niste dotakli?

Zato što naivno spremanje sve iznova generira. Dekomprimirajte temu, izgradite objektni model, serijalizirajte ga natrag, ponovno komprimirajte, i sada se bajtovi razlikuju iako se ništa oko teme nije promijenilo. Za VBA projekte i predmemoriju zaokreta to je gore od rasipanja, jer ti dijelovi nose strukturu koju objektni model ne prikazuje u potpunosti

PreserveRawParts odgovara na to kopiranjem komprimirane reprezentacije nepromijenjenih dijelova izravno iz izvorne arhive tijekom SaveAs. Tema, VBA projekt, pivot tablice i predmemorija zaokreta premještaju se kao bajtovi kad nisu bili izmijenjeni. Bez dekompresije, bez ponovne kompresije, bez rizika od gubitka nečega u serijalizacijskom povratnom putu

Cijena je ograničenje koje ste već imali: izvorna arhiva mora biti dostupna u vrijeme spremanja. Ako vaš cjevovod čita datoteku u memoriju, zatvara je i sprema sat kasnije, put sirovog kopiranja nema od čega kopirati. Držite izvor dostupnim za cijelog vijeka trajanja radne knjige, što je isti zahtjev koji LoadSheet nameće

Cjevovod otkrivanja koji namjerno ponovno otvara

Obrazac koji radi u proizvodnji ima dva prolaza i nimalo domišljatosti. Prolaz jedan otvara samo s metapodacima i odlučuje. Prolaz dva ponovno otvara datoteke koje su važne s odabirom listova i obavlja posao. Ponovno otvaranje čini se rasipnim dok ne prebrojite što je prolaz jedan izbjegao: drugo otvaranje jedino je koje raščlanjuje ćelije, i to samo listove koje je prolaz jedan odabrao

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

Nemojte pokušavati promicati radnu knjigu s metapodacima na mjestu brisanjem oznake nakon Open. Oznaka se čita tijekom otvaranja; njeno brisanje nakon toga ne mijenja ništa kod radne knjige čiji XML ćelija nikad nije bio posjećen

Gdje se ovo uklapa s ostalim polugama za velike datoteke

Selektivno učitavanje smanjuje ono što raščlanjujete. Ne smanjuje ono što list košta jednom učitan, a ne pomaže kad vam doista treba svaka ćelija svakog lista. Za taj slučaj relevantan rad jest na strani pohrane, opisan u bilješkama o pohrani ćelija u blokovima redova i preklopnim slojevima intervala stilova, a na strani raščlambe u paralelnoj XLSX raščlambi i alokatoru memorije. Kad je zadatak čisto skeniranje bez ikakvog uređivanja, izravni čitač strujanja u potpunosti preskače objektni model i pobijedit će svaku strategiju učitavanja koja ga gradi

HotXLS otvara XLS i XLSX datoteke iz izvornog Delphi i C++Builder koda bez ovisnosti o Excelu, pa posao otkrivanja na strani poslužitelja radi bez ičega instaliranog osim vlastite izvršne datoteke. Pogledajte stranicu HotXLS komponente proračunskih tablica za podržane formate i licenciranje