В настоящее время существует большое количество разнообразных форматов электронных таблиц – Excel, Star Office и прочие.
Часто входящие данные для программ подготавливаются именно в формате электронной таблице, поэтому возникает задача унификации загрузки данных из таких таблиц.
Обычно электронная таблица представляет собой набор листов. Лист состоит из строк и колонок, на пересечении которых находятся ячейки, в которых могут храниться значения примитивных типов: число, дата, строка.
В моделировании чтения электронных таблиц используется объектно-ориентированный подход – в базовом классе «Чтец электронных таблиц» описывается общее поведение всех электронных таблиц, а в классах-наследниках описываются особенности реализации тех или иных электронных таблиц.
Такой подход позволяет, не меняя кода программы, поменять только тип используемой электронной таблицы и получить поддержку работы с этой электронной таблицей.
В настоящее время реализованы следующие способы доступа к файлам Excel:
§ EXCEL – классическое подключение к Excel через COM-объект «Excel.Application»:
o Медленное создание приложения для доступа к данным
o Возможны зависшие в памяти сессии
o Медленное чтение данных – по одной ячейке
§ EXCELADO – подключение к Excel через ADO
o Быстрое соединение с источником данных
o Ограничения по числу колонок – большие листы не читаются (важно!)
o Все данные получаются в виде строки, без поддержки типа, числа и дата конвертируются по установленным на компьютере локальным настройкам
o Данные загружаются из всего диапазона сразу.
o Достаточно быстрое чтение данных
§ EXCELCSA – классическое подключение к Excel через COM-объект «Excel.Application», но чтение данных из всего диапазона сразу через Com Safe Array:
o Медленное создание приложения для доступа к данным
o Возможны зависшие в памяти сессии
o Достаточно эффективное, сравнимое с ADO по скорости чтение данных, всего диапазона сразу.
Ничто не мешает написать драйвер такого же формата и для таблиц Open Office, файлам DBF и т.п.
На практике у меня была задача чтения из порядка 100 файлов Excel различных таблиц. Все методы показали примерно одинаковую производительность, т.к. данные читались не из всех ячеек, поэтому стандартное соединение EXCEL работало не хуже чем EXCEL CSA. Проверить EXCELADO на этой задаче не получилось, т.к. в листах было много колонок, а с такими листами EXCELADO работать не умеет.
На уровне базового класса поддерживается чтение не всего листа, а только указанного прямоугольного диапазона.
Задача показала необходимость выделения кода для создания соединения. Т.к. в вариантах EXCEL и EXCEL CSA на создание соединения тратится до 50% времени, можно создать соединение, а затем в цикле не закрывая соединения, читать файлы, и только в конце закрыть соединение.
Методы:
§ «Данные» - получает данные в виде таблицы значений
§ «Значение» - получает данные из конкретной ячейки
Для простоты основной метод «Данные» пишется в стиле «прочитать данные из указанной прямоугольной области и поместить их в результирующую таблицу данных, начиная с такой-то ячейки». Это позволяет вынести всю логику установки ограничений по рамкам на верхний уровень, в базовый класс, сосредоточившись в классе-наследнике собственно на чтении данных.
Методы «Открыть/Закрыть» открывают и закрывают книгу, а «Открыть соединение/Закрыть» соединение открывают и закрывают соединение.
Пакет содержит базу данных, в которой можно протестировать чтение любого Excel-файла по любому из вариантов доступа.
Обработка «Тест чтеца электронных таблиц» демонстрирует, как писать код для работы с обработкой.
Файл, на котором можно протестировать рамочное чтение и вообще чтение из Excel: «R:\1с. Инструменты\Чтец электронных таблиц\Простой файл склад-товар-контрагент-количество.xls»
Документация в случае интереса к разработке будет дописана, и детализирована.
Пока что через ADO не поддерживается преобразование даты из строки в дату. Преобразование строки в число поддерживается.
Планируется написать класс для чтения Open Office.