Универсальная процедура выгрузки в эксель с помощью ADO

13.03.13

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

Универсальная процедура выгрузки данных в excel с помощью библиотеки ADO. Правда универсальность ограничена строкой подключения, связанной с версией установленного microsoft office. Однако на это можно закрыть глаза. Другое ограничение это отсутствие поддержки составного типа данных в колонке.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка пример выгрузки упр. и обычная формы
.epf 16,51Kb
42
42 Скачать (1 SM) Купить за 1 850 руб.
Схема работы процедуры
.grs 11,38Kb
9
9 Скачать (1 SM) Купить за 1 850 руб.

Процедура в качестве данных может принимать как таблицу значений так и массив структур, что весьма полезно в клиент сервеном варианте работы.

При работе с эксель узкое место - это скорость работы, данный механизм позволяет значительно ускорить выгрузку данных. Для быстрого разбора приведу схему работы процедуры:

 Схема работы процедуры

 

Копентарии редактор статьи режет, приведу отдельно:

записывает новый файл эксель версии не ниже 2007 на основании получаемых параметров  

Параметры:

  ИмяФайла  - Строка - Полный путь к вновь создаваемому файлу   

  ПерезаписыватьФайл  - Булево - отвечает за работу проверки существования  файла на диске прежде его создания  

  Данные  - Массив структур или табл. значений - содержит данные для выгрузки в эксель  Массив структур используется для работы на упр. приложении (первый элемент массива заголовки полей)  вместе с тем можно передать ТЗ при рабоче в обычном клиенте

 ИмяТаблицы  - Строка - Имя таблицы (листа) эксель

    

Далее сам код: 

 

&НаКлиенте
Процедура ЗаписатьВЭксельФайл(  Знач ИмяФайла,
                                                                Знач ПерезаписыватьФайл = Истина,
                                                                Знач Данные,
                                                                Знач ИмяТаблицы)
    //Проверим валидность имени файла
        Если ПустаяСтрока(ИмяФайла) Тогда 
                Возврат;
        Иначе
                //анализ нахождения файла на диске
                Если ПерезаписыватьФайл Тогда
                        Файл = Новый Файл(ИмяФайла);
                        Если Файл.Существует() Тогда
                                Файл = Неопределено;
                                УдалитьФайлы(ИмяФайла);
                        КонецЕсли;
                КонецЕсли;              
        КонецЕсли;
        
        //Проверка типа переданных данных
        //Подразумевается, что не массив означает ТЗ
        Если ТипЗнч(Данные) <> Тип("Массив") Тогда
                //строка подключения для эксель не ниже 2007 версии
                СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" + ИмяФайла + """;Extended Properties=""Excel 12.0 Xml;HDR=YES"""; 
                
                //объект отвечающий за связь с БД
                Коннектор = Новый COMОбъект("ADODB.Connection");
        Коннектор.ConnectionString = СтрокаПодключения;
                Коннектор.Open();
 
                //подключаемся
                Ком = Новый COMОбъект("ADODB.Command");
        Ком.ActiveConnection = Коннектор;
                //константа 1 означает "запрос", бывают еще представления и хранимые процедуры
        Ком.CommandType = 1;
                
                //анализируем тип данных в первой строке ТЗ
                СтрокаТЗ = Данные.Получить(0);
                СписокПолей = "";
                Для Каждого КолонкаТЗ Из Данные.Колонки Цикл
                        ТекЗначение = СтрокаТЗ[КолонкаТЗ.Имя];
                        //анализ типа данных
                        Если ТипЗнч(ТекЗначение) = Тип("Дата") Тогда
                                СписокПолей = СписокПолей + КолонкаТЗ.Имя + " date,";
                        ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Число") Тогда
                                СписокПолей = СписокПолей + КолонкаТЗ.Имя + " float,";
                        ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Булево") Тогда
                                СписокПолей = СписокПолей + КолонкаТЗ.Имя + " LOGICAL,";
                        Иначе
                                СписокПолей = СписокПолей + КолонкаТЗ.Имя + " char(255),";
                        КонецЕсли;              
                КонецЦикла;
                //обрезаем последнюю запятую
                СписокПолей = Лев(СписокПолей, СтрДлина(СписокПолей) - 1);
                Ком.CommandText = "CREATE TABLE " + ИмяТаблицы + " (" + СписокПолей + ")";
                Попытка
                        Ком.Execute();
                Исключение
                        Сообщить("При создании таблицы произошла ошибка!" + Символы.ПС 
                        + "Текст запроса: " + Ком.CommandText + Символы.ПС
                        + ОписаниеОшибки());
                        Возврат;
                КонецПопытки;
                
                //выгрузка данных
                //обходим строки данных
                Для Каждого СтрокаТЗ Из Данные Цикл
                        //обходим колонки данных
                        СписокПолей = "";
                        //цикл для формирования списка полей
                        Для Каждого КолонкаТЗ Из Данные.Колонки Цикл
                                ТекЗначение = СтрокаТЗ[КолонкаТЗ.Имя];
                                //анализ типа данных
                                Если ТипЗнч(ТекЗначение) = Тип("Число") Тогда
                                        СписокПолей = СписокПолей + Формат(ТекЗначение, "ЧРД=.; ЧН=0; ЧГ=") + ",";
                                ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Дата") Тогда
                                        СписокПолей = СписокПолей + "'" + Формат(ТекЗначение, "ДФ=dd.MM.yyyy") + "',";
                                ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Булево") Тогда
                                        СписокПолей = СписокПолей + "'" + Формат(ТекЗначение, "БЛ=0; БИ=1") + "',";
                                Иначе
                                        СписокПолей = СписокПолей + "'" + СокрЛП(ТекЗначение) + "',";
                                КонецЕсли;
                        КонецЦикла;
                        //обрезаем последнюю запятую
                        СписокПолей = Лев(СписокПолей, СтрДлина(СписокПолей) - 1);
                        //окончательное формирование теста запроса
                        ТекстЗапроса = "INSERT INTO " + ИмяТаблицы + " VALUES (" + СписокПолей + ")";
                        Ком.CommandText = ТекстЗапроса;
                        //запись данных в БД (выполнение запроса)
                        Попытка
                                Ком.Execute();
                        Исключение
                                Сообщить("При записи данных произошла ошибка!" + Символы.ПС 
                                + "Текст запроса: " + ТекстЗапроса + Символы.ПС
                                + ОписаниеОшибки());
                        КонецПопытки;
                КонецЦикла;
                Ком.ActiveConnection.Close();
        //************************************************      
        //Обработка массива структур
        //************************************************
        ИначеЕсли ТипЗнч(Данные) = Тип("Массив") Тогда
                //строка подключения для эксель не ниже 2007 версии
                СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"""; 
                
                //объект отвечающий за связь с БД
                Коннектор = Новый COMОбъект("ADODB.Connection");
        Коннектор.ConnectionString = СтрокаПодключения;
                Коннектор.Open();
 
                //подключаемся
                Ком = Новый COMОбъект("ADODB.Command");
        Ком.ActiveConnection = Коннектор;
                //константа 1 означает "запрос", бывают еще представления и хранимые процедуры
        Ком.CommandType = 1;
                
                //анализируем тип данных в первом элементе массива
                ПервыйЭлемент = Данные.Получить(0);
                СписокПолей = "";
                Для Каждого ЭлементСтруктуры Из ПервыйЭлемент Цикл
                        ТекЗначение = ЭлементСтруктуры.Значение;
                        //анализ типа данных
                        Если ТипЗнч(ТекЗначение) = Тип("Дата") Тогда
                                СписокПолей = СписокПолей + ЭлементСтруктуры.Ключ + " date,";
                        ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Число") Тогда
                                СписокПолей = СписокПолей + ЭлементСтруктуры.Ключ + " float,";
                        ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Булево") Тогда
                                СписокПолей = СписокПолей + ЭлементСтруктуры.Ключ + " LOGICAL,";
                        Иначе
                                СписокПолей = СписокПолей + ЭлементСтруктуры.Ключ + " char(255),";
                        КонецЕсли;              
                КонецЦикла;
                //обрезаем последнюю запятую
                СписокПолей = Лев(СписокПолей, СтрДлина(СписокПолей) - 1);
                Ком.CommandText = "CREATE TABLE " + ИмяТаблицы + " (" + СписокПолей + ")";
                Попытка
                        Ком.Execute();
                Исключение
                        Сообщить("При создании таблицы произошла ошибка!" + Символы.ПС 
                        + "Текст запроса: " + Ком.CommandText + Символы.ПС
                        + ОписаниеОшибки());
                        Возврат;
                КонецПопытки;
                
                //выгрузка данных
                //обходим строки данных
                Для Каждого ЭлементМассива Из Данные Цикл
                        //обходим колонки данных
                        СписокПолей = "";
                        //цикл для формирования списка полей
                        Для Каждого ЭлементСтруктуры Из ЭлементМассива Цикл
                                ТекЗначение = ЭлементСтруктуры.Значение;
                                //анализ типа данных
                                Если ТипЗнч(ТекЗначение) = Тип("Число") Тогда
                                        СписокПолей = СписокПолей + Формат(ТекЗначение, "ЧРД=.; ЧН=0; ЧГ=") + ",";
                                ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Дата") Тогда
                                        СписокПолей = СписокПолей + "'" + Формат(ТекЗначение, "ДФ=dd.MM.yyyy") + "',";
                                ИначеЕсли ТипЗнч(ТекЗначение) = Тип("Булево") Тогда
                                        СписокПолей = СписокПолей + "'" + Формат(ТекЗначение, "БЛ=0; БИ=1") + "',";
                                Иначе
                                        СписокПолей = СписокПолей + "'" + СокрЛП(ТекЗначение) + "',";
                                КонецЕсли;
                        КонецЦикла;
                        //обрезаем последнюю запятую
                        СписокПолей = Лев(СписокПолей, СтрДлина(СписокПолей) - 1);
                        //окончательное формирование теста запроса
                        ТекстЗапроса = "INSERT INTO " + ИмяТаблицы + " VALUES (" + СписокПолей + ")";
                        Ком.CommandText = ТекстЗапроса;
                        //запись данных в БД (выполнение запроса)
                        Попытка
                                Ком.Execute();
                        Исключение
                                Сообщить("При записи данных произошла ошибка!" + Символы.ПС 
                                + "Текст запроса: " + ТекстЗапроса + Символы.ПС
                                + ОписаниеОшибки());
                        КонецПопытки;
                КонецЦикла;
                Ком.ActiveConnection.Close();
        КонецЕсли;
КонецПроцедуры // ЗаписатьВЭксельФайл()

К статье прикладываю обработку реализующую наглядно всю работу. Конечно процедура может не отрабатывать какие либо моменты, но немного подпилив, её можно адаптировать под доп. требования.

Если версия вашего "офиса" не 12 то можно обратится на http://www.connectionstrings.com/

Оптимизировать данную процедуру можно. Например в perl при работе с БД можно поместить команды (более одной) insert в определенный блок, а потом разом выполнить запрос в ADO я такого не нашел, может кто подскажет?

Обычная форма

 

Управляемая форма

См. также

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 1C:Бухгалтерия 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С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 5100 руб.

09.11.2016    239936    1100    906    

1030

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

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

5400 руб.

12.08.2021    37167    393    68    

168

Загрузка и выгрузка в 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 1С:Розница 3.0 Платные (руб)

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

16800 руб.

20.11.2015    158216    384    378    

516

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

Кто получает документы в формате XML из различных сервисов ЭДО (формат 820 приказ ФНС 31 мая 2019) и набивает их вручную в 1С, тот наверняка хотел бы автоматизировать этот процесс. Поддержка конфигураций: Бухгалтерии 3, УПП 1.3, 1С:КА 2.4 и 1С:КА 2.5, УТ10, УТ11.4 и УТ11.5. Для бухгалтерии 3 добавлена поддержка формат 5.03 от 23/01/2025

4320 руб.

11.02.2020    94181    314    157    

227

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

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

4800 руб.

23.01.2022    11571    61    0    

39

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

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

11100 руб.

29.10.2014    217961    663    529    

457

SALE! 30%

Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rasswet 82 13.02.13 17:08 Сейчас в теме
видел где-то код, можно определить версию Эксель. тогда будет универсально работать под любым. может доделаете?
2. makc2k 107 13.02.13 22:06 Сейчас в теме
Вполне возможно, нужно найти время на это. Сейчас в планах сделать статью по выгрузке в access и HTML.
3. Alchimic 19.02.13 19:35 Сейчас в теме
4. platon_ 10 11.03.13 17:45 Сейчас в теме
А с апострафами как то боролись? которые получаются при выгрузке текста?
5. makc2k 107 11.03.13 19:34 Сейчас в теме
Их можно заменять отдельной функцией, как например отсекает проводник недопустимые символы в строке пути. Другой вариант покопать документацию на предмет экранирующих символов в тексте запроса, что наверное более правильно.
6. yuraos 1006 13.03.13 19:58 Сейчас в теме
Кому интересно,
тоже самое можно сделать из консоли запросов
правда не в простой, а в вот такой
---
правда пока только в только в толстом клиенте (обычное приложение).
:)
7. makc2k 107 13.03.13 20:10 Сейчас в теме
Я поправил обход апострофоф. Оказывается в SQL есть замечательная функция CHR(кодсимвола). Статью менять не стал ибо интерфейс редактирования статьи страшный, а вот обработочку новенькую закинул.
8. lsp71 19.04.13 17:16 Сейчас в теме
Задачу выгрузить ТаблицуЗначений в Excel-файл решаю в 2 простых шага:
1. Выгрузка ТаблицыЗначений в ТабличныйДокумент (один раз написал функцию, все время пользуюсь).
2. ТаблДок.Записать(КаталогВыгрузки + ИмяФайлаБезРасширения + ".xls", ТипФайлаТабличногоДокумента.XLS);
Все просто, как молоток. Не требуется даже наличия самого Excel на компьютере. Работает быстро.
AltF1; yuraskas; +2 Ответить
Оставьте свое сообщение