Articol tehnic

Încărcarea XLSX doar cu metadate și selectivă cu HotXLS

HotXLS poate deschide un registru de lucru XLSX și să nu analizeze nicio celulă de foaie de calcul. TXLSXWorkbook.MetadataOnly citește proprietățile registrului de lucru, numele definite, numele foilor și stările de vizibilitate, stilurile, tema, conexiunile și legăturile externe, apoi se oprește înainte de XML-ul celulelor. Pentru un scanner care trebuie să știe ce e într-un director de registre de lucru, aceasta este diferența dintre minute și secunde

Trei comutatoare înrudite completează tabloul: SelectedSheets analizează celulele pentru un subansamblu denumit, LoadSheet materializează ulterior o foaie omisă din arhiva originală, iar PreserveRawParts copiază direct la salvare octeții comprimați ale părților nemodificate. Folosite împreună transformă „deschide un registru de lucru” dintr-o operațiune totul-sau-nimic într-un ceva ce puteți delimita

Ce puteți afla fără a analiza o singură celulă?

Mai mult decât au nevoie majoritatea sarcinilor de descoperire. Cu MetadataOnly setat înainte de Open, registrul de lucru se întoarce purtând numele foilor și stările lor de vizibilitate, numele sale definite, proprietățile documentului, stilurile și tema, legăturile externe și conexiunile sale. Foaiele sunt prezente ca obiecte cu zero celule

Aceasta este exact informația pe care o rulează un catalog, un audit sau o decizie de rutare. Care registre de lucru definesc un nume numit TaxRate? Care au foi ascunse? Care se leagă la un server retras din uz? Răspunsul la acestea prin încărcarea completă a fiecărui fișier este modul în care o sarcină nocturnă devine o sarcină toată noaptea

HotXLS MetadataOnly citește proprietățile registrului de lucru, numele foilor, stilurile și link-urile într-o arhivă XLSX Delphi, apoi se oprește înaintea oricărui XML de celule de worksheet
MetadataOnly citește fiecare parte structurală a arhivei și se oprește înainte de XML-ul de celule al foii de lucru. Registrul de lucru Delphi revine cu nume de foi, vizibilitate, nume definite și stiluri, și zero celule
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // setat înainte de Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] este bazat pe 1
      if not Workbook.Sheets[I].Visible then
        Report.Add(FileName + ': hidden sheet ' +
          Workbook.Sheets[I].Name);
  finally
    Workbook.Free;
  end;
end;

Încărcarea a două foi din patruzeci

SelectedSheets este un TStringList de nume de foi. Când este nevid, Open analizează XML-ul celulelor doar pentru foile pe care le numește; fiecare altă foaie își păstrează numele și starea de vizibilitate corecte și nu deține nicio celulă. O listă vidă înseamnă comportamentul anterior, anume încărcarea tuturor

Interacțiunea cu MetadataOnly merită spusă clar, deoarece inversarea ei produce un registru de lucru gol derutant: MetadataOnly = True suprascrie selecția și sare toate foile. Folosiți una sau alta. Descoperirea folosește doar-metadate; munca țintită folosește o selecție

HotXLS SelectedSheets parsează celulele pentru două foi denumite din patruzeci în Delphi, în timp ce LoadSheet materializează o foaie sărită din arhiva încă deschisă
SelectedSheets parsează XML-ul de celule doar pentru foilile numite, lăsând restul ca stub-uri goale care păstrează numele și vizibilitatea. LoadSheet materializează un stub mai târziu, cu condiția ca arhiva sursă să fie încă deschisă
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Mai târziu, când utilizatorul deschide o filă pe care ai omis-o.
// LoadSheet primește poziția bazată pe 0 și are nevoie de fișierul sursă,
// așa că nu funcționează pe un registru deschis dintr-un flux
if Workbook.LoadSheet(ZeroBasedPosition) then
  Grid.Refresh;

LoadSheet(Index) materializează la cerere o foaie omisă din arhiva originală, ceea ce face acest tipar utilizabil într-o aplicație interactivă mai degrabă decât doar într-un lot. Deschideți cu foaia pe care o privește utilizatorul, le încărcați pe celelalte când dă clic. Arhiva rămâne deschisă exact din acest motiv, așa că păstrați registrul de lucru viu atâta timp cât utilizatorul ar putea cere o altă foaie

De ce schimbă un drum dus-întors părți pe care nu le-ați atins niciodată?

Pentru că o salvare naivă regenerează totul. Decomprimați tema, construiți un model de obiecte, serializați-o înapoi, recomprimați — iar acum octeții diferă chiar dacă nimic despre temă nu s-a schimbat. Pentru proiectele VBA și cache-urile pivot asta este mai rău decât risipitor, deoarece acele părți poartă structură pe care modelul de obiecte nu o reprezintă complet

PreserveRawParts răspunde la asta copiind reprezentarea comprimată a părților nemodificate direct din arhiva sursă în timpul SaveAs. Tema, proiectul VBA, tabelele pivot și cache-urile pivot se mută ca octeți când nu au fost modificate. Fără decomprimare, fără recomprimare, fără riscul de a pierde ceva într-un drum dus-întors de serializare

Costul este o constrângere pe care o aveați deja: arhiva sursă trebuie să fie încă disponibilă la salvare. Dacă fluxul de lucru citește un fișier în memorie, îl închide și salvează o oră mai târziu, calea de copiere brută nu are ce copia. Păstrați sursa accesibilă pe durata de viață a registrului de lucru, aceeași cerință pe care o impune LoadSheet

Un flux de descoperire care redeschide intenționat

Tiparul care funcționează în producție are două treceri și nicio viclenie. Trecerea unu deschide doar-metadate și decide. Trecerea doi redeschide fișierele care contează cu o selecție de foi și face munca. Redeschiderea pare risipitoare până numărați ce a evitat trecerea unu: a doua deschidere este singura care analizează celule, iar analizează doar foile selectate de trecerea unu

Conductă de descoperire HotXLS în două treceri în Delphi: o trecere doar-metadate decide ce registre de lucru și foi contează, apoi o trecere țintită parsează doar foile selectate
Prima trecere scanează directorul metadata-only și decide ce fișiere și foi contează; a doua trecere redeschide potrivirile cu o selecție de foi. Doar a doua deschidere parsează vreodată XML-ul de celule
// Pasul 1: descoperire
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// Pasul 2: încărcare țintită
Workbook := TXLSXWorkbook.Create;
Workbook.SelectedSheets.AddStrings(Wanted);
Workbook.Open(FileName);

Nu încercați să promovați un registru de lucru doar-metadate în loc prin ștergerea fanionului după Open. Fanionul este citit în timpul deschiderii; ștergerea lui ulterior nu schimbă nimic despre un registru de lucru al cărui XML de celule nu a fost niciodată vizitat

Unde se încadrează asta cu celelalte pârghii pentru fișiere mari

Încărcarea selectivă reduce ce analizați. Nu reduce ce costă o foaie odată încărcată, iar nu ajută când aveți nevoie cu adevărat de fiecare celulă a fiecărei foi. Pentru acel caz munca relevantă este pe partea de stocare, descrisă în notele despre stocarea celulelor în blocuri de rânduri și suprapunerile de stil interval, iar pe partea de analiză în analiza XLSX paralelă și alocatorul de memorie. Când sarcina este o scanare pură fără nicio editare, cititorul direct în flux sare modelul de obiecte în întregime și va bate orice strategie de încărcare care construiește unul

HotXLS deschide fișiere XLS și XLSX din cod Delphi și C++Builder nativ fără dependență de Excel, astfel încât o sarcină de descoperire pe server rulează fără nimic instalat dincolo de propriul executabil — vedeți pagina componentei de foi de calcul HotXLS pentru formatele suportate și licențiere