Techninis straipsnis

Lapu pavadinimu greitas isvardinimas Delphi su HotXLS GetSheetNames

Kartais vienintelis klausimas, i kuri gavimo rutinai reikia atsakymo, yra struktūrinis: ar turi ši darbaknygė lapu, vadinamu "Mapping", arba kiek korteliu ji nesha. Atsakant tai istatymu Open yra brangus budas tai padaryti. Pilnas atidarymas infliacinate bendrą eiluciu lentele, dekoduje kiekvieną stiliaus irasą ir eina per kiekvieno darbalakio lasteles, nes ji neturi jokio budo zinoti, kad jums tik reikejo turinio lenteles. Dideliame faile tai yra simitai megabaitų alokaciju ir kelios sekundes CPU, issleisti isvardinant sarasa, kuris uzsima kelis kilobitus. HotXLS, gimtoji Delphi skaiciuokliu biblioteka is losLab, suteikia jums ta sarasa pati: GetSheetNames grazina darbalakiu pavadinimus, darbaknyges tvarka, be materializavimo vienos lasteles.

Kodel katalogas yra pigas skaityti

Abu skaiciuokliniu formatus deda savo turinio lentele artimiausia, kas daro sarasavimo kvietime greitai, o ne protingai. OOXML paketas laiko lapu katalogą xl/workbook.xml, dali, kuri lieka maziuke, ar darbaknygeje yra desimt eiluciu ar desimt milijonu. BIFF8 .xls issaugo savo BoundSheet irasus darbaknyges globalaus srauto pradzioje, pries bet kokius lasteleiu duomenis. Tad darbas, kuri isvardinimo kvietimas vengia, nera apvalinimo klaida pries pilna atidaryma. Tai yra dauguma failo. Katalogo skaitymas kainuoja ta pati keleta kilobaitu, nepriklausomai nuo eiluciu skaiciaus, o pilnas atidarymas mastelio su duomenimis, ir dideliame megabaitiniame darbaknyge tas tarpas siekia kelias eiles didumo tiek litų pasiektais baitais, tiek alokuota atminiu.

Ta lygi kaina yra savybe, verta projektuoti. Gavimo vartai, sukurti ant GetSheetNames, elgiasi vienodai su 200 eiluciu failu ir 200 MB vienu, todel letziausias failas pakete daugiau nenustato tempo sprendimui, ar failas isvis verta apdorojimo.

Vienas kvietimas per .xls, .xlsx ir sabalu formatus

XLS fasade, TXLSWorkbook.GetSheetNames skaito daugiau nei .xls. Jis taip pat priima uz zip pagrinstu .xlsx, .xlsm, .xltx ir .xltm, issimkdamas tik workbook.xml is archyvo. Tikram .xls ivesciai jis nuskaito BoundSheet irasus ir sustoja prie pirmos globalaus posrauties EOF iraso, todel didelis dvejetainis failas vis tiek kainuoja tik savo atveriamuju kilobaitų. XLSX fasadas nesha garantija, kuri svarbiau ilgai-veikianciams tarnybos kodams negu pirma pasirodo: TXLSXWorkbook.GetSheetNames palieka darbaknyges instancija nei atstatyta, nei uzpildyta, todel instancija jau laikanti atidara dokumenta gali zondiniuoti kitus failus netrukdant rankoje esanciam. GetODSSheetNames taiko ta pati metodą OpenDocument paketams, ir kiekvienas is siu kvieciamų turi srauto perkrovimą, kuri leidzia tikrinti ikele, kuri niekada nusileido disko.

var
  Book: TXLSXWorkbook;
  Names: TStringList;
  I: Integer;
begin
  Names := TStringList.Create;
  Book := TXLSXWorkbook.Create;
  try
    if Book.GetSheetNames('upload-7f3a.xlsx', Names) <= 0 then
      raise Exception.Create('unreadable workbook package');
    if Names.IndexOf('Mapping') < 0 then
      raise Exception.Create('required Mapping sheet is missing');
    for I := 0 to Names.Count - 1 do
      Writeln(Format('sheet %d: %s', [I, Names[I]]));
  finally
    Book.Free;
    Names.Free;
  end;
end;

Tas pats kvietimas yra puikus stalinio importo dialogo. Isvardykite lapus, leiskite vartotojui pasirinkti viena, ir mokekite pilno atidarymo tik po to, kai pasirinkimas padarytas. Su penkiasdesimt-lapu darbaknygė skirtumas yra matomas: pasirinkiklis, kuris pasirodo iš karto prieš tą, kuris stoja, kol visas failas ikraunamas uz nugaros.

Makro-isjungtos .xlsm failai ir sabalu formatai isvardijami lygiai kaip paprastas .xlsx, nes katalogas sedi ta pati workbook.xml, nesvarbu, ar vbaProject.bin yra salia pakete. Gavimo konvejeris todėl gali surinkti lapus makro darbaknyges nukreipimui, niekada neliesdamas makro krovinio ir niekada nedaro ko nors, kas ji vykdytų, ir palikti makro politikos kvietimą etapui, kuris is tikruju atidaro faila.

Grazinimo vertes skaitymas nepaklaidinant saves

Grazinimo konvencijos nera vienovos HotXLS. Kai kurie kviecimai grazina 1 sekme, kiti grazina skaiciavimą, todel sarasavimo funkcijoms vienintelis tikrinimas, kuris laikosi, yra vertinti nulio arba zemiaus kaip nesekme, su eiluciu sarasu issvalytu. Pasiprieskite pagundai skaityti tuscia sarasa kaip "darbaknygė be lapu". Tiek ECMA-376, tiek BIFF8 specifikacija reikalauja bent vieno lapo galioje darbaknygeje, todel nuliniai pavadinimai visada reiskia skaitymo nesekme, ne tai, kad failas yra teiseti tusiias.

Nepasiseke sarasavimas yra pats savimi zinija, verta saugoti. .xlsx failas, kuris nepasiseka kvietimui, yra vienas is keletu konkreciu dalykų: sutrumpintas, ne tikrai OOXML paketas is viso (klaidingai pavadinti CSV eksportai is kitu sistemu nuolat atsiranda cia), arba uzkoduotas konteineris. Skiriamosios yra sekancio tikrinimo uzduotis. Uzregistruoti pirmuosius baitus atmesto failo kartu su nesekme paprastai pasiverscia palaikymo sriegas i viena zinute.

Uzkoduotu konteineriu aptikimas pries nukreipiate

Uzkoduotas .xlsx nera zip. Tai yra OLE sudurtinis failas, apvijantis EncryptionInfo ir EncryptedPackage srautus, todel GetSheetNames negali matyti i ji ir grazina nesekme kaip bet koks kitas neskaciuojamas failas. CanReadEncrypted tikrina ta konteinerio forma, kuri leidzia gavimui nukreipti uzkoduota faila tycia, o ne ryti generine skaitymo klaida is kazko giliai darbininkuje:

type
  TIntakeRoute = (irNormal, irNeedsPassword, irUnreadable);

function ClassifyUpload(const FileName: string; Names: TStrings): TIntakeRoute;
var
  Book: TXLSXWorkbook;
begin
  Book := TXLSXWorkbook.Create;
  try
    // Encrypted OOXML is an OLE container, not a zip: check first,
    // because the listing calls cannot look inside it.
    if Book.CanReadEncrypted(FileName) then
      Exit(irNeedsPassword);
    if SameText(ExtractFileExt(FileName), '.ods') then
    begin
      if Book.GetODSSheetNames(FileName, Names) <= 0 then
        Exit(irUnreadable);
    end
    else if Book.GetSheetNames(FileName, Names) <= 0 then
      Exit(irUnreadable);
    Result := irNormal;
  finally
    Book.Free;
  end;
end;

Sifracija yra ten, kur HotXLS yra tycia asimetrinis, todel nukreipimas turi tai gerbti. Sensas .xls sifracija (RC4, RC4 CryptoAPI, XOR) yra skaitoma: TXLSWorkbook.Open(FileName, Password) issifruoja su issaugotu slaptazodžiu, ir tie failai gali likti automatizuotame kelyje. Uzkoduoti OOXML paketai eina kita kryptimi. HotXLS gali rasyti viena su SaveAsEncrypted, taciau negali perskaityti atgal. OpenEncrypted kelia EXlsxEncryptionNotImplemented, kai perduodamas uzkoduotas paketas, kas yra priezastis, kodėl saziningo gavimo projektavimas siuncia uzkoduota .xlsx zmogui su Excel ir laiko slaptazodzi nesiojanti .xls kode.

Paketine darbe sis klasifikatorius uzdirbnas savo vieta paleisdamas per visa gaunamaji katalogą pries bet kuris darbininkas pradeda tikrą apdorojimą, nes kiekvienas zondavimas kainuoja apie viena failo atidaryma ir kelis kilobitus skaitymu. Jo isnkinimu keicia nesekmes rezimą, apie kuri operacijos is tikruju rupinasi. Vietoj 3 val. ryto uzduociai mirštant ant 412 failo is 600, jums gauna 412 failu eileje ir 5 atmestu per gavimą su priezastimi, prikabinta prie kiekvieno. Tie patys bibliotekos kviecimai, daug geresne operacine istorija.

Klausimai, i kuriuos sarasavimo kvietimas negali atsakyti

Pavadinimai ir tvarka yra visas gaunamas. Sarasavimo kviecimai nieko nesako apie matomuma, todel paslepti ir labai-paslepti lapai atvyksta saraskui atrodydami kaip bet kas kitas. Jie nepranesha jokiu naudojamo-diapazono dimensiju, jokiu lasteleiu skaiciaus ir jokiu dokumentu savybiu. docProps/core.xml dalis taip pat maziuke, taciau siandiena nera tik-savybiu zondavimo, todel autoriaus ir pavadinimo metaduomenys vis dar kainuoja pilna Open. Svarus budas gyventi su tuo yra leisti pigiems faktams nukreipti kiekvieną faila ir rezervuoti brangius tiems, kurie isgyvena nukreipimą. Failams, kurie is tikruju pereina i gilu skaitymą, tik-skaitymo skenavimas didelio .xls veikia pastebjamai greiciau su _DisableGraphics := True, kas praleidzia OfficeArt analizavimą. Tik niekada neissaugokite is tos instancijos: braizinio sluoksnis, kurį ji praleido, yra dingęs is modelio, ir issaugojimas ji praleistų is failo.

Failai, kurie isvaloma atranką, paprastai eina i gilesnę analizę. Darbaknyges audito ir konversijos darbastalio apima lapų-lygio skaiciklius, vertus rinkti, kai pilnas atidarymas yra pateisinamas, o dideles-darbaknyges nasumas vadovas apima ta pilna atidaryma greitai laiko.

HotXLS yra gimtoji Object Pascal skaiciuokliu biblioteka Delphi ir C++Builder; pilnas API pavyrsias, iskaitant patikrinimo kvietimus, parodytus cia, yra dokumentuota HotXLS Component produkto puslapyje.