HotXLS dokumentáció

Nagyméretű táblázatok streamelése

Áttekintés

Nagyon nagy táblázatok (pl. milliónyi kitöltött cella) memóriába történő betöltése memóriahiány-hibákhoz vezethet 32 bites folyamatokban; a HotXLS streamelő olvasókat és írókat biztosít közel állandó memóriahasználattal, megkerülve a DOM-generálást a munkafüzet elemzése során

Közvetlen olvasó API

A TXLSDirectReader osztály a munkafüzet-adatfolyamokat anélkül elemzi, hogy memóriában cellamodelleket hozna létre, és OnSheet illetve OnCell eseményeket indít, amint a kijelölt cellák előkerülnek

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;

A ParallelSheets munkavégző-szálankénti munkalap-inflatereket és XML-olvasókat engedélyez, miközben a hívó szál a visszahívásokat munkalap- és cellasorrendben bocsátja ki

A ParallelBufferMemoryLimit az aktív munkavégzőknél várakoztatott nyers cellaadatok összesített méretét korlátozza, alapértelmezett értéke 16 MiB; a ParallelPeakBufferedBytes az utolsó párhuzamos olvasás csúcsértékét jelenti ki diagnosztikai és kapacitásteszt-célokra

Minden aktív munkalap a várósor-költségvetés önálló részesedését kapja, így egy későbbi munkalap nem éheztetheti az éppen kibocsátott munkalapot; az önrésznél nagyobb egyetlen cella csökkenthetetlen hasznos teherként kerül befogadásra

Az OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane és OnMerge a felhasznált tartományt, az alapértelmezett szélességeket és magasságokat, az oszlopelterjedéseket, a sormagasságot vagy láthatóságot, a vázlat- és stílusindexeket, az ablaktábla állapotát és az egyesített tartományokat teszik elérhetővé munkalapobjektumok létrehozása nélkül

Az elrendezési visszahívások opcionálisak, és a kijelölt munkalap OnCell visszahívásai előtt, korlátos memóriájú metaadat-átmenetben futnak le; az egyesített tartományok ezért a bennük lévő cellák előtt érkeznek meg, noha az OOXML a mergeCells elemet a sheetData után tárolja

Ha a párhuzamos munkalap-elemzés be van kapcsolva, az elrendezési visszahívások a hívó szálon maradnak, és a kijelölt munkalapokra a munkavégző-várak kiürítése előtt lefutnak

Az Abort beállítása az OnCell-ben felébreszti a blokkolt termelőket és fogyasztókat, korlátos belső lépésekben leállítja a folyamatban lévő ZIP-olvasásokat és kicsomagolásokat, minden munkavégzőre vár, és újrafelhasználható állapotban hagyja az olvasót

Közvetlen író API

A TXLSDirectWriter osztály közvetlenül a ZIP fájlcsomagba írja a sorokat, minimális memóriaterhelést biztosítva nagy adatexportok generálásakor

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;

Az AddComment klasszikus cellajegyzeteket ír szerző-metaadatokkal és a hozzájuk tartozó VML jegyzetalakzatokkal munkalap-objektummodell betöltése nélkül

Az AddImage, az AddImageFromFile és az AddImageFromStream kétcellás horgonyokat, valamint PNG, JPEG, GIF, BMP, EMF vagy WMF hasznos adatokat fogad el; a fájlforrások a munkalap lezárásakor közvetlenül a ZIP bejegyzésbe kerülnek, a streamforrások esetében pedig csak a streamreferencia és a rögzített bájttartomány marad meg

Ha az AddImageFromStream OwnsStream=True értéket kap, az író a munkalap mellékpartjainak véglegesítése után felszabadítja a streamet; ellenkező esetben a hívónak a következő AddSheet vagy Close hívásig életben kell tartania a pozicionálható streamet

Az AddChart és az AddChartSeries oszlop-, sáv-, vonal-, terület-, körcikk-, fánk- vagy pontdiagram ChartML-t állít elő képlettámasztott sorozatokkal; az AddChartXml pedig teljes, hívó által szolgáltatott diagrampartot csatol a haladó diagramcsaládokhoz és bővítményekhez

A megjegyzések, a rajzhorgonyok és a diagramleírók csak az aktuális munkalaphoz tárolódnak; a sheetData lezárása után az író sorban kibocsátja a munkalap kapcsolatait, a megjegyzéseket, a VML-t, a DrawingML-t, a médiát és a ChartML-t, majd a következő munkalap kezdete előtt felszabadítja a mellékcsatorna állapotát