Код Икс Пи ☆ Центр автоматизации, сопровождения и поддержки
Загрузка данных из табличных документов, созданных в редакторе Microsoft Excel – довольно часто встречающаяся задача в работе любого программиста 1С. Программа эта широко распространена, любима пользователями и часто используется для хранения и обработки различного рода информации, будь то прайс-лист или данные по продажам за период.
Существует несколько различных методов работы с файлами Excel при загрузке данных в 1С, в том числе:
2. загрузка с помощью метода Range и последующим обращением к данным через метод GetValue();
3. загрузка с помощью метода Range и последующим обращением к данным через свойство Value;
4. загрузка с помощью технологии ADO [2] и использованием компоненты GameWithFire [3].
1. Загрузка данных с помощью свойства Cells
Этот метод используется в обработке «ЗагрузкаДанныхИзТабличногоДокумента.epf», которая присутствует на диске ИТС, и основан он на обращении к объекту Excel.Application через технологию COM с последующим последовательным чтением данных в ячейках обращением к свойству Cells.
Несомненно, такой способ гарантирует получение всех данных, содержащихся на листе Excel, однако он имеет весьма существенный недостаток – большую длительность работы при загрузке файлов больших объемов.
2. Загрузка данных с помощью метода Range и последующим обращением к данным через метод GetValue()
Этот метод так же основан на возможностях объекта Excel.Application, но, в отличие от загрузки с использованием свойства Cells, позволяет получить сразу все значения в виде двумерного массива. Работает следующим образом:
б) определяем диапазон используемых ячеек (аналогично методу 1)
в) считываем данные с помощью метода Range(начальнаяЯчейка, конечнаяЯчейка). Здесь начальная и конечная ячейки – это элементы свойства Cells, о котором шла речь выше.
В результате, в переменной Диапазон мы получим значение типа COMSafeArray, который представляет собой объектную оболочку над многомерным массивом SAFEARRAY. Иначе говоря, мы получаем массив, который, как известно, является областью памяти. А с областью в оперативной памяти работа всегда быстрее.
При этом надо учитывать, что массив этот многомерный. Для нашего случая это будет двумерный массив.
г) последовательно получаем значения из массива с помощью метода GetValue(столбец, строка)
3. Загрузка данных с помощью метода Range и последующим обращением к данным через свойство Value
Этот метод отличается от предыдущего только тем, что вместо работы с объектом типа COMSafeArray мы сразу получаем набор значений в виде стандартного массива 1С (тип Массив).
Также, в приведенном листинге вместо метода Range используется свойство UsedRange, которое, по сути, идентично значению, возвращаемому методом Range для всей используемой области листа (это свойство не годится, если нужно прочитать только какую-то часть ячеек, в отличие от метода Range).
а) подключаемся к Excel (как и в предыдущих случаях)
б) считываем данные используя свойство UsedRange и метод Выгрузить()
В результате, получаем двумерный массив типа Массив
Еще одним преимуществом данного метода является то, что каждый элемент массива Данные представляет собой массив, содержащий значение одной колонки считанного файла. Тем самым, мы можем сразу получить все возможные значения определенной колонки в виде массива, просто обратившись к соответствующему элементу переменной Данные.
4. Загрузка данных с помощью технологии ADO и использованием компоненты GameWithFire
Данный способ использует технологию ADO [2], которая реализуется с помощью библиотеки ADOdb [4] и позволяет получать доступ к любым СУБД, реализующим технологию ODBC. Собственно, Excel попадает в данный список и, следовательно, мы можем получить данные, используя указанную технологию.
Также, для указанного метода используется компонента с оригинальным названием GameWithFire, которая перекладывает результат запроса через ADO в привычную таблицу значений.
Ниже приведен листинг части кода, который демонстрирует данную возможность. Пример во многом использует материал, описанный в источнике [1].
В результате, получаем таблицу значений ТЗ, которую можем обойти любым известным образом.
Заключение
В заключение, мы хотели бы привести таблицу сравнения скорости работы вышеописанных методов и рекомендации для использования.
Замеры производились на файле Excel с числом строк 16 000 и числом колонок 20. Таким образом, общее число ячеек в области составило 320 000. Значения в таблице говорят сами за себя.
Таблица 1. Время загрузки данных из Excel в 1С при использовании различных методов
Экспорт в excel из mysql в — все про Ексель
С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.