HotXLS pohranjuje ćelije radnog lista u kompaktnim blokovima od 256 redaka, razrješuje formatiranje redaka, stupaca i pravokutnika kroz lijene preklopne slojeve umjesto stvaranja objekata ćelija, a pri spremanju struji svaki redak izravno u deflate stream paketa. Zajedno te tri promjene odlučuju profil memorije velike radne knjige: vršna uporaba slijedi najveći pojedinačni redak, a ne veličinu cijelog XML-a radnog lista
Razlog zašto je to važno oblik je koji svaki razvojni programer proračunskih tablica naposljetku susretne. Korisnik formatira cijeli stupac, jedan klik, milijun ćelija, a naivni objektni model odgovara alociranjem milijun objekata ćelija da drže jedan indeks formata broja. Datoteka na disku ostaje sićušna jer XLSX format to izražava kao jedan unos <col>. Proces uopće ne ostaje sićušan
Zašto formatiranje stupca košta više memorije nego njegovo popunjavanje?
Zato što formatiranje nema podataka koji bi opravdali objekt. Ćelija s vrijednošću mora postojati negdje. Ćelija koja je prazna, a stilizirana, postoji samo da nosi indeks stila, a materijaliziranje milijuna takvih klasičan je način na koji Delphi aplikacija za proračunske tablice ponestane adresnog prostora na datoteci koju Excel otvara istog trenutka
Preklopni slojevi intervala stila uklanjaju potrebu. Instrukcija formatiranja retka, stupca ili pravokutnika pohranjuje se jednom kao raspon plus dijelovi stila koje doprinosi, a razrješava lijeno kad se ćelija u tom rasponu doista pristupi. Slojevi preživljavaju strukturalna uređivanja, umetanje retka unutar formatiranog bloka pomiče interval umjesto da ga ponovno izgradi, a u povratnom putu pojavljuju se kao kompaktni unosi stupaca, redaka i ćelija samo sa stilom, što je upravo onako kako ih Excel zapisuje
var
Sheet: TXLSXWorksheet;
State: TXLSXCellStyleState;
begin
Sheet := Workbook.Sheets[1];
// Style indexes come from the workbook style pools, e.g. from a cell
// you have already formatted the way you want the range to look
State := BuildStateFromTemplateCell(Sheet.Cells.Item[1, 1]);
// Format columns B..D without creating a single empty cell object
Sheet.StyleOverlays.Add(1, 2, MaxRowIndex, 4,
[xfpNumberFormat, xfpAlignment], State);
end;
TXLSXFormatParts skup je koji odlučuje što sloj doprinosi: xfpFont, xfpFill, xfpBorder, xfpNumberFormat, xfpAlignment i xfpProtection. Navođenje samo dijelova koje mislite ono je što dopušta slojevima da se razumno slažu; sloj stupca koji isporučuje format broja ne sukobljava se sa slojem retka koji isporučuje ispunu, jer nijedan ne polaže pravo na dio onog drugog
Što vam daje blok od 256 redaka
Lokalitet. Ćelije se drže u blokovima od 256 redaka sa stabilnim javnim ručicama, serijalizirano po retku, pa pisanje radnog lista hoda memorijom redoslijedom kojim će emitirati bajtove, umjesto da juri pokazivače po gomili. Stabilne ručice važne su za površinu API-ja: ručica koju pozivatelj drži ostaje valjana kroz unutarnju reorganizaciju koju izvodi raspored blokova, što čini kompaktnu reprezentaciju detaljem implementacije, a ne prekinom promjenom
Kompakcija skupa stilova teče uz to. Prije svakog spremanja, fontovi, ispune, okviri, formati brojeva, poravnanja i zaštite koje nijedna ćelija ne referencira ispuštaju se. Dugovječne radne knjige nakupljaju nereferencirane zapise stilova onako kako dugovječni dokumenti nakupljaju nekorištene stilove, a radna knjiga koju je korisnik uređivao sat vremena može nositi stotine njih u datoteku iz koje ih nitko nikad neće pročitati
Spremanje strujano po retku i kad se ne primjenjuje
S StreamingWrite omogućenim, zadanim, svaki redak radnog lista zapisuje se izravno u deflate stream paketa. Alternativa, koju oznaka isključuje, najprije izgrađuje cijeli XML radnog lista, a zatim ga komprimiranja, pa se vršna memorija skalira s cijelim listom. Strujanje je čini skaliranom s jednim retkom
Dijeljeni nizovi i pomoćni dijelovi slijede istu disciplinu kroz jedan višekratni UTF-8 serijalizator koji emitira unose jedan po jedan, ograničavajući vršnu memoriju najvećim pojedinačnim unosom, a ne cijelim dijelom. To pokriva tablicu dijeljenih nizova i zapise zaokreta, koji na širokoj analitičkoj radnoj knjizi često jesu veći od bilo kojeg pojedinačnog radnog lista
var
Workbook: TXLSXWorkbook;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.Open('ledger-2026.xlsx');
// StreamingWrite defaults to True; turn it off only when a downstream
// step requires the whole worksheet XML to exist before compression
Workbook.StreamingWrite := True;
Workbook.SaveAs('ledger-2026-out.xlsx');
finally
Workbook.Free;
end;
end;
Ostavite ga uključen osim ako imate konkretnog razloga za drugačije. Nestrujani put postoji za slučajeve kad nešto drugo u cjevovodu treba sastavljeni XML, a plaćanje za to zadano plaćanje je za slučaj u koji većina aplikacija nikad ne ulazi
Kako rasuđivati koriste li se slojevi doista
Pazite na broj ćelija, a ne na graf memorije. Ako radni list prijavljuje razuman broj fizičkih ćelija nakon što ste primijenili široko formatiranje, slojevi obavljaju svoj posao. Ako broj skoči za veličinu formatiranog raspona, nešto u putu koda materijaliziralo je ćelije, obično petlja koja čita svaku ćeliju u rasponu da provjeri njen stil, što prisiljava razrješavanje jednu ćeliju u vrijeme i poništava cijeli raspored
Razrješite stil kad treba učinkovit format jedne ćelije. Nemojte razrješivati stil za milijun ćelija da biste saznali da stupac ima format broja, pitajte sloj. Isto pravilo vrijedi za pisanje: dodijelite vrijednosti ćelijama koje imaju vrijednosti i pustite da formatiranje ostane interval
Gdje odlazi preostala memorija
Kad su ćelije i stilovi kompaktni, sljedeći najveći potrošači na velikoj radnoj knjizi jesu tablica dijeljenih nizova i satelitski dijelovi koje datoteka nosi, predmemorije zaokreta, crteži, pohranjeni XML iz dijelova koje objektni model ne modelira. Oni imaju vlastite strategije, a iskren odgovor jest da ni jedno podešavanje ne rješava sve odjednom
Ako vam je usko grlo otvaranje, a ne spremanje, selektivno učitavanje jest poluga: prikaz učitavanja samo s metapodacima i selektivnog učitavanja radnih listova pokriva čitanje radne knjige bez plaćanja za listove koje nećete dotaknuti. Za propusnost put čitanja na vrlo velikim datotekama pogledajte bilješke o paralelnoj XLSX raščlambi i alokatoru memorije, a za opterećenja samo izlaza kojima objektni model nikad ne treba, strujna pisanja za serijske poslove poslužitelja obično su bolji pristup nego bilo koliko tuniranja ovdje
HotXLS čita i zapisuje XLS i XLSX iz izvornog Delphi i C++Builder koda bez instalacije Excela i bez OLE automatizacije, što upravo čini te značajke memorije uočljivima i upravljivima. Na stranici HotXLS komponente proračunskih tablica navedeni su podržani formati i verzije RAD Studio