Včasih je edino vprašanje, ki ga rutina za vnos potrebuje, strukturno: ali ta delovni zvezek ima list, imenovan "Mapping", ali koliko zavihkov nosi. Odgovor na to z klicem Open je drogi način. Polno odpiranje napihne skupno tabelo nizov, dekodira vsak zapis slogov in hodi po celicah vsakega delovnega lista, ker nima načina, da bi vedel, da ste hoteli le kazalo vsebine. Na veliki datoteki so to stotine megabajtov dodelitev in sekunde CPE-ja, porabljene za branje seznama, ki zavzema le nekaj kilobajtov. HotXLS, izvorna knjižnica preglednic za Delphi losLab, vam ta seznam ponudi sama od sebe: GetSheetNames vrne imena delovnih listov v vrstnem redu delovnega zvezka, ne da bi materializirala eno samo celico.
Zakaj je katalog poceni za branje
Oba formata preglednic postavita kazalo vsebine blizu začetka, kar je tisto, kar naredi klic za navajanje hiter in ne zvit. Paket OOXML hrani katalog listov v xl/workbook.xml, del, ki ostane majhen, ne glede na to, ali delovni zvezek vsebuje deset vrstic ali deset milijonov. BIFF8 .xls shrani zapise BoundSheet na začetku toka globalnih spremenljivk delovnega zvezka, pred podatki celic. Torej delo, ki ga klic za navajanje izpusti, ni zaokrožna napaka glede na polno odpiranje. To je večina datoteke. Branje kataloga stane enako peščico kilobajtov ne glede na število vrstic, medtem ko polno odpiranje skalira s podatki, in na delovnem zvezku z več megabajti ta vrzel dosega več redov velikosti tako v dotaknjenih bajtih kot v dodeljenem pomnilniku.
Ta ploska cena je lastnost, ki je vredna zasnove. Vhodna vrata, zgrajena na GetSheetNames, se obnašajo enako na datoteki z 200 vrsticami in 200 MB, zato najpoočasnejša datoteka v seriji ne določa več tempa za odločanje, ali je datoteka sploh vredna obdelave.
En klic čez .xls, .xlsx in formate predlog
Na fasadi XLS TXLSWorkbook.GetSheetNames bere več kot .xls. Sprejema tudi na zipu temelječe .xlsx, .xlsm, .xltx in .xltm, ki iz arhiva povleče samo workbook.xml. Za resnično vhod .xls pregleda zapise BoundSheet in se ustavi pri prvem zapisu EOF globalnega podtoka, zato velika binarna datoteka še vedno stane le svoje začetne kilobajte. Fasada XLSX nosi garancijo, ki je za dolgo-tekočo storitveno kodo bolj pomembna kot se sprva zdi: TXLSXWorkbook.GetSheetNames pusti primerek delovnega zvezka niti ponastavljenega niti poseljenega, zato primerek, ki že drži odprt dokument, lahko preveri druge datoteke, ne da bi motil tistega, ki ga ima v roki. GetODSSheetNames enako pristopi k paketom OpenDocument, in vsak od teh klicev ima preobremenitev toka, ki vam omogoča pregled nalaganja, ki nikoli ne pristane na disku.
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;
Isti klic naredi dober pogovorno okno za uvoz namiznih aplikacij. Navedite liste, pustite, da uporabnik izbere enega, in plačajte za polno odpiranje šele po opravljeni izbiri. Pri delovnem zvezku s petdesetimi listi je razlika vidna: izbirnik, ki se pojavi takoj, v primerjavi s tistim, ki zastane, medtem ko se celotna datoteka nalaga za njim.
Datoteke .xlsm z omogočenimi makri in formati predlog se navajajo točno tako kot navaden .xlsx, ker katalog sedi v istem workbook.xml, ne glede na to, ali vbaProject.bin potuje v paketu ali ne. Vhodni cevovod torej lahko prešteje liste delovnega zvezka makra za usmerjanje, ne dotakne se tovora makra in ne naredi ničesar, kar bi ga zagnalo, ter odločitev o politiki makra prepusti stopnji, ki dejansko odpre datoteko.
Branje vrnjene vrednosti brez samoprevar
Konvencije vračanja vrednosti niso enotne čez HotXLS. Nekateri klici vrnejo 1 pri uspehu, drugi vrnejo število, zato je za kle za navajanje edino preverjanje, ki drži, obravnavanje katere koli vrednosti nič ali nižje kot neuspeh, s seznamom nizov izpraznjenim. Upreti se skušnjavi, da bi prazen seznam razlagali kot "delovni zvezek brez listov." Tako ECMA-376 kot specifikacija BIFF8 zahtevata vsaj en list v veljavnem delovnem zvezku, zato nič imen vedno pomeni, da branje ni uspelo, nikoli pa, da je datoteka legitimno prazna.
Neuspešno navajanje je samo po sebi signal, ki je vreden ohranjanja. Datoteka .xlsx, ki ne uspe pri klicu, je ena od nekaj specifičnih stvari: skrajšana, sploh ni paket OOXML (napačno označeni izvozi CSV iz drugih sistemov se tu stalno pojavljajo) ali šifrirani vsebnik. Razlikovanje med njimi je naloga naslednjega preverjanja. Beleženje prvih bajtov zavrnjene datoteke skupaj z neuspehom navadno preobrne nit podpore v eno samo sporočilo.
Zaznavanje šifriranih vsebnikov pred usmerjanjem
Šifriran .xlsx ni zip. To je datoteka OLE, ki ovija tokove EncryptionInfo in EncryptedPackage, zato GetSheetNames ne more pogledati vanjo in vrne neuspeh kot katera koli druga neberljiva datoteka. CanReadEncrypted preizkusi za to obliko vsebnika, kar vhodu omogoča namerno usmerjanje šifrirane datoteke namesto pogoltnitve generične napake branja iz globine delavca:
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;
Šifriranje je kraj, kjer je HotXLS namerno asimetričen, zato mora usmerjanje to spoštovati. Zastarelo šifriranje .xls (RC4, RC4 CryptoAPI, XOR) je berljivo: TXLSWorkbook.Open(FileName, Password) dešifrira s shranjenim geslom, in te datoteke lahko ostanejo na avtomatizirani poti. Šifrirani paketi OOXML gredo v nasprotno smer. HotXLS jih lahko piše z SaveAsEncrypted, toda ne more jih brati nazaj. OpenEncrypted sproži EXlsxEncryptionNotImplemented, ko mu podamo šifrirani paket, kar je razlog, zakaj poštena zasnova vnosa pošlje šifrirani .xlsx osebi z Excelom in ohranja .xls z geslom v kodi.
Za paketno delo ta razvrstilnik zasluži svoje mesto z zaganjanjem čez celoten dohodni imenik, preden kateri koli delavec začne resnično obdelavo, saj vsaka sonda stane le eno odpiranje datoteke in nekaj kilobajtov branj. Predhodno nalaganje tega podatka spremeni način odpovedi, ki ga operacije dejansko zanimajo. Namesto da umre opravilo ob 03:00 pri datoteki 412 od 600, dobite 412 datotek v vrsti in 5 zavrnjenih pri vnosu z razlogom, pritrjenim vsakemu. Isti klici knjižnice, daleč boljša operativna zgodba.
Vprašanja, na katera klic za navajanje ne more odgovoriti
Imena in vrstni red sta celotno to, kar dobite. Klici za navajanje ne povedo ničesar o vidnosti, zato skrite in zelo-skrite liste dobite v seznam, ki so videti kot kateri koli drugi. Ne poročajo o dimenzijah uporabljenega obsega, številu celic ali lastnostih dokumenta. Del docProps/core.xml je prav tako majhen, toda danes ni sonde samo za lastnosti, zato metapodatki o avtorju in naslovu še vedno zahtevajo polni Open. Čist način za živeti s tem je dovoliti poceni dejstev usmeriti vsako datoteko in rezervirati drage za datoteke, ki preživijo usmerjanje. Za datoteke, ki nadaljujejo v globoko branje, branje samo za branje velikega .xls deluje opazno hitreje z _DisableGraphics := True, ki preskoči razčlenjevanje OfficeArt. Le nikoli ne shranjujte iz tega primerka: risalna plast, ki jo je preskočil, je izginila iz modela, in shranjevanje bi jo odstranilo iz datoteke.
Datoteke, ki prestanejo triažiranje, navadno gredo v globlje analize. Revizijski in konverzijski delovni stol delovnega zvezka pokriva števce po listih, ki so vredni zbiranja, ko je polno odpiranje upravičeno, in vodnik zmogljivosti za velike delovne zvezke pokriva ohranjanje tega polnega odpiranja hitro.
HotXLS je izvorna knjižnica preglednic Object Pascal za Delphi in C++Builder; celotna API površina, vključno z inšpekcijskimi klici, prikazanimi tukaj, je dokumentirana na strani HotXLS Component.