Dokumentacija HotXLS

Strujanje velikih proračunskih tablica

Pregled

Učitavanje vrlo velikih proračunskih tablica (npr. milijuna popunjenih ćelija) u memoriju može dovesti do pogrešaka nedostatka memorije u 32-bitnim procesima; HotXLS pruža strujne čitače i zapisivače s gotovo stalnom potrošnjom memorije, zaobilazeći generiranje DOM-a tijekom raščlambe radne knjige

Izravni API čitača

Klasa TXLSDirectReader uzastopno raščlanjuje tokove radne knjige bez stvaranja modela ćelija u memoriji; ona aktivira događaje pri nailasku na ć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 omogućuje radnicima lokalne inflatere radnih listova i XML čitače, dok glavna nit emitira povratne pozive u redoslijedu radnih listova i ćelija

ParallelBufferMemoryLimit ograničava ukupni red ćelija sirovog sadržaja kroz aktivne radnike i po defaultu iznosi 16 MiB, dok ParallelPeakBufferedBytes izvještava vršnu vrijednost posljednjeg paralelnog čitanja za dijagnostiku i testove kapaciteta

Svaki aktivni radni list prima neovisan dio proračuna reda, sprječavajući da kasniji radni list izgladni radni list koji se trenutno emitira; pojedinačna ćelija veća od svog dijela prihvaća se kao nerastavljiv sadržaj

OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane i OnMerge izlaže korišteni raspon, zadane širine i visine, raspona stupaca, visinu ili vidljivost retka, indekse konture i stilova, stanje okna i spojene rasponćiće bez konstrukcije objekata radnog lista

Callbackovi rasporeda su neobavezni i izvršavaju se u prolazu metapodataka s ograničenom memorijom prije OnCell callbackova odabranog lista; spojeni rasponi stoga stižu prije ćelija unutar spajanja iako OOXML pohranjuje mergeCells nakon sheetData-a

Kada je omogućeno paralelno parsiranje listova, callbackovi rasporeda ostaju na glavnoj niti i dovršavaju se za odabrane listove prije ispuštanja radnih redova

Postavljanje Abort u OnCell-u budi blokirane proizvođače i potrošače, zaustavlja ZIP čitanja i dekompresiju u tijeku na ograničenim internim koracima, čeka sve radnike i ostavlja čitač ponovno upotrebljivim

Izravni API zapisivača

Klasa TXLSDirectWriter izravno zapisuje retke u ZIP paket datoteke, osiguravajući minimalno dodatno opterećenje memorije pri generiranju 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 bilješke ćelija s metapodacima autora i odgovarajućim VML oblicima bilješki bez učitavanja modela objekata radnog lista

AddImage, AddImageFromFile i AddImageFromStream prihvaćaju sidra s dvije ćelije i sadržaje PNG, JPEG, GIF, BMP, EMF ili WMF; izvori iz datoteka utječu izravno u ZIP unos kada se list dovrši, dok izvori iz tokova zadržavaju samo referencu toka i zabilježeni raspon bajtova

Kada AddImageFromStream primi OwnsStream=True, zapisivač otpušta taj tok nakon što se finaliziraju dijelovi strane radnog lista; inače pozivatelj mora održavati seekable tok živim do sljedećeg poziva AddSheet ili Close

AddChart i AddChartSeries generiraju ChartML za stupčaste, trake, linije, područja, torte, prstenaste ili raspršene grafikone sa serijama potkrijepljenim formulama, dok AddChartXml priključuje potpuni djelatniku posluženi dio grafikona za napredne obitelji i proširenja grafikona

Komentari, crtaćka sidra i opisnici grafikona zadržavaju se samo za trenutni radni list; nakon zatvaranja sheetData-a zapisivač sekvencijalno emitira relacije radnog lista, komentare, VML, DrawingML, medije i ChartML, a zatim otpušta bočno stanje prije početka sljedećeg radnog lista