Dokumentacija HotXLS

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