Didelių skaičiuoklių srautinis perdavimas
Apžvalga
Labai didelių skaičiuoklių (pvz. milijonų užpildytų langelių) įkėlimas į atmintį gali sukelti atminties trūkumo klaidas 32 bitų procesuose; HotXLS pateikia srautinius skaitytuvus ir rašytuvus su beveik pastovia atminties sąnauda, apeidamas DOM generavimą darbo knygos analizės metu
Tiesioginis skaitytuvo API
Klasė TXLSDirectReader nuosekliai analizuoja darbo knygos srautus nekurdama atminties langelių modelių; ji suaktyvina įvykius sutikus langelius
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;
Tai leidžia jums nuosekliai peržvelgti lapo eilutes ir anksti nutraukti, kai tikslinių duomenų ribos yra išspręstos
ParallelBufferMemoryLimit riboja aktyvių darbuotojų agreguotą eilėje laikomą žalių langelių krūvį ir pagal numatymą yra 16 MiB, o ParallelPeakBufferedBytes diagnostikai ir talpos testams praneša paskutinio paralelinio skaitymo piką
Kiekvienas aktyvusis darbalapis gauna nepriklausomą eilės biudžeto dalį — vėlesnis darbalapis negali išvarginti šiuo metu išvedamo; vienas langelis, viršijantis jo dalį, priimamas kaip nedalomas duomenų paketas
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane ir OnMerge atskleidžia naudojamą diapazoną, numatytuosius stulpelių plotį ir eilučių aukštį, stulpelių ištisas, eilutės aukštį ar matomumą, struktūros ir stilių indeksus, panelės būseną ir sujungtus diapazonus, nesukurdami darbalapio objektų
Išdėstymo atgaliniai iškvietimai — savavališkai ijungiami ir vyksta ribotos atminties metaduomenų praėjime prieš pasirinktojo lakšto OnCell iškvietimus; todėl sujungimų diapazonai atkeliauja prieš langelius sujungimo viduje, nors OOXML mergeCells saugo po sheetData
Kai įjungta paralelinė darbalapių analizė, išdėstymo atgaliniai iškvietimai lieka kviečiančioje gijoje ir pasirinktiems darbalapiams užbaigiami, kol darbuotojų eilės dar neištuštintos
Abort nustatymas OnCell metu pažadina užblokuotus gamintojus ir vartotojus, ribotu vidiniu žingsniu sustabdo vykstančius ZIP skaitymus ir išskleidimą, palaukia visų darbuotojų ir palieka skaitytuvą tinkamą pakartotinei naudai
Tiesioginis rašytuvo API
Klasė TXLSDirectWriter rašo eilutes tiesiogiai į ZIP failo paketą, užtikrindama minimalią atminties papildomą naštą generuojant didelius duomenų eksportus
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 rašo klasikines langelių pastabas su autoriaus metaduomenimis ir atitinkamomis VML pastabų figūromis, neįkeldamas darbalapio objektinio modelio
AddImage, AddImageFromFile ir AddImageFromStream priima dviejų langelių inkarus bei PNG, JPEG, GIF, BMP, EMF arba WMF duomenis; failų šaltiniai baigiantis lakštui tiesiai teka į ZIP įrašą, o srauto šaltiniai išlaiko tik srauto nuorodą ir užfiksuotą baitų intervalą
Kai AddImageFromStream gauna OwnsStream=True, rašytuvas tą srautą atlaisvina baigus darbalapio šonines dalis; kitu atveju kviestiejas privalo išlaikyti pozicionuojamąjį srautą gyvą iki kitos AddSheet arba Close kvietimo
AddChart ir AddChartSeries sugeneruoja stulpelinę, juostinę, linijinę, ploto, skritulinę, žiedinę ar sklaidos ChartML diagramą su formulėmis paremtomis serijomis, o AddChartXml prideda pilną kviestiejo pateiktą diagramos dalį pažangesnėms diagramų šeimoms ir plėtiniams
Komentarai, piešinių inkarai ir diagramų aprašai retinami tik dabartiniam darbalapiui; užvėrus sheetData, rašytuvas nuosekliai išveda darbalapio santykius, komentarus, VML, DrawingML, mediją ir ChartML, tuomet prieš kitą darbalapį atlaisvina šoninio kanalo būseną