HotXLS-dokumentaatio

Suurten taulukoiden suoratoisto

Yleiskatsaus

Erittäin suurten taulukoiden (esim. miljoonia täytettyjä soluja) lataaminen muistiin voi johtaa muistin loppumiseen 32-bittisissä prosesseissa; HotXLS tarjoaa suoratoistolukijoita ja -kirjoittajia, joiden muistinkulutus on lähes vakio ja jotka ohittavat DOM:n luonnin työkirjan jäsentämisen aikana

Direct Reader -rajapinta

TXLSDirectReader-luokka jäsentää työkirjavirrat luomatta solumalleja muistiin ja laukaisee OnSheet- ja OnCell-tapahtumat, kun valittuja soluja kohdataan

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 ottaa käyttöön workereittain erilliset laskentataulukon inflaterit ja XML-lukijat, kun taas kutsuva säie välittää callbackit työarkki- ja solujärjestyksessä

ParallelBufferMemoryLimit rajaa aktiivisten workerien yhteistä jonotettujen raakasolupayloadien määrää ja on oletuksena 16 MiB, kun taas ParallelPeakBufferedBytes raportoi viimeisen rinnakkaisen luvun huippuarvon diagnostiikkaa ja kapasiteettitestejä varten

Jokainen aktiivinen laskentataulukko saa itsenäisen osuuden jonobudjetista, mikä estää myöhemmän taulukon nälkiinnyttämästä parhaillaan välitettävää taulukkoa; osuuttaan suurempi yksittäinen solu hyväksytään jaettamattomana payloadina

OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane ja OnMerge paljastavat käytetyn alueen, oletusleveydet ja -korkeudet, sarakejaksot, rivin korkeuden tai näkyvyyden, jäsennys- ja tyyliindeksit, ruudun tilan sekä yhdistetyt alueet rakentamatta laskentataulukkoobjekteja

Asettelucallbackit ovat valinnaisia ja suoritetaan rajatun muistin metatietovaiheessa ennen valitun taulukon OnCell-callbackeja; yhdistetyt alueet saapuvat siksi ennen yhdistämisen sisällä olevia soluja, vaikka OOXML tallentaa mergeCellsin sheetDatan jälkeen

Kun rinnakkainen taulukkojäsennys on käytössä, asettelucallbackit pysyvät kutsuvassa säikeessä ja valmistuvat valituille taulukoille ennen workerijonojen tyhjentämistä

Abortin asettaminen OnCellissä herättää tukossa olevat tuottajat ja kuluttajat, pysäyttää kesken olevat ZIP-luvut ja pakkauksen purkamisen rajatuissa sisäisissä vaiheissa, liittää kaikki workerit ja jättää lukijan uudelleenkäytettäväksi

Direct Writer -rajapinta

TXLSDirectWriter-luokka kirjoittaa rivit suoraan ZIP-tiedostopakettiin ja varmistaa minimaalisen muistiylikustannuksen suuria tietojen vientiä luotaessa

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 kirjoittaa klassiset solukommentit tekijämetatietoineen ja vastaavine VML-kommenttimuotoineen lataamatta laskentataulukon objektimallia

AddImage, AddImageFromFile ja AddImageFromStream hyväksyvät kaksisoluiset ankkurit sekä PNG-, JPEG-, GIF-, BMP-, EMF- tai WMF-payloadit; tiedostolähteet virtaavat suoraan ZIP-alkioon, kun taulukko valmistuu, kun taas virtalähteet säilyttävät vain virtaviittauksen ja kirjatun tavualueen

Kun AddImageFromStream vastaanottaa arvon OwnsStream=True, kirjoitin vapauttaa virran laskentataulukon sivuosien viimeistelyn jälkeen; muuten kutsujan on pidettävä haettavissa oleva virta elossa seuraavaan AddSheet- tai Close-kutsuun asti

AddChart ja AddChartSeries tuottavat pylväs-, palkki-, viiva-, alue-, piirakka-, rengas- tai hajontakaavioiden ChartML:ää kaavapohjaisine sarjoineen, kun taas AddChartXml liittää täyden soittajan toimittaman kaavioosan edistyneitä kaavioperheitä ja laajennuksia varten

Kommentit, piirrosankkurit ja kaaviokuvaajat pidetään muistissa vain nykyistä laskentataulukkoa varten; sheetDatan sulkeuduttua kirjoitin tuottaa laskentataulukon relaatiot, kommentit, VML:n, DrawingML:n, median ja ChartML:n peräkkäin ja vapauttaa sivukanavatilan ennen seuraavan laskentataulukon alkua