Strømming av store regneark
Oversikt
Innlasting av svært store regneark (f.eks. millioner av utfylte celler) i minnet kan føre til feil om ikke nok minne i 32-bits prosesser; HotXLS tilbyr strømmende lesere og skrivere med nesten konstant minnebruk, som går utenom DOM-generering under tolkning av arbeidsboken
Direct Reader-API
Klassen TXLSDirectReader tolker arbeidsbokstrømmer uten å bygge cellemodeller i minnet, og utløser OnSheet og OnCell-hendelser etter hvert som utvalgte celler treffes
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 aktiverer worker-lokale regnearkinflatere og XML-lesere, mens kalltråden sender hendelser i regneark- og cellerekkefølge
ParallelBufferMemoryLimit begrenser den samlede kølagrede råcelle-payloaden på tvers av aktive workers og er som standard 16 MiB, mens ParallelPeakBufferedBytes rapporterer den forrige parallelle lesingens toppverdi for diagnostikk og kapasitetstester
Dette lar deg skanne regnearkrader sekvensielt og avbryte tidlig når måldatagrensene er løst
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane og OnMerge eksponerer brukt område, standardbredder og -høyder, kolonnespenn, radhøyde eller synlighet, disposjons- og stilindekser, rutilstand og sammenslåtte områder uten å bygge regnearkobjekter
Layout-Callback er opt-in og kjører i et metadatapass med begrenset minne før OnCell-hendelsene for det valgte regnearket; sammenslåtte områder kommer derfor før cellene inne i sammenslåingen, selv om OOXML lagrer mergeCells etter sheetData
Når parallel arkparsing er aktivert, forblir layout-Callback på kalltråden og fullføres for de valgte regnearkene før worker-køene tømmes
Å sette Abort i OnCell vekker blokkerte produsenter og forbrukere, stopper pågående ZIP-lesinger og dekompresjon ved avgrensede interne trinn, venter inn alle workers og lar readeren være gjenbrukbar
Direct Writer-API
Klassen TXLSDirectWriter skriver rader direkte til ZIP-filpakken og sikrer minimal minneoverhead ved generering av store dataeksporter
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 skriver klassiske cellenotater med forfattermetadata og tilhørende VML-notatformer uten å laste en regnearkobjektmodell
AddImage, AddImageFromFile og AddImageFromStream godtar tocelleankre og PNG-, JPEG-, GIF-, BMP-, EMF- eller WMF-payloads; filkilder flyter rett inn i ZIP-oppføringen når arket fullføres, mens strømkilder bare beholder strømreferansen og det registrerte byteområdet
Når AddImageFromStream får OwnsStream=True, frigjør writeren strømmen etter at regnearkets sidedeler er ferdigstilt; ellers må kalleren holde den søkbare strømmen i live til neste AddSheet- eller Close-kall
AddChart og AddChartSeries genererer kolonne-, stolpe-, linje-, område-, sektor-, ring- og punktdiagrammer som ChartML med formelbaserte serier, mens AddChartXml legger ved en komplett diagramdel levert av kalleren for avanserte diagramfamilier og utvidelser
Kommentarer, tegnankre og diagrambeskrivelser beholdes bare for det gjeldende regnearket; etter at sheetData lukkes, skriver writeren regnearkrelasjoner, kommentarer, VML, DrawingML, medier og ChartML sekvensielt, og frigjør deretter sidekanal-tilstanden før neste regneark begynner