HotXLS-documentatie

Streaming van grote werkbladen

Overzicht

Het laden van zeer grote werkbladen (bijv. miljoenen gevulde cellen) in het geheugen kan leiden tot out-of-memory-fouten in 32-bits processen; HotXLS biedt streaminglezers en -schrijvers met bijna constant geheugengebruik, waardoor DOM-generatie tijdens het parseren van werkmappen wordt omzeild

Directe lezer-API

De klasse TXLSDirectReader parseert werkmapstreams zonder in-memory celmodellen op te bouwen, en vuurt de events OnSheet en OnCell af zodra geselecteerde cellen worden tegengekomen

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 schakelt worker-lokale worksheet-inflaters en XML-readers in, terwijl de aanroepende thread de callbacks in werkblad- en celvolgorde afvuurt

ParallelBufferMemoryLimit begrenst de totale hoeveelheid gecachte raw-cellpayloads over actieve workers en staat standaard op 16 MiB, terwijl ParallelPeakBufferedBytes het piek van de laatste parallelle lezing rapporteert, voor diagnostiek en capaciteitstests

De klasse TXLSDirectReader parseert werkmapstreams opeenvolgend zonder in-geheugen celmodellen te maken; het vuurt evenementen af wanneer cellen worden aangetroffen

OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane en OnMerge leggen de gebruikte range, standaardbreedtes en -hoogtes, kolomspans, rijhoogte of -zichtbaarheid, outline- en stijlindexen, deelvensterstatus en samengevoegde bereiken bloot, zonder werkbladobjecten op te bouwen

Layout-callbacks zijn opt-in en draaien in een metadata-pass met begrensd geheugen vóór de OnCell-callbacks van het geselecteerde werkblad; samengevoegde bereiken arriveren daardoor vóór de cellen binnen de samenvoeging, ook al bewaart OOXML mergeCells pas na sheetData

Wanneer parallelle werkbladfparseing is ingeschakeld, blijven layout-callbacks op de aanroepende thread en zijn ze klaar voor de geselecteerde werkbladen voordat worker-wachtrijen worden leeggemaakt

Het zetten van Abort in OnCell wekt geblokkeerde producenten en consumenten, stopt lopende ZIP-lezingen en decompressie op begrensde interne stappen, wacht op alle workers en laat de reader herbruikbaar achter

Directe schrijver-API

De klasse TXLSDirectWriter schrijft rijen rechtstreeks naar het ZIP-bestandspakket, wat minimale geheugenoverhead garandeert bij het genereren van grote gegevensexports

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 schrijft klassieke celnotities met auteursmetadata en de bijbehorende VML-notitieshapes, zonder een werkbladobjectmodel te laden

AddImage, AddImageFromFile en AddImageFromStream accepteren ankers over twee cellen en payloads in PNG, JPEG, GIF, BMP, EMF of WMF; bestandsbronnen stromen bij het afronden van het werkblad rechtstreeks naar het ZIP-item, terwijl streambronnen alleen de streamverwijzing en de geregistreerde byte-range vasthouden

Wanneer AddImageFromStream OwnsStream=True meekrijgt, geeft de writer die stream vrij nadat de side-parts van het werkblad zijn afgerond; anders moet de aanroeper de doorzoekbare stream in leven houden tot de volgende AddSheet of Close

AddChart en AddChartSeries genereren kolom-, staaf-, lijn-, vlak-, cirkel-, donut- of spreidings-ChartML met op formules gebaseerde series, terwijl AddChartXml een compleet, door de aanroeper aangeleverd chart-part koppelt voor geavanceerde grafiekfamilies en uitbreidingen

Opmerkingen, tekenankers en grafiekbeschrijvingen worden alleen voor het huidige werkblad bewaard; na het sluiten van sheetData schrijft de writer achtereenvolgens de werkbladrelaties, opmerkingen, VML, DrawingML, media en ChartML weg en geeft daarna de side-channel-status vrij voordat het volgende werkblad begint