Потокове передавання великих таблиць
Огляд
Завантаження дуже великих таблиць (напр. мільйонів заповнених комірок) у пам'ять може призвести до помилок нестачі пам'яті в 32-бітних процесах; HotXLS надає потокові читачі та писачі з майже постійним використанням пам'яті, обходячи генерацію DOM під час розбору книги
API прямого читання
Клас TXLSDirectReader розбирає потоки книги без створення моделей комірок у пам'яті та вмикає події OnSheet і OnCell у міру зустрічі з вибраними клітинками
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 вмикає окремі для кожного робочого потоку інфлятори аркушів і XML-читачі, тоді як викликаючий потік випромінює зворотні виклики в порядку аркушів і клітинок
ParallelBufferMemoryLimit обмежує сукупний обсяг поставлених у чергу сирих даних клітинок серед активних робочих потоків і типово дорівнює 16 MiB, а ParallelPeakBufferedBytes повідомляє пік останнього паралельного читання для діагностики та тестів ємності
Кожен активний аркуш отримує незалежну частку бюджету черги, що не дає пізнішому аркушу заглушити аркуш, який емітиться зараз; клітинка, більша за свою частку, приймається як неподільний payload
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane і OnMerge розкривають використаний діапазон, типові ширини та висоти, проміжки стовпців, висоту чи видимість рядків, індекси структури та стилів, стан панелей і об'єднані діапазони без побудови об'єктів аркуша
Колбеки компонування вмикаються опційно й виконуються в проході метаданих з обмеженою пам'яттю до колбеків OnCell вибраного аркуша; тому діапазони злиття надходять до клітинок усередині злиття, хоча OOXML зберігає mergeCells після sheetData
Коли ввімкнено паралельний розбір аркушів, колбеки компонування залишаються на викликаючому потоці й завершуються для вибраних аркушів до спорожнення черг робочих потоків
Встановлення Abort у OnCell будить заблокованих виробників і споживачів, зупиняє читання ZIP і декомпресію, що виконуються, на обмежених внутрішніх кроках, приєднує кожен робочий потік і залишає читач придатним для повторного використання
API прямого запису
Клас TXLSDirectWriter записує рядки безпосередньо в ZIP-пакет файлів, забезпечуючи мінімальне навантаження на пам'ять при генерації великих експортів даних
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 записує класичні примітки клітинок із метаданими автора та відповідними фігурами приміток VML без завантаження об'єктної моделі аркуша
AddImage, AddImageFromFile і AddImageFromStream приймають якорі з двох клітинок і payload PNG, JPEG, GIF, BMP, EMF або WMF; файлові джерела надходять безпосередньо до запису ZIP, коли аркуш завершується, а потокові джерела зберігають лише посилання на потік і записаний діапазон байтів
Коли AddImageFromStream отримує OwnsStream=True, писач звільняє цей потік після фіналізації частин аркуша; інакше викликач має тримати потік придатним для пошуку до наступного виклику AddSheet або Close
AddChart і AddChartSeries генерують ChartML діаграм-стовпчиків, ліній, областей, кіл, кілець або точкових із серіями на основі формул, а AddChartXml приєднює повну частину діаграми, надану викликачем, для розширених сімейств і розширень діаграм
Примітки, якорі малюнків і дескриптори діаграм зберігаються лише для поточного аркуша; після закриття sheetData писач послідовно емітить зв'язки аркуша, примітки, VML, DrawingML, медіа та ChartML, а потім звільняє стан побічного каналу перед початком наступного аркуша