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

HotXLS MetadataOnly čita svojstva radne knjige, nazive listova, stilove i poveznice u Delphi XLSX arhivi, a zatim staje prije bilo kojeg XML-a ćelija radnog lista
MetadataOnly čita svaki strukturni dio arhive i staje prije worksheet ćelijskog XML-a. Delphi radna knjiga vraća se s imenima listova, vidljivošću, definiranim imenima i stilovima, i nulom ćelija
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // postavite prije Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] je indeksiran od 1
      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

HotXLS SelectedSheets raščlanjuje ćelije za dva imenovana lista od četrdeset u Delphiju dok LoadSheet materijalizira preskočeni list iz još otvorene arhive
SelectedSheets ćelijski XML parsira samo za imenovane listove, ostavljajući ostatak kao prazne kratice koje zadržavaju ime i vidljivost. LoadSheet kratku materijalizira kasnije, pod uvjetom da je izvorna arhiva još otvorena
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Kasnije, kad korisnik otvori karticu koju ste preskočili.
// LoadSheet uzima poziciju indeksiranu od 0 i treba izvornu datoteku,
// pa ne radi na radnoj knjizi otvorenoj iz toka
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

Dvoprolazni HotXLS otkrivajući tijek u Delphiju: prolaz samo metapodataka odlučuje koje radne knjige i listovi važe, a zatim ciljni prolaz raščlanjuje samo odabrane listove
Prvi prolaz direktorij skenira samo-metapodatke i odlučuje koje datoteke i listovi važe; drugi prolaz poklapanja ponovno otvara s odabirom listova. Samo drugo otvaranje ikad parsira ćelijski XML
// Prolaz 1: otkrivanje
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Prolaz 2: ciljano učitavanje
Workbook := TXLSXWorkbook.Create;
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 Delphi komponente proračunskih tablica za podržane formate i licenciranje