Strujanje velikih tabelarnih listova
Pregled
Učitavanje veoma velikih tabelarnih listova (npr. miliona popunjenih ćelija) u memoriju može dovesti do grešaka nedostatka memorije u 32-bitnim procesima; HotXLS pruža strujne čitače i zapisivače sa skoro stalnom potrošnjom memorije, zaobilazeći generisanje DOM-a tokom raščlambe radne sveske
Neposredni API čitača
Klasa TXLSDirectReader raščlanjuje tokove radne sveske bez stvaranja modela ćelija u memoriji i aktivira događaje OnSheet i OnCell kako se naiđe na izabrane ćelije
Reader := TXLSDirectReader.Create;
try
Reader.ParallelSheets := True;
Reader.ParallelMaxThreads := 4;
Reader.ParallelBufferMemoryLimit := 16 * 1024 * 1024;
Reader.OnDimension := HandleDimension;
Reader.OnColumn := HandleColumn;
Reader.OnRow := HandleRow;
Reader.OnMerge := HandleMerge;
Reader.OnCell := HandleCell;
Reader.ReadFile('large.xlsx');
finally
Reader.Free;
end;
ParallelSheets uključuje inflatere radnih listova i XML čitače po radniku, dok pozivajuća nit isporučuje povratne pozive redosledom radnih listova i ćelija
ParallelBufferMemoryLimit ograničava ukupan obim reda čekanja sirovih podataka ćelija kod svih aktivnih radnika i podrazumevano iznosi 16 MiB, dok ParallelPeakBufferedBytes prijavljuje vršnu vrednost poslednjeg paralelnog čitanja — korisno za dijagnostiku i testove kapaciteta
Svaki aktivni radni list dobija nezavisni deo budžeta reda, tako da kasniji radni list ne može da izgladni list koji se upravo emituje; pojedinačna ćelija veća od svog dela prolazi kao nesvodiv sadržaj
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane i OnMerge otkrivaju korišćeni opseg, podrazumevane širine i visine, raspone kolona, visinu ili vidljivost reda, indekse outline i stilova, stanje panea i spojene opsege — bez izgradnje objekata radnog lista
Povratni pozivi za raspored su opcioni i izvršavaju se u prolazu kroz metapodatke sa ograničenom memorijom, pre OnCell povratnih poziva izabranog lista; spojeni opsezi tako stižu pre ćelija unutar spoja, iako OOXML čuva mergeCells posle sheetData
Kada je paralelna raščlamba listova uključena, povratni pozivi za raspored ostaju na pozivajućoj niti i za izabrane listove se završavaju pre nego što se redovi radnika isprazne
Postavljanje Abort u OnCell probuđuje blokirane proizvođače i potrošače, zaustavlja tekuća ZIP čitanja i dekompresije na ograničenim internim koracima, sačeka sve radnike i čitač ostavlja ponovo upotrebljivim
Neposredni API zapisivača
Klasa TXLSDirectWriter neposredno zapisuje redove u ZIP paket datoteke, osiguravajući minimalno dodatno opterećenje memorije pri generisanju velikih izvoza podataka
Writer := TXLSDirectWriter.Create;
try
Writer.BeginFile('large.xlsx');
Writer.AddSheet('Data');
Writer.AddRow(1);
Writer.WriteString(1, 'Quarter');
Writer.WriteString(2, 'Revenue');
Writer.AddComment(2, 1, 'Validated source', 'Reviewer');
Writer.AddImageFromFile(4, 1, 8, 12, 'logo.png',
xlsDirectImagePng, 'Company logo');
ChartIndex := Writer.AddChart(9, 1, 18, 16,
xlsDirectChartColumn, 'Revenue');
Writer.AddChartSeries(ChartIndex, 'Revenue',
'Data!$A$2:$A$5', 'Data!$B$2:$B$5');
Writer.Close;
finally
Writer.Free;
end;
AddComment zapisuje klasične beleške ćelija sa metapodacima autora i odgovarajućim VML oblicima beleški, a da pri tome ne učitava model objekata radnog lista
AddImage, AddImageFromFile i AddImageFromStream prihvataju sidrenje na dve ćelije i sadržaje u formatima PNG, JPEG, GIF, BMP, EMF ili WMF; izvori iz datoteka utiču direktno u ZIP unos kada se list završi, dok izvori iz tokova zadržavaju samo referencu na tok i zabeleženi opseg bajtova
Kada AddImageFromStream dobije OwnsStream=True, zapisivač oslobađa taj tok nakon što se dopune bočni delovi radnog lista; u suprotnom pozivalac mora da održi tok s mogućnošću pozicioniranja živim do sledećeg poziva AddSheet ili Close
AddChart i AddChartSeries generišu ChartML za tipove column, bar, line, area, pie, doughnut i scatter, sa serijama potkrepljenim formulama, dok AddChartXml kači kompletan chart deo koji je dostavio pozivalac za napredne familije i proširenja grafikona
Komentari, sidra crteža i opisi grafikona čuvaju se samo za trenutni radni list; nakon što se sheetData zatvori, zapisivač redom ispisuje relacije radnog lista, komentare, VML, DrawingML, medije i ChartML, a zatim oslobađa bočno stanje pre nego što počne sledeći radni list