Tehnički članak

Učitavanje XLSX samo sa metapodacima i selektivno sa HotXLS

HotXLS može otvoriti XLSX radnu svesku i uopšte ne parsirati ćelije radnog lista. TXLSXWorkbook.MetadataOnly čita svojstva radne sveske, definisana imena, imena radnih listova i stanja vidljivosti, stilove, temu, veze i spoljne veze, a zatim staje pre XML-a ćelija. Za skener koji treba da zna šta je u direktorijumu radnih sveski, to je razlika između minuta i sekundi

Tri srodna prekidača upotpunjuju sliku: SelectedSheets parsira ćelije za imenovani podskup, LoadSheet materijalizuje preskočeni list kasnije iz originalne arhive, a PreserveRawParts kopira komprimovane bajtove neizmenjenih delova direktno pri snimanju. Korišćeni zajedno pretvaraju «otvori radnu svesku» iz jedne sve-ili-ništa operacije u nešto što možete opsegovati

Šta možete naučiti bez parsiranja jedne ćelije?

Više nego što većini zadataka otkrivanja treba. Sa MetadataOnly postavljenim pre Open, radna sveska se vraća noseći svoja imena listova i stanja vidljivosti, svoja definisana imena, svoja svojstva dokumenta, svoje stilove i temu, svoje spoljne veze i svoje veze. Listovi su prisutni kao objekti sa nula ćelija

To je tačno ona informacija na kojoj radi katalog, revizija ili odluka usmeravanja. Koje radne sveske definišu ime koje se zove TaxRate? Koje imaju skrivene listove? Koje se povezuju na server koji je povučen iz upotrebe? Odgovaranje na to potpunim učitavanjem svakog fajla jeste kako noćni posao postaje celonoćni posao

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 jeste TStringList imena listova. Kad je neprazna, Open parsira XML ćelija samo za listove koje imenuje; svaki drugi list zadržava svoje ispravno ime i stanje vidljivosti i ne drži ćelije. Prazna lista znači prethodno ponašanje, koje jeste učitavanje svega

Interakcija sa MetadataOnly vredi izreći jasno, jer obrtanje proizvodi zbunjujuću praznu radnu svesku: MetadataOnly = True nadjačava izbor i preskače sve listove. Koristite jedno ili drugo. Otkrivanje koristi samo-metapodatke; ciljani rad koristi izbor

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) materijalizuje preskočeni list na zahtev iz originalne arhive, što je ono što čini ovaj obrazac upotrebljivim u interaktivnoj aplikaciji a ne samo u paketu. Otvorite sa listom koju korisnik gleda, učitate ostale kad kliknu. Arhiva ostaje otvorena upravo iz tog razloga, tako da držite radnu svesku živom onoliko dugo koliko korisnik može tražiti još jedan list

Zašto povratni put menja delove koje nikad niste dirali?

Zato što naivno snimanje regeneriše sve. Dekomprimujte temu, izgradite model objekata, serijalizujte je nazad, ponovo kompresujte — i sada se bajtovi razlikuju iako se ništa oko teme nije promenilo. Za VBA projekte i pivot keševe to je gore od rasipništva, jer ti delovi nose strukturu koju model objekata ne predstavlja u potpunosti

PreserveRawParts odgovara na to kopiranjem komprimovane reprezentacije neizmenjenih delova direktno iz izvorne arhive tokom SaveAs. Tema, VBA projekat, pivot tabele i pivot keševi prelaze kao bajtovi kad nisu izmenjeni. Bez dekompresije, bez ponovne kompresije, bez rizika od gubitka nečega u serijalizacijskom povratnom putu

Cena je ograničenje koje ste već imali: izvorna arhiva mora i dalje biti dostupna u trenutku snimanja. Ako vaš tok čita fajl u memoriju, zatvara ga i snima sat kasnije, putanja sirovog kopiranja nema šta da kopira. Držite izvor dostupnim za veka trajanja radne sveske, što je isti zahtev koji LoadSheet nameće

Linija obrade otkrivanja koja namerno ponovo otvara

Obrazac koji radi u proizvodnji ima dva prolaza i bez lukavosti. Prolaz jedan otvara samo-metapodatke i odlučuje. Prolaz dva ponovo otvara fajlove koji se računaju sa izborom listova i radi posao. Ponovno otvaranje deluje rasipnički dok ne prebrojite šta je prolaz jedan izbegao: drugo otvaranje je jedino koje parsira ćelije, i parsira samo listove koje je prolaz jedan izabrao

// 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 pokušavajte da unapredite radnu svesku samo-metapodataka na mestu tako što ćete očistiti zastavicu posle Open. Zastavica se čita tokom otvaranja; čišćenje naknadno ne menja ništa kod radne sveske čiji XML ćelija nikada nije bio posjećen

Gde se ovo uklapa sa ostalim polugama za velike fajlove

Selektivno učitavanje smanjuje ono što parsirate. Ne smanjuje ono što list košta jednom učitan, i ne pomaže kad iskreno treba svaka ćelija svakog lista. Za taj slučaj relevantan rad je na strani skladišta, opisan u beleškama o skladištu ćelija po blokovima redova i intervalnim prelazima stilova, i na strani parsiranja u paralelnom XLSX parsiranju i alokatoru memorije. Kad je zadatak čisto skeniranje bez ikakvog uređivanja, strujni direktni čitač preskače model objekata u potpunosti i pobediće svaku strategiju učitavanja koja gradi jedan

HotXLS otvara XLS i XLSX fajlove iz nativnog Delphi i C++Builder koda bez zavisnosti od Excel-a, tako da posao otkrivanja na strani servera radi bez ičeg instaliranog osim vašeg sopstvenog izvršnog fajla — pogledajte stranicu HotXLS komponente za proračunske tabele za podržane formate i licenciranje