Techninis straipsnis

Tik metaduomenų ir atrankinis XLSX įkėlimas su HotXLS

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

HotXLS MetadataOnly skaito darbo knygos savybes, lapų vardus, stilius ir nuorodas Delphi XLSX archyve, tada sustoja prieš bet kokį darbo lapo langelių XML
MetadataOnly skaito kiekvieną archyvo struktūrinę dalį ir sustoja prieš darbalapio langelių XML. Delphi darbo knyga grįžta su lapų vardais, matomumu, apibrėžtaisiais vardais ir stiliais, ir nuliu langelių
var
  Workbook: TXLSXWorkbook;
  I: Integer;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.MetadataOnly := True;      // nustatykite prieš Open
    Workbook.Open(FileName);
    for I := 1 to Workbook.Sheets.Count do      // Sheets[] skaičiuojama nuo 1
      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ą

HotXLS SelectedSheets analizuoja dviejų įvardytų lapų iš keturiasdešimties langelius Delphi, o LoadSheet materializuoja praleistą lapą iš vis tebeatviro archyvo
SelectedSheets analizuoja langelių XML tik pavadintiems lapams, palikdama likusius kaip tuščiuosius kelmuosius, išlaikančius vardą ir matomumą. LoadSheet suformuoja kelmutę vėliau, jei šaltinio archyvas vis dar atidarytas
Workbook.SelectedSheets.Add('Summary');
Workbook.SelectedSheets.Add('Q3 Detail');
Workbook.Open('consolidated-2026.xlsx');
// Vėliau, kai naudotojas atveria skirtuką, kurį praleidote.
// LoadSheet priima poziciją, skaičiuojamą nuo 0, ir jai reikia šaltinio failo,
// todėl ji neveikia knygai, atvertai iš srauto
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

Dviejų praėjimų HotXLS atradimo grandinė Delphi: tik metaduomenų praėjimas nusprendžia, kurios darbo knygos ir lapai svarbūs, tada taikytinis praėjimas analizuoja tik pasirinktus lapus
Pirmasis praėjimas skenuoja katalogą tik-metaduomenims ir nusprendžia, kurie failai ir lapai svarbūs; antrasis praėjimas vėl atveria atitikmenis su lapo pasirinkimu. Tik antrasis atidarymas kada nors analizuoja langelių XML
// 1 praėjimas: aptikimas
Workbook.MetadataOnly := True;
Workbook.Open(FileName);
Wanted := SheetsMatching(Workbook, 'Invoice');
Workbook.Free;

// 2 praėjimas: tikslintas įkėlimas
Workbook := TXLSXWorkbook.Create;
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