Strömning av stora kalkylblad
Översikt
Inläsning av mycket stora kalkylblad (t.ex. miljontals ifyllda celler) i minnet kan leda till fel om otillräckligt minne i 32-bitars processer; HotXLS erbjuder strömmande läsare och skrivare med nästan konstant minnesanvändning, som kringgår DOM-generering vid tolkning av arbetsboken
Direct Reader-API
Klassen TXLSDirectReader tolkar arbetsboksströmmar utan att bygga cellmodeller i minnet och utlöser händelserna OnSheet och OnCell när de valda cellerna påträffas
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 aktiverar arbetsbladsinflaterare och XML-läsare per worker, medan den anropande tråden emitterar callbacks i kalkylblads- och cellordning
ParallelBufferMemoryLimit avgränsar den sammalagda kön av råcellyttlast över aktiva workers och är som standard 16 MiB, medan ParallelPeakBufferedBytes rapporterar den senaste parallella läsningens topp för diagnostik och kapacitetstester
Varje aktivt kalkylblad får en oberoende andel av köbudgeten, vilket hindrar ett senare kalkylblad från att svälta ut det kalkylblad som just nu emitreras; en enskild cell som är större än sin andel släpps igenom som odelbar nyttolast
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane och OnMerge exponerar använt område, standardbredder och -höjder, kolumnspan, radhöjd eller synlighet, disposations- och stilindex, paneltillstånd och sammanslagna områden utan att bygga kalkylbladsobjekt
Layout-callbacks är frivilliga och körs i ett minnesavgränsat metadatapass före det valda kalkylbladets OnCell-callbacks; sammanslagna områden kommer därför före cellerna inuti sammanslagningen, även om OOXML lagrar mergeCells efter sheetData
När parallell kalkylbladstolkning är påslagen körs layout-callbacks kvar på den anropande tråden och fullföljs för de valda kalkylbladen innan worker-köerna töms
Att sätta Abort i OnCell väcker blockerade producenter och konsumenter, stoppar pågående ZIP-läsningar och dekomprimering vid avgränsade interna steg, väntar in alla workers och lämnar läsaren återanvändbar
Direct Writer-API
Klassen TXLSDirectWriter skriver rader direkt till ZIP-filpaketet och säkerställer minimal minnesoverhead vid generering av stora dataexporter
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 klassiska cellkommentarer med metadata för upphovspersonen och matchande VML-kommentarformer utan att läsa in en kalkylbladsobjektmodell
AddImage, AddImageFromFile och AddImageFromStream accepterar tvåcellsankare och nyttolaster i PNG, JPEG, GIF, BMP, EMF eller WMF; filkällor flödar direkt in i ZIP-posten när kalkylbladet färdigställs, medan strömkällor bara behåller strömreferensen och det registrerade byte-området
När AddImageFromStream får OwnsStream=True släpper skrivaren strömmen efter att kalkylbladets sidodelar färdigställts; annars måste anroparen hålla den sökbara strömmen vid liv till nästa AddSheet- eller Close-anrop
AddChart och AddChartSeries genererar stapel-, kolumn-, linje-, område-, cirkel-, ring- eller punktdiagram som ChartML med formelbaserade serier, medan AddChartXml bifogar en komplett, anropargenererad diagramdel för avancerade diagramfamiljer och tillägg
Kommentarer, ritankare och diagrambeskrivare behålls bara för det aktuella kalkylbladet; efter att sheetData stängts emitterar skrivaren kalkylbladsrelationer, kommentarer, VML, DrawingML, media och ChartML i sekvens och släpper sedan sidokanaltillståndet innan nästa kalkylblad påbörjas