Имя: Пароль:
1C
 
Можно ли прочитать Excel через АДО без экселя?
,
0 Gorr
 
12.07.22
20:00
Нужно читать файлы екселя большого объема максимально быстро. Возможно ли установить эту библиотеку отдельно без ms office?
1 Lama12
 
12.07.22
20:11
Должна быть такая возможность.
2 NorthWind
 
12.07.22
20:13
(0) если речь про xls (не xlsx), то во всех виндах уже стоит. Если более современные форматы начиная с office 2007, то нужно поставить что-нибудь наподобие вот этого
https://www.microsoft.com/en-us/download/details.aspx?id=13255
но я бы советовал не мучиться. Если у вас 8.3... кажется 10 и старше, то там ТабличныйДокумент читает xls/xlsx нативно безо всякого ADO.
3 NorthWind
 
12.07.22
20:14
причем качество разборки формата вполне приличное, почти все умеет, если у вас не особо изысканное форматирование, то должен справиться.
4 youalex
 
12.07.22
20:23
Если есть мс скл, и конкретный файл -  можно его (мс скл) задействовать. Например подключить файл-источник как связанный сервер и дальше дергать данные через ADO или даже ВИД (по идее должно работать, но не уверен).
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/import-data-from-excel-to-sql?view=sql-server-ver15

Это если не подойдет нативный 1сный метод из (2))
5 Фрэнки
 
12.07.22
22:53
Нужно смотреть, что в этом большом объеме: большое количество данных, сложенных в один или несколько листов или это файл с некими сложными тяжеловесными элементами.

многостраничные xls/xlsx читаются.
6 kubik_live
 
12.07.22
23:54
(2) Была таблица с 3-мя листами,
Надо было прочитать только 1 лист (независимо от имени)

ТабличныйДокумент тупо прочитал все листы.
Отказался в сторону ADO.. или ЧЯНТД?
7 Фрэнки
 
13.07.22
01:09
(6) он прочитал тупо всё, потому что ты его тупо заставил читать всё.
8 ZDenis
 
13.07.22
01:10
(6) Там есть области, их можно перебирать, получать по имени или по индексу (это я о листах)
9 NorthWind
 
13.07.22
07:01
(6) Да, там есть нюансы. Дело в том, что табличный документ 1С не имеет такой сущности "лист". При чтении всегда зачитывается весь документ, и листы XLS/XLSX, если их более одного, конвертируются в именованные Области и располагаются в таблице сверху вниз в том же порядке, в котором листы были в исходном документе. Соответственно, выбрав область по имени листа и получив ее верхнюю левую строку, можно определить, где именно в документе она лежит. Но нужно иметь в виду, что имена областей в 1С должны удовлетворять правилам именования переменных, т.е. некоторые символы использовать нельзя, в частности пробелы. А листы в Excel таким правилам удовлетворять не обязаны, поэтому 1С при разборе меняет имена, заменяя негодные символы на "_". Это может создать некоторые сложности при поиске листов, если нужно, чтобы имена задавал пользователь программы.
10 NorthWind
 
13.07.22
08:17
если нужно прочитать только первый по счету лист, то получаете первую область и затем ее нижнюю строку. Соответственно, ваши данные - от первой строки до нижней, дальше вам не надо.
11 Kigo_Kigo
 
13.07.22
08:44
А если расширение XLSX заменить на zip то можно распаковать и там будут файлы в xml  и уже читать их, но это так, такое вот извращение, видел у одной шибко "секретной конторе" :)))
12 6awkup_true
 
13.07.22
08:55
а можно не париться и воспользоваться построителем запроса. наличие экселя вообще не обязательно. имена колонок будут взяты по первой строке.

&НаКлиенте
Процедура ПрочитатьФайл(Команда)

    АдресВременногоХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу), ЭтаФорма.УникальныйИдентификатор);
    ПрочитатьФайлНаСервере(АдресВременногоХранилища);
    
КонецПроцедуры


&НаСервере
Процедура ПрочитатьФайлНомеровНаСервере(АдресВременногоХранилища)
    
    БинДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    
    Если БинДанные <> Неопределено Тогда
        ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
        БинДанные.Записать(ИмяФайла);
    Иначе
        УдалитьФайлы(ИмяФайла);
        ВызватьИсключение "Проблемы с файлом";
    КонецЕсли;
    
    ФайлНаДиске = Новый Файл(СокрЛП(ИмяФайла));
    Если Не ФайлНаДиске.Существует() Тогда
        Возврат;
    КонецЕсли;
        
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Очистить();
    ТабличныйДокумент.Прочитать(ИмяФайла);
    
    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    
    РезультатЧтения = ПЗ.Результат.Выгрузить();
    
    
КонецПроцедуры
13 NorthWind
 
13.07.22
09:20
(12) да, если у файла более-менее регулярная структура а-ля таблица БД, то это хороший вариант. Причем здесь тоже можно отфильтровать по конкретному листу (области) при желании.
14 lodger
 
13.07.22
09:22
(0) все способы работы с excel без тулз ms не отличаются молниеносной работой.
в 1с один из самых простых и быстрых вариантов - ТабличныйДокумент.Прочитать()
15 Gorr
 
13.07.22
09:40
Коллеги, добрый день! Благодарю за желание помочь!
Предполагается на входе плоский файл с заголовком и одним листом.
(2) Спасибо попробую!
(4) про вариант через ms sql спасибо не слышал. интересно.
Одним из важных критериев решения является скорость.
Так вот по скорости думается мне вариант чтения через АДО должен работать быстрее всего.
Скорость загрузки в приоритете.
16 6awkup_true
 
13.07.22
09:46
(15) в предложенном мной варианте файл экселя на 350К+ строк с 40+ колонками прочитался за чуть менее чем 2 секунды
17 Kassern
 
13.07.22
09:46
(0) Надеюсь вы понимаете, что чтение файла экселя - это лишь малая доля времени, львиную долю скушает анализ данных и запись в базу.
18 Kassern
 
13.07.22
09:47
поэтому особо париться чем прочитать я думаю не стоит, хоть АДО хоть таб док, хоть через ком.
19 Gorr
 
13.07.22
09:52
(16) Класс!
(17) Соглашусь.
20 Gorr
 
13.07.22
10:04
(2) заработало кстати!!!
21 NorthWind
 
13.07.22
12:32
(15) ну насчет "быстрее всего" у меня уверенности нет, потому что там прослойка достаточно тяжеловесная. Думаю, что самые быстрый вариант - это в (11), если применить какой-нибудь нересурсоемкий метод чтения XML, а на втором месте чтение через табличный документ. ADO, думаю, будет на третьем месте.
22 NorthWind
 
13.07.22
12:32
хотя, может, я и ошибаюсь
Независимо от того, куда вы едете — это в гору и против ветра!