HotXLS gali atverti XLSX skaičiuoklės knygą ir neanalizuoti jokių darbalapio langelių. TXLSXWorkbook.MetadataOnly skaito knygos savybes, apibrėžtus vardus, darbalapių pavadinimus ir matomumo būsenas, stilius, temą, ryšius ir išorines nuorodas, tada sustoja prieš langelių XML. Skaitytuvui, kuriam reikia žinoti, kas yra darbalapių kataloge, tai yra skirtumas tarp minučių ir sekundžių
Trys susiję jungikliai užbaigia vaizdą: SelectedSheets analizuoja langelius pavadintam poaibiui, LoadSheet vėliau materializuoja praleistą darbalapį iš originalaus archyvo, o PreserveRawParts išsaugant nukopijuoja nepakeistų dalių suglaudintus baitus tiesiai per. Kartu naudojami jie paverčia „atverti knygą“ iš visko ar nieko operacijos į ką nors, ką galite aprėpti
Ką galite sužinoti neanalizuodami nė vieno langelio?
Daugiau, nei reikia daugumai aptikimo uždavinių. Su MetadataOnly, nustatytu prieš Open, knyga grįžta nešdama savo darbalapių pavadinimus ir matomumo būsenas, apibrėžtus vardus, dokumento savybes, stilius ir temą, išorines nuorodas ir ryšius. Darbalapiai yra kaip objektai be langelių
Būtent tokios informacijos reikia katalogui, auditui ar nukreipimo sprendimui. Kurių knygų apibrėžia vardą TaxRate? Kurios turi paslėptus darbalapius? Kurios susieja su serveriu, kuris buvo komisuotas? Į tuos klausimus atsakyti pilnai įkeliant kiekvieną failą ir yra tai, kaip naktinis darbas tampa visos nakties darbu
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;
Dviejų darbalapių iš keturiasdešimties įkėlimas
SelectedSheets yra darbalapių pavadinimų TStringList. Kai jis netuščias, Open analizuoja langelių XML tik darbalapiams, kuriuos jis įvardija; kiekvienas kitas darbalapis išlaiko teisingą pavadinimą ir matomumo būseną, bet neturi langelių. Tuščias sąrašas reiškia ankstesnę elgseną — įkelti viską
Sąveika su MetadataOnly verta pasakyti aiškiai, nes sumaišymas su kojomis gamina mįslingą tuščią knygą: MetadataOnly = True nustelbia atranką ir praleidžia visus darbalapius. Naudokite vieną arba kitą. Aptikimas naudoja tik metaduomenis; tikslintas darbas naudoja atranką
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) materializuoja praleistą darbalapį pagal poreikį iš originalaus archyvo, kas ir padaro šį šabloną naudojamą interaktyvioje programoje, o ne tik pakete. Atverkite su darbalapiu, į kurį žiūri naudotojas, įkelkite kitus, kai jis spustelės. Archyvas lieka atvertas būtent dėl tos priežasties, todėl laikykite knygą gyvą tiek, kiek naudotojas gali paprašyti kito darbalapio
Kodėl kelionė ten ir atgal keičia dalis, kurių niekada nelietėte?
Nes naivus išsaugojimas regeneruoja viską. Dekompresuokite temą, sukurkite objektų modelį, serijuokite jį atgal, reglaudinkite — ir dabar baitai skiriasi, nors tema nepasikeitė. VBA projektams ir pivoto podėliams tai blogiau nei švaistymas, nes tos dalys neša struktūrą, kurios objektų modelis visiškai neatvaizduoja
PreserveRawParts į tai atsako kopijuodamas nepakeistų dalių suglaudintą atvaizdą tiesiai iš šaltinio archyvo SaveAs metu. Tema, VBA projektas, pivoto lentelės ir pivoto podėliai persikelia kaip baitai, kai jie nebuvo modifikuoti. Jokio dekodavimo, jokio reglaudinimo, jokios rizikos ką nors prarasti serijavimo kelionėje
Kaina yra apribojimas, kurį jau turėjote: šaltinio archyvas turi būti prieinamas išsaugojimo metu. Jei jūsų darbo eiga skaito failą į atmintį, uždaro jį ir išsaugo po valandos, neapdoroto kopijavimo keliui nėra iš ko kopijuoti. Laikykite šaltinį pasiekiamą knygos gyvavimo laikui, kas yra tas pats reikalavimas, kurį kelia LoadSheet
Aptikimo konvejeris, kuris keliais atveria iš naujo tyčia
Šablonas, veikiantis gamyboje, turi du praėjimus ir jokio gudrumo. Pirmas praėjimas atveria tik metaduomenis ir sprendžia. Antras praėjimas iš naujo atveria failus, kurie svarbūs, su darbalapių atranka ir atlieka darbą. Pakartotinis atvėrimas atrodo švaistymas, kol nesuskaičiuojate, ko išvengė pirmas praėjimas: antras atvėrimas yra vienintelis, analizuojantis langelius, ir jis analizuoja tik darbalapius, kuriuos parinko pirmas praėjimas
// 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);
Nebandykite paaukštinti tik metaduomenų knygos vietoje, išvalydami vėliavėlę po Open. Vėliavėlė skaitoma atvėrimo metu; jos išvalymas vėliau nieko nepakeičia knygoje, kurios langelių XML niekada neaplankytas
Kur tai tinka su kitais didelių failų svertais
Atrankinis įkėlimas mažina tai, ką analizuoja. Jis nemažina to, ką darbalapis kainuoja įkėlus, ir nepadeda, kai iš tikrųjų reikia kiekvieno kiekvieno darbalapio langelio. Tam atvejui aktualus darbas yra saugyklos pusėje, aprašytas eilučių blokų langelių saugyklos ir intervalų stilių perdangų pastabose, ir analizės pusėje — lygiagrečioje XLSX analizėje ir atminties paskirstytuve. Kai uždavinys yra grynas skaitymas be jokio redagavimo, srautinis tiesioginis skaitytuvas apeina objektų modelį ir sumuš bet kokią įkėlimo strategiją, kuri jį stato
HotXLS atveria XLS ir XLSX failus iš natyvaus Delphi ir C++Builder kodo be Excel priklausomybės, todėl serverio pusės aptikimo darbas vyksta nieko neįdiegus už jūsų vykdomąjį failą — žr. HotXLS skaičiuoklės komponento puslapį dėl palaikomų formatų ir licencijavimo