Использование API LightCells

Архитектура событийного управления

Aspose.Cells предоставляет API LightCells, преимущественно предназначенный для манипулирования данными ячейки одна за другой без построения полной модели данных (используя коллекцию Cell и т. д.) в памяти. Он работает в режиме событийного управления.

Для сохранения рабочих книг предоставьте содержание ячейки по ячейке при сохранении, и компонент сохранит его непосредственно в выходной файл.

При считывании файлов-шаблонов компонент анализирует каждую ячейку и предоставляет их значение по одной.

В обоих процедурах обрабатывается один объект ячейки, а затем он удаляется, объект Workbook не хранит коллекцию. В этом режиме, следовательно, память экономится при импорте и экспорте файлов Microsoft Excel с большим набором данных, который иначе использовал бы много памяти.

Несмотря на то, что API LightCells обрабатывает ячейки одинаково для файлов XLSX и XLS (он на самом деле не загружает все ячейки в память, а обрабатывает одну ячейку, а затем удаляет ее), он более эффективно экономит память для файлов XLSX, чем для файлов XLS из-за разных моделей данных и структур двух форматов.

Однако для файлов XLS для экономии памяти разработчики могут указать временное местоположение для сохранения временных данных, генерируемых в процессе сохранения. Обычно использование API LightCells для сохранения файла XLSX может сэкономить 50% или более памяти по сравнению с обычным способом, сохранение XLS может сэкономить от 20 до 40% памяти.

Запись больших файлов Excel

Aspose.Cells предоставляет интерфейс LightCellsDataProvider, который должен быть реализован в вашей программе. Интерфейс представляет поставщика данных для сохранения больших электронных таблиц в режиме легкого веса.

При сохранении книги этим способом, метод startSheet(int) проверяется при сохранении каждого листа в книге. Для одного листа, если startSheet(int) возвращает true, то все данные и свойства строк и ячеек этого листа, которые нужно сохранить, предоставляются этой реализацией. В первую очередь вызывается метод nextRow(), чтобы получить следующий индекс строки для сохранения. Если возвращается допустимый индекс строки (индекс строки должен быть в порядке возрастания для строк, которые нужно сохранить), то предоставляется объект Row, представляющий эту строку, для установки ее свойств с помощью метода startRow(Row).

Для одной строки сначала проверяется метод nextCell(). Если возвращается допустимый индекс столбца (индекс столбца должен быть в порядке возрастания для всех ячеек одной строки, которые нужно сохранить), то предоставляется объект Cell, представляющий эту ячейку, для установки данных и свойств с помощью метода startCell(Cell). После установки данных этой ячейки она непосредственно сохраняется в сгенерированный файл электронной таблицы, и следующая ячейка проверяется и обрабатывается.

В следующем примере показано, как работает API LightCells.

В следующей программе создается огромный файл с 100 000 записями на листе, заполненный данными. Мы добавили некоторые гиперссылки, строковые значения, числовые значения и также формулы для определенных ячеек на листе. Кроме того, мы также применили форматирование для диапазона ячеек.

Чтение больших файлов Excel

Aspose.Cells предоставляет интерфейс LightCellsDataHandler, который должен быть реализован в вашей программе. Интерфейс представляет поставщика данных для чтения больших электронных таблиц в режиме легкого веса.

При чтении книги в этом режиме метод startSheet() проверяется при чтении каждого листа в книге. Для листа, если startSheet() возвращает true, то все данные и свойства ячеек в строках и столбцах этого листа проверяются и обрабатываются. Для каждой строки вызывается метод startRow() для проверки того, нужно ли ее обрабатывать. Если строку нужно обработать, то сначала считываются свойства строки, и разработчики могут получить доступ к ее свойствам с помощью метода processRow().

Если также нужно обрабатывать ячейки строки, то метод processRow() возвращает true, и для каждой существующей ячейки в строке вызывается метод startCell() для проверки того, ее нужно обрабатывать или нет. Если нужно, вызывается метод processCell().

Приведенный ниже образец кода иллюстрирует этот процесс. Программа читает большой файл с миллионами записей. На чтение каждого листа в книге требуется немного времени. В примере кода осуществляется чтение файла и определяется общее количество ячеек, количество строк и количество формул на каждом листе.

Класс, реализующий интерфейс LightCellsDataHandler