HotXLS-dokumentation

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