Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

чтение ексель с помощью ADODB.Connection

чтение ексель с помощью ADODB.Connection
Я
   serg-lom89
 
10.10.18 - 12:17
ДОбрый день уважаемые!
Прошу помощи
делаю обработку чтение ексель с помощью ADODB.Connection


    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xls");
    
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    //

    ТЗПрочитанныеДанные = Новый ТаблицаЗначений;
    Для Каждого КлючИЗначение из СтруктураКолонок Цикл
        Если КлючИЗначение.Значение = 0 тогда
            СтруктураКолонок.Удалить(КлючИЗначение.Ключ);
            Продолжить;  // Дополнительная Проверка

        КонецЕсли;
        
        ТЗПрочитанныеДанные.Колонки.Добавить(КлючИЗначение.Ключ); 
    КонецЦикла;
    
    СтрокаСоединения = "
    |Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяВременногоФайла)+";
    |Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";    
    
     Соединение = Новый COMОбъект("ADODB.Connection");    
    Попытка        
        Соединение.Open(СтрокаСоединения);                   
    Исключение      
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При открытии приложения: " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;
    
    НаименованиеЛиста = "Лист"+СокрЛП(НомерЛиста)//тут надо что бы по умолчанию щел лист с наименованием Лист1


    ТекстЗапроса = "SELECT * FROM `" + НаименованиеЛиста + "$A1:IV` "; 

    
    ADODBRecordset = Новый COMОбъект("ADODB.Recordset");                   
    Попытка
        ADODBRecordset.Open(ТекстЗапроса, Соединение);
    Исключение
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При чтении файла : " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;       
    
    
    КолвоКолонокExcel = ADODBRecordset.Fields.Count;
    
    НомерСтроки = 0;
    Если не номерСтроки =0 тогда
        НомерСтроки =НомерПервойСтроки;    
    КонецЕсли;
    
    ТекСтрока = НомерПервойСтроки;
    //////обойдем наш лист ексель

    НомерСтроки = 0;
    
    НачСтрока =  НомерПервойСтроки;
    
    
    НомерСтроки = 1;
    
    Пока НЕ ADODBRecordset.EOF  Цикл    

        ADODBRecordset.MoveNext();  // Следующая строка.

    КонецЦикла;


и почему то когда в екселе только одна строчка то у меня не считывает этот файл?
что не так?
 
 
   shuhard
 
1 - 10.10.18 - 12:29
(0)[почему то] - сам просишь не читать и почему

HDR=Yes
   serg-lom89
 
2 - 10.10.18 - 12:38
(1) спасибо тебе.
Вопрос мож не к месту но как обойти этот лист ,
как по ячейкам как через ексель?
   serg-lom89
 
3 - 10.10.18 - 12:39
т.е. получить строку по индекму и колонку по индексу
   serg-lom89
 
4 - 10.10.18 - 12:56
и может кто знает как указать в запросе подключения что бы считывание происходило из нужной мне строки?
   d4rkmesa
 
5 - 10.10.18 - 13:00
(2) Грузите содержимое в ТЗ и делайте с ней что хотите.
   d4rkmesa
 
6 - 10.10.18 - 13:01
Как вариант, если 8.3, то открывать xls через табличный документ и работать уже с ним.
   serg-lom89
 
7 - 10.10.18 - 13:03
(5) а как програмно его сразу в тз загнать можно?
   d4rkmesa
 
8 - 10.10.18 - 13:09
(7) Только вручную. Копипаста в помощь:
http://catalog.mista.ru/public/163640/
   Cyberhawk
 
9 - 10.10.18 - 13:11
Если файл xlsx, то все кроме "нативного" его чтения - УГ
   serg-lom89
 
10 - 10.10.18 - 14:17
(8) че то условие то не отрабатывает которое в статье указано(
что бы считывало по номеру строки указаной
 
 Рекламное место пустует
   Cool_Profi
 
11 - 10.10.18 - 14:21
(9) Если угой считать то, что нативное чтение на пару порядков медленней - то согласен
   serg-lom89
 
12 - 10.10.18 - 14:25
Функция ПолучитьТаблицуЗначенийИзЭксельЧерезADO(АдресВременногоХранилища, СтруктураКолонок, НомерЛиста = 1, НомерПервойСтроки = 0) экспорт
    
    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xls");
    
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    //

    ТЗПрочитанныеДанные = Новый ТаблицаЗначений;
    Для Каждого КлючИЗначение из СтруктураКолонок Цикл
        Если КлючИЗначение.Значение = 0 тогда
            СтруктураКолонок.Удалить(КлючИЗначение.Ключ);
            Продолжить;  // Дополнительная Проверка

        КонецЕсли;
        
        ТЗПрочитанныеДанные.Колонки.Добавить(КлючИЗначение.Ключ); 
    КонецЦикла;
    
    СтрокаСоединения = "
    |Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяВременногоФайла)+";
    |Extended Properties=""Excel 8.0;HDR=NO;IMEX=1""";    
    
     Соединение = Новый COMОбъект("ADODB.Connection");    
    Попытка        
        Соединение.Open(СтрокаСоединения);                   
    Исключение      
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При открытии приложения: " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;
    
    НаименованиеЛиста = "Лист"+СокрЛП(НомерЛиста)//тут надо что бы по умолчанию щел лист с наименованием Лист1


    ТекстЗапроса = "SELECT * FROM `" + НаименованиеЛиста + "$A1:IV` "; 

    
    ADODBRecordset = Новый COMОбъект("ADODB.Recordset");                   
    Попытка
        ADODBRecordset.Open(ТекстЗапроса, Соединение);
    Исключение
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При чтении файла : " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;       
    
    
    КолвоКолонокExcel = ADODBRecordset.Fields.Count;
    
      
    НомерСтроки = 0;
    Пока ADODBRecordset.EOF() = 0 Цикл
        
        НомерСтроки = НомерСтроки + 1;
        
        Если НомерСтроки <  НомерПервойСтроки Тогда    // Номер строки вне диапазона считываемых строк.

            ADODBRecordset.MoveNext();            // Следующая строка.

            Продолжить;
        КонецЕсли;
        
        
        
        СтрокаТаблицыЗначений = ТЗПрочитанныеДанные.Добавить();    
        
        Для каждого КлючИЗначение из СтруктураКолонок Цикл
            СтрокаТаблицыЗначений[КлючИЗначение.Ключ] = ADODBRecordset.Fields.Item(КлючИЗначение.Значение-1).Value///РабочийЛист.Cells(ТекСтрока, КлючИЗначение.Значение).Value;

        КонецЦикла;
         ADODBRecordset.MoveNext();  // Следующая строка.

    КонецЦикла;
    
    
    возврат ТЗПрочитанныеДанные;
    
    
КонецФункции

вот моя функция...но почему то если передовать в нее ,номер строки, с какой хочу считать ,то не отрабатывает..
может я туплю(просто прощу разьяснить в чем у меня затык и что не так я делаю)
   serg-lom89
 
13 - 10.10.18 - 14:28
сорян,там ошибка 

Функция ПолучитьТаблицуЗначенийИзЭксельЧерезADO(АдресВременногоХранилища, СтруктураКолонок, НомерЛиста = 1, НомерПервойСтроки = 0) экспорт
    
    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xls");
    
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    //

    ТЗПрочитанныеДанные = Новый ТаблицаЗначений;
    Для Каждого КлючИЗначение из СтруктураКолонок Цикл
        Если КлючИЗначение.Значение = 0 тогда
            СтруктураКолонок.Удалить(КлючИЗначение.Ключ);
            Продолжить;  // Дополнительная Проверка

        КонецЕсли;
        
        ТЗПрочитанныеДанные.Колонки.Добавить(КлючИЗначение.Ключ); 
    КонецЦикла;
    
    СтрокаСоединения = "
    |Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяВременногоФайла)+";
    |Extended Properties=""Excel 8.0;HDR=NO;IMEX=1""";    
    
     Соединение = Новый COMОбъект("ADODB.Connection");    
    Попытка        
        Соединение.Open(СтрокаСоединения);                   
    Исключение      
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При открытии приложения: " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;
    
    НаименованиеЛиста = "Лист"+СокрЛП(НомерЛиста)//тут надо что бы по умолчанию щел лист с наименованием Лист1


    ТекстЗапроса = "SELECT * FROM `" + НаименованиеЛиста + "$A1:IV` "; 

    
    ADODBRecordset = Новый COMОбъект("ADODB.Recordset");                   
    Попытка
        ADODBRecordset.Open(ТекстЗапроса, Соединение);
    Исключение
        Ошибка = ОписаниеОшибки();
        УдалитьФайлы(ИмяВременногоФайла);
        Сообщить("При чтении файла : " + Ошибка);
        Возврат Неопределено;
    КонецПопытки;       
    
    
    КолвоКолонокExcel = ADODBRecordset.Fields.Count;
    
      
    НомерСтроки = 1;
    Пока ADODBRecordset.EOF() = 0 Цикл
        
        НомерСтроки = НомерСтроки + 1;
        
        Если НомерСтроки <  НомерПервойСтроки Тогда    // Номер строки вне диапазона считываемых строк.

            ADODBRecordset.MoveNext();            // Следующая строка.

            Продолжить;
        КонецЕсли;
        
        
        
        СтрокаТаблицыЗначений = ТЗПрочитанныеДанные.Добавить();    
        
        Для каждого КлючИЗначение из СтруктураКолонок Цикл
            СтрокаТаблицыЗначений[КлючИЗначение.Ключ] = ADODBRecordset.Fields.Item(КлючИЗначение.Значение-1).Value///РабочийЛист.Cells(ТекСтрока, КлючИЗначение.Значение).Value;

        КонецЦикла;
         ADODBRecordset.MoveNext();  // Следующая строка.

    КонецЦикла;
    
    
    возврат ТЗПрочитанныеДанные;
    
    
КонецФункции


вот "правильная" моя ф-ция
   Cyberhawk
 
14 - 10.10.18 - 15:03
(11) Так если не Винда, то какие альтернативы?
   shuhard
 
15 - 10.10.18 - 15:08
(4)[как указать в запросе подключения что бы считывание происходило из нужной мне строки?]
https://support.microsoft.com/ru-ru/help/278973/excelado-demonstrates-how-to-use-ado-to-read-and-write-data-in-excel-w

Select * from [Sheet1$A1:B10]
   shuhard
 
16 - 10.10.18 - 15:09
   d4rkmesa
 
17 - 10.10.18 - 15:10
(13) Дык, если вы все-таки по-своему делаете, кто за вас это отладит? Я предлагал просто скопипастить процедуру.
   serg-lom89
 
18 - 10.10.18 - 15:32
да уже разобрался..
счас вопрос задать чтение именно по определенному листу?
   serg-lom89
 
19 - 10.10.18 - 15:32
номеру листа точнее
   shuhard
 
20 - 10.10.18 - 15:42
(19) что-то в (15) не так ?
   serg-lom89
 
21 - 10.10.18 - 15:45
(20) там обращение же по имени листа,а не по номеру его
   serg-lom89
 
22 - 10.10.18 - 15:45
как я понял
   Cool_Profi
 
23 - 10.10.18 - 15:46
(21) Sheet<1> - это не номер?
   serg-lom89
 
24 - 10.10.18 - 15:49
(23) как я понимаю запрос должен быть тогда таким?
    ТекстЗапроса = "SELECT * FROM [Sheet1$]";
   serg-lom89
 
25 - 10.10.18 - 15:54
(24) просто при таком запросе у меня ошибка почему(
   _stay true_
 
26 - 10.10.18 - 16:38
Немного боянисто:

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

6 строк кода
MXL=Новый ТабличныйДокумент;
MXL.Прочитать(АдресФайла);    
Построитель=Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(MXL.Область(1, 1, MXL.ВысотаТаблицы, MXL.ШиринаТаблицы));
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
   _stay true_
 
27 - 10.10.18 - 16:40
И, кстати, можно передать строку и колонку, с которой читать и ограничение
   shuhard
 
28 - 10.10.18 - 17:06
(21)[а не по номеру его]
нужен номер в коллекции - определи его через ADOX


Список тем форума
Рекламное место пустует  Рекламное место пустует
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки - вот настоящая работа.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует