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