При импорте данных из файлов Excel формата .xls или .xlsx разработчики часто сталкиваются с ситуацией, когда стандартный метод Прочитать() объекта ТабличныйДокумент загружает данные всех листов книги одновременно, объединяя их разрывами страниц. Разберем по шагам, как устроена работа платформы 1С с многостраничными документами Excel и какими способами можно выгрузить данные только нужного листа.
Рассмотрим, как платформа 1С по умолчанию обрабатывает файлы Excel. При вызове метода ТабДок.Прочитать(ИмяФайла) происходит следующее:
ТабличныйДокумент.ОбластьТабличногоДокумента)._. Если имя листа начинается с цифры, в начало имени области добавляется символ _.Поскольку встроенный метод Прочитать() не содержит параметров для указания конкретного номера или имени листа, фильтрацию приходится выполнять после загрузки или использовать альтернативные способы.
Проанализируем самый простой вариант, не требующий установки сторонних программ и внешних библиотек. Так как платформа при чтении создала именованные области для каждого листа, мы можем считать файл целиком, а затем получить только интересующую нас область методом ПолучитьОбласть().
Рассмотрим пример кода:
ТабДокЗагрузка = Новый ТабличныйДокумент;
ТабДокЗагрузка.Прочитать(ИмяФайла);
// Имя области соответствует названию листа Excel (учитывая замену пробелов на _)
ИмяНужногоЛиста = "Лист1";
Попытка
ОбластьЛиста = ТабДокЗагрузка.ПолучитьОбласть(ИмяНужногоЛиста);
// Помещаем данные нужного листа в новый табличный документ
ТабДокРезультат = Новый ТабличныйДокумент;
ТабДокРезультат.Вывести(ОбластьЛиста);
// Далее работаем с ТабДокРезультат
КоличествоСтрок = ТабДокРезультат.ВысотаТаблицы;
КоличествоКолонок = ТабДокРезультат.ШиринаТаблицы;
Исключение
Сообщить("Не удалось найти лист с именем: " + ИмяНужногоЛиста);
КонецПопытки;
Файлы формата .xlsx представляют собой ZIP-архив, содержащий XML-файлы с данными. Если требуется высокая скорость работы и обработка только конкретной страницы без загрузки всей книги в память 1С, разберем алгоритм прямой работы с файлом:
.xlsx файл как ZIP-архив во временный каталог с помощью объекта ЧтениеZipФайла.xl\worksheets\ внутри распакованного каталога. Листы хранятся в файлах вида sheet1.xml, sheet2.xml и так далее.ЧтениеXML или ПостроительDOM.Этот способ отличается высокой скоростью выполнения, однако требует написания кода для разбора XML-структуры ячеек и стилей Excel.
Если штатные возможности табличного документа не подходят под задачу, рассмотрим еще несколько распространенных подходов:
Excel.Application): Позволяет открыть книгу и обратиться к конкретному листу по имени или индексу через коллекцию Worksheets. Подходит только для Windows-серверов или клиентов с установленным Microsoft Excel.ADODB.Connection): Файл Excel подключается как база данных, а нужный лист выступает в роли таблицы (например, SELECT * FROM [Лист1$]). Метод работает быстро, но требователен к установленным провайдерам OLE DB/ACE.