Загрузка из EXCEL в 1С. Список листов EXCEL

18.04.15

Интеграция - Загрузка и выгрузка в Excel

ПРАКТИЧЕСКОЕ ПОСОБИЕ РАЗРАБОТЧИКА: Методы получения списка листов файлов типа EXCEL.
Поддерживаемые типы: *.xls,*.xlsx,*.ods,*.sxc.

В данной статье приведен функционал, с помощью которого в обработке
"Импорт из EXCEL и др.источников (xls,xlsx,ods,sxc,dbf,mxl,csv,sql) в 1С": //infostart.ru/public/120961
производится считывание данных из файлов табличного типа *xls, *.xlsx, *.ods, *.sxc.

Методы загрузки из внешнего источника:
- Метод "MS ADO" (Чтение файлов xls, xlsx средствами Microsoft ADO): //infostart.ru/public/163640/
- Метод "MS EXCEL" (Чтение файлов xls, xlsx с картинками средствами Microsoft Office): //infostart.ru/public/163641/
- Метод "LO CALC" (Чтение файлов xls, xlsx, ods, sxc с картинками средствами LibreOffice): //infostart.ru/public/163642/
- Метод "NativeXLSX" (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): //infostart.ru/public/300092/
- Метод "NativeXLSX". Предыдущий вариант (Чтение файлов xlsx средствами 1С. ЧтениеXML):
//infostart.ru/public/225624/
- Метод "Excel1C" (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): //infostart.ru/public/341855/
- Список листов файла: //infostart.ru/public/163724/


Публикаций на тему загрузки из EXCEL - множество, но
"
— Вам билетёр нужен?
— Был нужен, да уже взяли.
— Может и я на что сгожусь?
— Может и сгодишься, если скалиться не будешь ...
"
"НЕУЛОВИМЫЕ МСТИТЕЛИ" (1966).


// Функция возвращает список значений, содержащий имена листов книги EXCEL или Пустой СписокЗначений.
//
// Параметры:
//     ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением).

//    
ПодключениеADODB - Тип драйвера ADODB для подключения к EXCEL.
//
// Возвращаемые значения:

//     СписокЛистов - Список имен листов в файле, например: Лист1, Лист2, Лист3.
//
Функция ФайлExcelПолучитьСписокЛистов(Знач ФайлEXCEL, Знач ПодключениеADODB = "MicrosoftJetOLEDB40")
    Перем СписокЛистов, ВсегоЛистов, ИмяЛиста, МассивЛистов;
    Перем ServiceManager, Desktop, Properties1, Properties2, Arguments, Book, Sheets;
    Перем СonnectionString, ADODBConnection, ADOXCatalog;
 
    СписокЛистов = Новый СписокЗначений;
    
    Файл = Новый Файл(ФайлEXCEL);
    
    Если ВРег(Файл.Расширение) = ".ODS" ИЛИ ВРег(Файл.Расширение) = ".SXC" Тогда
        
        // Для файлов типа .ODS,*.SXC используем ServiceManager LibreOffice.
        
        Попытка
            // Инициализация основного СОМОбъекта типа com.sun.star.ServiceManager (LibreOffice/OpenOffice).            
            ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
            
            // Инициализация дочернего объекта Desktop.
            Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
            
            // Объявление свойств и аргументов для создания объекта типа Книга EXCEL.
            Properties1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
            Properties1.Name = "AsFile";            // Свойство "КАК ФАЙЛ", альтернатива "AsTemplate" - "КАК ШАБЛОН".
            Properties1.Value = Истина;
            
            Properties2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
            Properties2.Name = "Hidden";            // Запускать скрытно. Реализовано в LibreOffice 3.6.
            Properties2.Value = Истина;
            
            Arguments = Новый COMSafeArray("VT_VARIANT", 2);
            Arguments.SetValue(0, Properties1);
            Arguments.SetValue(1, Properties2);
            
            // Дочерний объект Desktop-а: Книга EXCEL.
            Book = Desktop.LoadComponentFromURL(ConvertToURL(ФайлEXCEL), "_blank", 0, Arguments);
            
            // Дочерний объект Book-а: Листы EXCEL.
            Sheets= Book.getSheets();
            ВсегоЛистов = Sheets.getCount();
            
            // Формирование списка листов файла.
            Для ит = 0 ПО ВсегоЛистов -1 Цикл
                ИмяЛиста = Sheets.getByIndex(ит).Name;
                СписокЛистов.Добавить(ИмяЛиста);    // Добавляем в список имя листа без знака.
            КонецЦикла;
            
            // Завершение работы.
            // Закрытие Объектов.
            Book.Close(Истина);
            Desktop.Terminate();
            Desktop = Неопределено;
            ServiceManager = Неопределено;
        Исключение
            Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
            Возврат Новый СписокЗначений;    // В случае ошибки возвращаем пустой список значений.
        КонецПопытки;
        
    Иначе
        // Для файлов типа .XLS .XLSX используем MS ADODB.
        
        // Строка соединения - определение драйвера, который будет использован для подключения к файлу EXCEL.
        Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда
            
            // ACE.OLEDB.12.0 - Для использования данного подключения необходимо дополнительное ПО:
            // Microsoft Access Database Engine 2010 Redistributable 32/64 bit.
            СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
            
            // Еще один вариант.
            //СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";
            
        Иначе
            
            // Jet.OLEDB.4.0 - Стандартное подключение, как правило, не требующее установки дополнительного ПО.
            // Рекомендуется установить последний Service Pack Windows.
            СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "  + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
            
            // Еще один вариант.
            //СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";
            
        КонецЕсли;
        
        Попытка
            ADODBConnection = Новый COMОбъект("ADODB.Connection");       // Инициализация ADODB.
            ADODBConnection.Open(СonnectionString);                                      // Открытие соединения.
            
            // 1-ый способ Формирования списка листов файла EXCEL.
            ADOXCatalog = Новый COMОбъект ("ADOX.Catalog");
            ADOXCatalog.ActiveConnection = ADODBConnection;
            МассивЛистов = ADOXCatalog.Tables;
            
            Для Каждого ЛистМассива ИЗ МассивЛистов Цикл
                ИмяЛиста = ЛистМассива.Name;
                Если ИмяЛиста = "Excel_BuiltIn_Database" Тогда                    // Исключаем лист "по-умолчанию".
                    Продолжить;
                КонецЕсли;
                // Добавляем в список имя листа без знака $. Исключительно для удобвства восписятия при выборе листа из списка.
                СписокЛистов.Вставить(0, Лев(ИмяЛиста, СтрДлина(ИмяЛиста)-1));
            КонецЦикла;
            //// 2-ой способ Формирования списка листов файла EXCEL.
            //ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
            //ADODBRecordset = ADODBConnection.OpenSchema(20);
            //Пока НЕ ADODBRecordset.EOF Цикл
            //    ИмяЛиста = ADODBRecordset.Fields("TABLE_NAME").Value;
            //    Если ИмяЛиста = "Excel_BuiltIn_Database" Тогда                    // Исключаем лист "по-умолчанию".
            //        ADODBRecordset.MoveNext();
            //        Продолжить;
            //    КонецЕсли;
            //// Добавляем в список имя листа без знака $. Исключительно для удобвства восписятия при выборе листа из списка.
            //    СписокЛистов.Добавить(Лев(ИмяЛиста, СтрДлина(ИмяЛиста)-1));

            //    ADODBRecordset.MoveNext();
            //КонецЦикла;
            //ADODBRecordset.Close();
           
            // Завершение работы.
            // Закрытие Объектов.
            ADOXCatalog = Неопределено;
            ADODBConnection.Close();
            ADODBConnection = Неопределено;
        Исключение
            Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
            Возврат Новый СписокЗначений;    // В случае ошибки возвращаем пустой список значений.
        КонецПопытки;
        
    КонецЕсли;
    
    Возврат СписокЛистов;
    
КонецФункции


// Конвертировать имя файла для метода "LibreOffice CALC".

//
Функция ConvertToURL(ФайлEXCEL)
    
    ФайлEXCEL = СтрЗаменить(ФайлEXCEL," ","%20");
    ФайлEXCEL = СтрЗаменить(ФайлEXCEL,"\","/");
    
    Возврат "file:/" + "/localhost/" + ФайлEXCEL;
    
КонецФункции


// Получение списка листов файла типа XLSX средствами 1С (ЧтениеXML).
//
Функция ФайлExcelПолучитьСписокЛистов_1CXML_XLSX(ФайлEXCEL)
    Перем
ZIPКаталог, WorkBook;
    Перем
СписокЛистов;
   
ZIPКаталог = КаталогВременныхФайлов() + "XLSX\";
   
СписокЛистов = Новый СписокЗначений;
   
Файл = ПолучитьОбъектФайл(ФайлEXCEL, Истина);
    Если
Файл = Неопределено Тогда
       
Сообщить("Невозможно получить список листов, т.к. невозможно открыть для чтения файл:
        |"
+ ФайлEXCEL);
        Возврат Новый
СписокЗначений;
    КонецЕсли;
    Если НЕ
ВРег(Файл.Расширение) = ".XLSX" Тогда
        Возврат Новый
СписокЗначений;
    КонецЕсли;
   
WorkBook = Новый ЧтениеXML;
   
WorkBook.ОткрытьФайл(ZIPКаталог + "XL\WorkBook.xml");
   
// Считать очередной узел XML.
   
Пока WorkBook.Прочитать() Цикл
        Если НЕ
ВРег(WorkBook.Имя) = ВРег("sheet") Тогда
            Продолжить;
        КонецЕсли;
       
// Тип текущего узла XML.
       
Если WorkBook.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
           
// Считать очередной атрибут элемента XML.
           
Пока WorkBook.ПрочитатьАтрибут() Цикл
                Если НЕ
ВРег(WorkBook.Имя) = "NAME" Тогда
                    Продолжить;
                КонецЕсли;
               
СписокЛистов.Добавить(WorkBook.Значение);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
   
// Завершение работы.
    // Закрытие Объектов.
   
WorkBook.Закрыть();
    Возврат
СписокЛистов;
КонецФункции

Функция
ПолучитьОбъектФайл(Знач ФайлEXCEL, РаспаковатьXLSX = Ложь)
    Перем
Файл, objFSO, objFile, XLSXРаспакован;
    Если НЕ
ЗначениеЗаполнено(ФайлEXCEL) Тогда
        Возврат Неопределено;
    КонецЕсли;
   
Файл = Новый Файл(ФайлEXCEL);
    Если НЕ
Файл.Существует() Тогда
       
Сообщить("Файл не существует:
        |"
+ ФайлEXCEL);
        Возврат Неопределено;
    КонецЕсли;
   
// Проверка: Занят ли файл другим процессом?
   
objFSO = Новый COMОбъект("Scripting.FileSystemObject");
    Попытка
       
objFSO.MoveFile(ФайлEXCEL, ФайлEXCEL);
       
objFile = objFSO.GetFile(ФайлEXCEL);
    Исключение
       
objFile = Неопределено;
       
objFSO = Неопределено;
       
Сообщить("Ошибка открытия файла/Файл занят другой программой:
        |"
+ ФайлEXCEL);
        Возврат Неопределено;
    КонецПопытки;
   
objFSO = Неопределено;
    Если
ВРег(Файл.Расширение) = ".XLSX" И РаспаковатьXLSX Тогда
       
// Распаковка файла XLSX во временный каталог.
       
XLSXРаспакован = РаспаковатьXLSXвКаталогВременныхФайлов(ФайлEXCEL);
        Если НЕ
XLSXРаспакован Тогда
            Возврат Неопределено;
        КонецЕсли;
    КонецЕсли;
    Возврат
Файл;
КонецФункции

Функция
РаспаковатьXLSXвКаталогВременныхФайлов(ФайлEXCEL)
    Перем
ZIPФайл, ZIPКаталог;
   
ZIPКаталог = КаталогВременныхФайлов() + "XLSX\";
    Попытка
       
УдалитьФайлы(ZIPКаталог);
       
ZIPФайл = Новый ЧтениеZipФайла;
       
ZIPФайл.Открыть(ФайлEXCEL);
       
ZIPФайл.ИзвлечьВсе(ZIPКаталог, РежимВосстановленияПутейФайловZIP.Восстанавливать);
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    Возврат Истина;
КонецФункции


Особенности и Ограничения:

1. Для функционирования метода «Microsoft ADODB» необходимо:

Драйвер подключения Provider=Microsoft.Jet.OLEDB.4.0:
-
Установленный Microsoft MDAC, как правило специальная установка не требуется, достаточно последнего Service Pack-а операционной системы..

  Microsoft MDAC 2.8 SP1 10.05.2005: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5793
Драйвер подключения Provider=Microsoft.ACE.OLEDB.12.0:
- Установленный Microsoft Access Database Engine 2010 Redistributable (16/12/2010) 32 и 64 - разрядные версии:
  Microsoft ADE 2010 16/12/2010:  http://www.microsoft.com/en-us/download/details.aspx?id=13255

2. Для функционирования метода «LibreOffice CALC» необходим установленный LibreOffice.

МА! С уважением к сообществу МА!


1C Предприятие Импорт Загрузка Чтение Microsoft MS Excel LibreOffice OpenOffice dbf dBase xml mxl ActiveX ADO ADODB Windows XML

См. также

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    209811    620    524    

438

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150379    365    375    

499

Маркетплейсный загрузчик для 12-ти маркетплейсов в "БП 3", "УТ 11", "КА 2", ERP, УНФ

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", Казань-Экспресс, "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    31792    234    63    

117

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

5400 руб.

04.06.2019    101126    296    173    

312

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

3600 руб.

07.06.2022    14947    78    0    

59

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 руб.

09.11.2016    214599    921    886    

938
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1868 01.10.13 14:09 Сейчас в теме
Плюс однозначно, но зашифрованные листы не читает
2. StepByStep 3666 08.11.13 00:03 Сейчас в теме
07.11.2013.
Добавлено: Получение списка листов файла типа XLSX средствами 1С (ЧтениеXML).
4. pyrkin_vanya 487 11.07.18 16:38 Сейчас в теме
(2)При загрузке через этот метод, почему то не видна первая колонка. Через загрузку просто через ексель апликейшен все читается. Но... Если открыть этот документ, тупо щелкнуть по первой колонке два раза не поменяв никакие данные и сохранить документ, то все читается хорошо. Че за прикол и как это побороть? :)
3. Sardukar 58 09.10.14 03:33 Сейчас в теме
Согласно описанию метода MoveFile, при попытке переместить файл в уже существующий, возникает ошибка:
"...
object.MoveFile ( source, destination );
...
________________________________________
If source contains wildcards or destination ends with a path separator (\), it is assumed that destination specifies an existing folder in which to move the matching files. Otherwise, destination is assumed to be the name of a destination file to create. In either case, three things can happen when an individual file is moved:
• If destination does not exist, the file gets moved. This is the usual case.
• If destination is an existing file, an error occurs.
• If destination is a directory, an error occurs."

Источник:
http://msdn.microsoft.com/en-us/library/2wcf3ba6(v=vs.84).aspx


Поэтому в приведенной конструкции "objFSO.MoveFile(ФайлEXCEL, ФайлEXCEL);" ошибка будет возникать всегда.
Блин, но не возникает же! В чем подвох?
5. ducks01 07.11.18 07:01 Сейчас в теме
Спасибо, воспользовался вторым способом!
Вкупе с этим способом работы https://infostart.ru/public/225624/
Оставьте свое сообщение