ADO доступ к таблице Excel

25.10.12

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

Общепринятые методы работы с файлами Excel устраивают до тех пор, пока не встречаешься
с файлами на 30 000 строк и несколькими десятками колонок. Время выполнения и обработки
такого файла растет до ужаса.Можно конечно написать :"а теперь можете пойти покурить" как
делают некоторые разработчики, но это не наши методы. Мы боремся за оптимизацию и
производительность. Чем больше элегантных методов мы используем ,тем выше
наш уровень мастерства.А теперь по сути: появилась необходимость загружать специфические
выгрузки, с сайта клиента в excel формате, в базу системы 1с:Предприятие
.Апробирования стандартного метода последовательного считывания ,показало что 30 000 строк
загружается за 12 с небольшим минут. После использования метода с ADO
скорость загрузки уменьшилась до 20 секунд.

 

После небольшого ознакомления с документацией по ADO,чтением MSDN возникла идея

обратиться к таблице excel как к обыкновенной таблице какой-нибудь БД через запрос.

Единственное условиедля такого рода задачи таблица должна быть одна на листе.

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

список колонок для загрузки, поэтому в запросе использовались системные имена,

вы можете скорректировать код под себя.Код хорошопрокомментирован,так что

суть должна быть понятна.

 

Опишу вкратце текущий алгоритм:

 

1.Создаю COM объект .

2.Получаю список листов файла.(будет использоваться в дальнейшем запросе).

3.Формирую строку необходимых полей(по выбранным пользователем колонкам)

4.Собираю запрос.

5.Выполняю запрос к файлу.

6.Собираю таблицу для дальнейшей обработки.

 

Непосредственно код:

 

        //Созданиеобъектадляустановкисвязисисточникомданных
        Connection
=Новый COMОбъект("ADODB.Connection");
        
        
//сформируемстрокуподключения
        
//Еслинеобходимо вдальнейшемоперироватьцифровымизначениямиколонок,тоставимпризнак HDR = NO
        
//еслинеобходимопроизводитьзагрузкусучетомпсевдонимовв 1йстроке,тоставим HDR = YES
        
        
СтрокаПодключения="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+ИмяФайлаЗагрузки;
        
СтрокаПодключения=СтрокаПодключения+"; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";
        
        
//подключениекисточникуданных
        
Попытка
        
                Connection
.Open(СтрокаПодключения);
        
        
Исключение
                
                
Сообщить(ОписаниеОшибки());
                
Возврат;
        
        
КонецПопытки;
        
        
//созданиеобъектавыполнениякоманды
        Command
=Новый COMОбъект("ADODB.Command");
        
        
//созданиеобъектаподключениякфайлу
        axCatalog
=Новый COMОбъект("ADOX.Catalog");                                                
        axCatalog
.ActiveConnection = Connection;
                
        
//получимлистыдокумента,
        
//дляобработкиколоноклистаможнообратитсякколлекцииЛист.Columns,которуютожеможнообойтипосредствомциклаДлякаждого
        
счЛиста=1;
        
ДлякаждогоЛистИЗaxCatalog.Tables Цикл
                
                
ЕслисчЛиста=ЭлементыФормы.НомерЛиста.ЗначениеТогда
                        
                        
//получимимят аблицы,затембудемиспользоватьвзапросе
                        
//ИмяТаблицы = Сред(Строка(Лист.Name),2,СтрДлина(Строка( >Лист.Name))-1);
                        
ИмяТаблицы=Лист.Name

                         Прервать;

                КонецЕсли;
                
                счЛиста=счЛиста+1;
                
        
КонецЦикла;
        
        
//отсортируемтаблицуколонок,которыенеобходимозагрузить
        
//чтобывдальнейшемприобработке RecordSet моглинебеспокоитсяопоследовательностиобработки
        
        
ТаблицаИспользуемыхКолонок.Сортировать("НомерКолонкиВозр");
        
        
//соберемчастьзапроса,аименноименаиспользуемыхколонок
        
//поумолчаниюимяколонкивыглядитследющимобразом F1,F2 ит.д
        
        
ТекстЗапросаКолонки="";
        
СтрокаКолонки="";
        
        
ДлякаждогоСтрокаТаблицыИЗТаблицаИспользуемыхКолонокЦикл
                
                
ТекстЗапросаКолонки=ТекстЗапросаКолонки+?(ТекстЗапросаКолонки="","F"+СтрокаТаблицы.НомерКолонки,",F"+СтрокаТаблицы.НомерКолонки);
                
                
//добавимколонкувтаблицузагрузки
                
ТаблицаЗагрузки.Колонки.Добавить(СтрокаТаблицы.ИмяКолонки);//соотв. колонкиидутвпорядкевозрастания,т.кмыотсортировалитаблицуранее
                
                
//соберемстрокуиспользуемыхколонокдлязаписиврегистрЖурналОбновленийСерийныхНомеров,вконцезагрузки
                
СтрокаКолонки=СтрокаКолонки+?(СтрокаКолонки="",СтрокаТаблицы.ИмяКолонки,","+СтрокаТаблицы.ИмяКолонки);
                
        
КонецЦикла;
        
        
//Созданиеобъектанаборазаписей
        RecordSet
=Новый COMОбъект("ADODB.RecordSet");
        
        
//Указаниеактивногосоединения
        Command
.ActiveConnection = Connection;
        
        
//получимколичествостроквдокументе
        Command
.CommandText ="SELECT COUNT(*)FROM ["+ИмяТаблицы+"]";
        
        
//определениетипакоманды
        Command
.CommandType =1;
        
        
//Выполнениеиполучениенабораданных
        RecordSet
= Command.Execute();
        

        
//перваязаписьэтоколичество
        КоличествоСтрок= RecordSet.Fields(0).Value;
        
        
//опредлелениетекстакоманды
        Command
.CommandText ="SELECT "+ТекстЗапросаКолонки+" FROM ["+ИмяТаблицы+"]";
        
        
//определениетипакоманды
        Command
.CommandType =1;
                
        
//Выполнениеиполучениенабораданных
        
Попытка         
                RecordSet
= Command.Execute();
        
Исключение
                
Сообщить(ОписаниеОшибки());
        
КонецПопытки;
        
        RecordSet
.MoveNext();//т.кперваястрокаэтозаголовкитаблиц,небудемееучитывать
        
        
Пока RecordSet.EOF()=0Цикл
                
                
СтрокаТабличнойЧасти=ТаблицаЗагрузки.Добавить();
                
                
сч=0;
                
ДлякаждогоКолонкаИЗТаблицаЗагрузки.КолонкиЦикл
                        
                        
СтрокаТабличнойЧасти[Колонка.Имя]=СокрЛП(Строка(RecordSet.Fields(сч).Value));
                        
сч=сч+1;
                        
                
КонецЦикла;
                
                RecordSet
.MoveNext();
                
        
КонецЦикла;
        
        RecordSet
.Close();
        Connection
.Close();
        

 

Итак на выходе мы получили ТаблицуЗагрузки ,которую можно обработать по своему желанию.Стоит

отметить что все значения получаются строкового типа, поэтому необходимо потом их правильно обработать.

Но овчинка стоит выделки, прирост скорости действительно существенный. Что самое интересное в процессе работы

с файлом excel как с COM объектом можно получать все необходимые свойства и обращаться к нужным листами.

Запрос можно построитьпотяжелее с фильтрами и объединениями, так что поле для действий огромно.

Скажу честно данный механизмсоветую использовать при работе исключительно с большими файлами,

уменьшение времени обработки с 12 минут до 20 секунд.

 

 

Создано в Microsoft Office OneNote 2007

См. также

SALE! 20%

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

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

6000 5100 руб.

09.11.2016    234504    1062    898    

1003

Загрузка и выгрузка в 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 дней БЕСПЛАТНОГО пользования!

3600 руб.

12.08.2021    35567    348    68    

156

SALE! 30%

Загрузка и выгрузка в 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С и нажимаете кнопку "Распознать и загрузить".

8400 5880 руб.

04.06.2019    107157    313    173    

326

Загрузка и выгрузка в 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.10.2024, версия 9.8 - 9.13)

15600 руб.

20.11.2015    156175    376    378    

513

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

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

4800 руб.

09.12.2020    25394    251    1    

114

SALE! 15%

Загрузка и выгрузка в 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 9435 руб.

29.10.2014    216822    657    527    

456

Загрузка и выгрузка в 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    11158    53    0    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vovan519 276 30.01.10 01:39 Сейчас в теме
А зачем КоличествоСтрок = RecordSet.Fields(0).Value ?
2. Sigrlami 103 30.01.10 01:48 Сейчас в теме
(1)Дальше необходимо было знать количество строк,для индикатора процесса.
3. MRAK 724 30.01.10 09:12 Сейчас в теме
Молодец, код хорошо прокомментирован
4. Ish_2 1112 30.01.10 10:34 Сейчас в теме
5. artem666 29 30.01.10 12:22 Сейчас в теме
напиши лучше про Insert и Update, с Select уже куча инфы в инете :)
6. Sigrlami 103 30.01.10 14:40 Сейчас в теме
(5)если действительно нужно можно написать. :D Впринципе то все сводится к знаниям SQL/
7. YRAtomic 99 30.01.10 16:03 Сейчас в теме
(6) Очень нужно.
Еще вопрос - как быстро происходит инициализация com-объекта по сравнению с обычным Excel.Application ?
37. fzt 14.04.16 06:14 Сейчас в теме
(7) YRAtomic, всяко быстрее. Это лишь подлючение DLL. Даже устанавливать Excel на сервер не нужно ну и покупать.
А вот Application - открывает полновесный Excel, открывается дольше, жрет много ресурсов.
8. VitaliySm 273 30.01.10 21:56 Сейчас в теме
Вообще автору стоит оформить эту статью в виде обработки-шаблона. Т.е. кроме описания стоит выложить также шаблон обработки который любой скачавший сможет быстро донастроить под свои нужды.
10. Sigrlami 103 30.01.10 22:47 Сейчас в теме
(8)спасибо учту.в ближайшее время выложу :D
9. artem666 29 30.01.10 22:44 Сейчас в теме
Excel.Application - это наимедленейшее средство работы с экселем. С Insert и Update все сводится не только к знанию SQL, есть свои хитрости, причем мне удалось побороть только Update... :|
11. Valiko77 01.02.10 07:03 Сейчас в теме
Классный метод! Спасибо огромное за публикацию!
12. CrazyBear 33 01.02.10 09:21 Сейчас в теме
Спасибо)) Но хотелось бы увдиеть обработку.. ;)
13. Oleg_nsk 279 01.02.10 13:36 Сейчас в теме
сделал... Действительно очень быстро, спасибо..
14. acsent 1203 01.02.10 14:43 Сейчас в теме
Ничего не рассказано, про IMEX=1
15. Sigrlami 103 01.02.10 15:12 Сейчас в теме
(14)ссылка на msdn как бы намекает:
""IMEX=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text"

по-русски:этот параметр необходим чтоб воспринимать все колонки как значения типа Строка.
korppinen; +1 Ответить
51. BarsukM 10.11.22 13:13 Сейчас в теме
(15) точнее как строковое представление.
Разница в том, что например число 4488892004808 считается не как строка "4488892004808", а как представление числа в экспоненциальном виде "4,4888920048e+012". С потерей данных.
16. acsent 1203 01.02.10 15:56 Сейчас в теме
Просто есть ограничение на данный способ загрузки. Если в колонках хранятся разнородные данные, то в лучше случае мы вытащим лишь представления
18. Sigrlami 103 01.02.10 16:37 Сейчас в теме
(16)в конце статьи я описал,что значения возвращаем строкового типа,независимо от того какие они в Excel.

(17)http://msdn.microsoft.com/en-us/library/aa705017(BTS.10).aspx
17. acsent 1203 01.02.10 15:57 Сейчас в теме
//определение типа команды
Command.CommandType = 1;

Комментировать у КЭПа учился?
20. Gmix 417 03.02.10 12:40 Сейчас в теме
Все хорошо но нельзя забывать о проблеме превышения 255 символов!
Тут много нюансов есть!
собственно и моя статейка http://gmixdev.ru/index.php?option=com_content&task=view&id=14&Itemid=9
и на форуме есть сообщения на тему 255
так что дерзайте!
21. Sigrlami 103 03.02.10 16:22 Сейчас в теме
22. Leoway 166 05.03.10 12:08 Сейчас в теме
Спасибо помогло. Есть только один вопрос.
Когда получаем список листов командой

Для каждого Лист ИЗ axCatalog.Tables Цикл
КонецЦикла;

Листы загружаются в какой-то странной последовательности, а не так как они расположены в файле. Я так предполагаю в порядке их создания в файле Excel.
При Com соединении такой картины не наблюдается.
Можно ли с этим бороться?
23. Sigrlami 103 09.03.10 08:03 Сейчас в теме
(22)
0.Рад,что помогло. :)
1.да,в порядке в котором они создавались в экселе.
2.Ничего не мешает вам выгрузить листы в список значений и потом их как-то обрабатывать или в другую универсальную коллекцию... :idea:
24. Leoway 166 09.03.10 08:56 Сейчас в теме
(23) Этот метод понятен. Но в основном такие обработки пишутся для пользователей, у которых свои представления и порядки создания листов в Excel. Именно по этому у меня и возник мой вопрос.
40. lev6975 14.04.16 11:59 Сейчас в теме
(22) Leoway, как раз, у меня такое было - листы переименованы и сортируются в алфавитном порядке. Если, листы обозваны лист1,лист2, лист3 и т.д. тогда, будут так как в файле
47. hroa 23.12.16 10:16 Сейчас в теме
всё-таки вопрос из (22) не раскрыт до конца. Стоит задача: взять данные с первого листа, файлы будут приходить разные и листы в них будут разные.

Для каждого Лист ИЗ axCatalog.Tables Цикл
КонецЦикла;

решило бы эту проблему, но оно почему-то выдает листы в алфавитном порядке. Можно ли вообще найти название первого листа?
25. amyd 94 22.09.10 11:05 Сейчас в теме
не обязательно таблица должна быть на листе
если это выгрузка с 1С и листов нет то такой запрос тоже пройдет
"select * from [A0:IV100000] "
а так респект и уважуха, плюс однозначно
26. Sigrlami 103 22.09.10 12:07 Сейчас в теме
(25) да, я знаю.Через пару недель когда пришлось плотнее работать,прочитал в MSDN, что можно так делать... ;)
Спасибо за комментарий.
27. nikolaygorbunov 1 21.10.10 16:22 Сейчас в теме
Что такое "ТаблицаИспользуемыхКолонок"?
28. daho 8 06.11.12 13:56 Сейчас в теме
(27) nikolaygorbunov, Ну эт на всякий случай если не все колонки тебе нужно юзать..
Автору спасибо, коротко и по теме!
29. Ed5550 30.08.13 12:14 Сейчас в теме
Подскажите пожалуйста:
1) Появилась ошибка Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft JET Database Engine): Отсутствует значение для одного или нескольких требуемых параметров.
Что не так делаю?
2)Можно поподробнее что такое ТаблицаИспользуемыхКолонок.
Заранее спасибо!
32. ChessCat 15.07.14 16:40 Сейчас в теме
(29) Ed5550, "Произошла исключительная ситуация (Microsoft JET Database Engine)"
это означает что вы пытаетесь открыть файл более старшей версии Excel. У автора в примере Excel 8.0
Для Excel 2007 и выше надо использовать "Provider=Microsoft.ACE.OLEDB.12.0";
30. adva 45 11.06.14 04:35 Сейчас в теме
А через ADO возможно обновить лист excel? (определенные ячейки)
36. fzt 14.04.16 06:11 Сейчас в теме
(30) adva, Insert и Update для файлов Excel существуют. По крайней мере с OLEDB я точно этим пользовался.
31. ChessCat 15.07.14 16:38 Сейчас в теме
Почему нельзя было описать структуру "ТаблицаИспользуемыхКолонок" чтобы люди читающие статью не ломали голову наш шарадами ?
33. lev6975 13.04.16 21:28 Сейчас в теме
Для каждого Лист ИЗ axCatalog.Tables Цикл

Если счЛиста=ЭлементыФормы.НомерЛиста.Значение Тогда
Как - то, странно, у меня четвертый лист в файле(визуально) идет по этой процедуре первым,не тот лист хавает, в общем. А, первый лист в файле (визуально)- седьмой
а, я, и, думаю, почему у меня запрос
Command.CommandText ="SELECT COUNT(*)FROM ["+ИмяТаблицы+"]";,
показывает 27 колонок(полей), когда у меня их 60+...
Это зависит от чего - то?От конкретного компа, винды, версии ёкселя?
Чтобы, у клиентов номера листов определял так же как и у меня
38. fzt 14.04.16 06:16 Сейчас в теме
(33) lev6975, может потому, что нумерация в массиве идет с 0?
39. lev6975 14.04.16 11:14 Сейчас в теме
(38) fzt, Возможно. И, с конца.Всего листов пять(пятый - пустой, его пропускает). Тогда,четвертый - нулевой, а, следующая итерация, если оттрассировать процедуру - снова четвертый, только с допиской xlnm#_FilterDatabase
Тогда, если, по две итерации на лист, получается, что, седьмая итерация, как раз,зацепит первый лист...
Я, наверно, все - таки, сделаю по именам - загружу имена на форму в список значений, чтобы, выбирались, именно, по именам...
ЗЫ,и, правда,таблицу с килострокой записей ёкселя на 60 полей(всего 60000 полей), грузит меньше секунды! Теперь, узким местом будет раскидка всего этого по документам и справочникам и запись в базу))
Все, понял - он сортирует листы по именам по алфавиту - сначала,выводит листы с именем на латинице, потом, на кириллице. Нужный лист, как раз, с кириллическим именем,остальные на латинице, вот, его и выкидывает последним))
42. fzt 18.04.16 04:47 Сейчас в теме
(39) lev6975, косяк нюанс есть.
"если список листов получаешь через Connection.OpenSchema(adSchemaTables), то при сложном форматировании там могут быть не только листы, но и области листа. А в результате может быть такой замечательный эффект: данные как бы получаешь. Но не всегда все :)" © fisher
С датами. ADO может рисовать null, если в одной колонке разные типы данных. Что легко достижимо форматирование шапки таблицы например.
За сим я бы как раз обращался только к области листа, в которой нужные данные, т.е. искал конкретно область таблицы (достижимо когда ексельку формируют "свои", или предварительно форматировал файлы (когда файл формируют "чужие"), выкинув все кроме данных.

Ещё можно поставить это:
https://www.microsoft.com/en-us/download/details.aspx?id=23734
и попробовать
"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + ПараметрыПодключения.ИмяФайла + "; Extended Properties=""Excel 12.0; HDR=NO; IMEX=1;"""
43. lev6975 22.04.16 17:24 Сейчас в теме
(42) спасибо, попробую. Заказчик на месяц, к счастью слинял и от меня отвязался,не висит над душой, я закинул проект на потом. На той недельке вернусь к нему, попробую и отпишусь в этой ветке
44. lev6975 05.05.16 08:08 Сейчас в теме
(42) fzt, Приветствую, недавно вспомнил за мой вопрос... Я понял, почему из файла затягивается белиберда - файл во время ADO запроса не должен быть открыт в excel !!!)))
Не знаю, почему, но, если файл не открыт, затягивается все идеально. Если висит в ёкселе - начинает неясным образом кривить - плывут не ток даты(как я писал выше), но и числа, тож, грузятся криво... Попросить клиентов схлопывать файл перед затягиванием его в базу я могу, поэтому, в общем, все ОК, спасибо за участие!!! А,так, в общем - то,интересно, почему эксёл таким загадочным образом влияет на запрос...
Может, кстати, кривой драйвер на моем компе, и, его надо обновить с Макрософта... Но, вот, у клиента я этого сделать не смогу, поскоку, клиента, скорее всего, и, ни разу не увижу)))...если ток заказчика просить. Проще, уж, приучить к закрыванию файла перед погрузкой
Или, О!Проверять, открыт ли файл в момент запроса и делать отказ, если открыт...так и сделаю
45. fzt 05.05.16 09:07 Сейчас в теме
(44) lev6975, скопировать во временный каталог, а потом удалить?
46. lev6975 05.05.16 12:24 Сейчас в теме
(45) fzt, Да, тоже идея!!Отвязать копию от ёкселя. Надо попробовать...плохо то что не знаю что у конечного клиента на компе творится, надо в темп кидать
50. Serge_ASB 22.05.19 17:41 Сейчас в теме
(42) Приведенная ссылка на microsoft.com не работает - объект удален. А что, собственно, там было?
34. lev6975 13.04.16 21:29 Сейчас в теме
ёксель 2010 стоит
у клиентов пока не знаю какой
35. lev6975 13.04.16 21:32 Сейчас в теме
Хотя, чё я парюсь, лист можно словить по его имени,а, не по номеру))))
41. lev6975 15.04.16 13:07 Сейчас в теме
Вопрос, как читать поля с датами - ADO их преобразовывает(причем, через раз) к какому - то числу непонятному(номер дня с 01.01.1900года)... Меня бы устроило, чтобы считал строкой,"что вижу то и читаю", без каких - то мудростей. в 1С я сам приведу все к дате.Метод Cdate возвращает дату,но, читает не все поля колонки, по каким - то причинам пропускает
48. SHiCK 12.04.17 08:37 Сейчас в теме
Все классно и автору спасибо. но вот вы меня простите конечно, а зачем коменты без пробелов писать
во вторых в коде идут ссылки на переменные из формы и еще от куда-то. было бы здорово это поправить.
49. Serge_ASB 22.05.19 17:04 Сейчас в теме
Добрый день.
У меня при попытке соединения ругается на Провайдера. А как можно понять, какие провайдеры в системе установлены, или что нужно установить, чтобы всё работало, "как написано"?
Оставьте свое сообщение