|
чтение ексель с помощью ADODB.Connection | ☑ | ||
---|---|---|---|---|
0
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(); // Следующая строка. КонецЦикла; и почему то когда в екселе только одна строчка то у меня не считывает этот файл? что не так? |
|||
1
shuhard
10.10.18
✎
12:29
|
(0)[почему то] - сам просишь не читать и почему
HDR=Yes |
|||
2
serg-lom89
10.10.18
✎
12:38
|
(1) спасибо тебе.
Вопрос мож не к месту но как обойти этот лист , как по ячейкам как через ексель? |
|||
3
serg-lom89
10.10.18
✎
12:39
|
т.е. получить строку по индекму и колонку по индексу
|
|||
4
serg-lom89
10.10.18
✎
12:56
|
и может кто знает как указать в запросе подключения что бы считывание происходило из нужной мне строки?
|
|||
5
d4rkmesa
10.10.18
✎
13:00
|
(2) Грузите содержимое в ТЗ и делайте с ней что хотите.
|
|||
6
d4rkmesa
10.10.18
✎
13:01
|
Как вариант, если 8.3, то открывать xls через табличный документ и работать уже с ним.
|
|||
7
serg-lom89
10.10.18
✎
13:03
|
(5) а как програмно его сразу в тз загнать можно?
|
|||
8
d4rkmesa
10.10.18
✎
13:09
|
(7) Только вручную. Копипаста в помощь:
http://catalog.mista.ru/public/163640/ |
|||
9
Cyberhawk
10.10.18
✎
13:11
|
Если файл xlsx, то все кроме "нативного" его чтения - УГ
|
|||
10
serg-lom89
10.10.18
✎
14:17
|
(8) че то условие то не отрабатывает которое в статье указано(
что бы считывало по номеру строки указаной |
|||
11
Cool_Profi
10.10.18
✎
14:21
|
(9) Если угой считать то, что нативное чтение на пару порядков медленней - то согласен
|
|||
12
serg-lom89
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(); // Следующая строка. КонецЦикла; возврат ТЗПрочитанныеДанные; КонецФункции вот моя функция...но почему то если передовать в нее ,номер строки, с какой хочу считать ,то не отрабатывает.. может я туплю(просто прощу разьяснить в чем у меня затык и что не так я делаю) |
|||
13
serg-lom89
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(); // Следующая строка. КонецЦикла; возврат ТЗПрочитанныеДанные; КонецФункции вот "правильная" моя ф-ция |
|||
14
Cyberhawk
10.10.18
✎
15:03
|
(11) Так если не Винда, то какие альтернативы?
|
|||
15
shuhard
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] |
|||
16
shuhard
10.10.18
✎
15:09
|
||||
17
d4rkmesa
10.10.18
✎
15:10
|
(13) Дык, если вы все-таки по-своему делаете, кто за вас это отладит? Я предлагал просто скопипастить процедуру.
|
|||
18
serg-lom89
10.10.18
✎
15:32
|
да уже разобрался..
счас вопрос задать чтение именно по определенному листу? |
|||
19
serg-lom89
10.10.18
✎
15:32
|
номеру листа точнее
|
|||
20
shuhard
10.10.18
✎
15:42
|
(19) что-то в (15) не так ?
|
|||
21
serg-lom89
10.10.18
✎
15:45
|
(20) там обращение же по имени листа,а не по номеру его
|
|||
22
serg-lom89
10.10.18
✎
15:45
|
как я понял
|
|||
23
Cool_Profi
10.10.18
✎
15:46
|
(21) Sheet<1> - это не номер?
|
|||
24
serg-lom89
10.10.18
✎
15:49
|
(23) как я понимаю запрос должен быть тогда таким?
ТекстЗапроса = "SELECT * FROM [Sheet1$]"; |
|||
25
serg-lom89
10.10.18
✎
15:54
|
(24) просто при таком запросе у меня ошибка почему(
|
|||
26
_stay true_
10.10.18
✎
16:38
|
Немного боянисто:
Читаешь файл эксель средствами платформы, получаешь на выходе таблицу значений и дальше делаешь с ней что хочешь. 6 строк кода MXL=Новый ТабличныйДокумент; MXL.Прочитать(АдресФайла); Построитель=Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(MXL.Область(1, 1, MXL.ВысотаТаблицы, MXL.ШиринаТаблицы)); Построитель.Выполнить(); ТЗ = Построитель.Результат.Выгрузить(); |
|||
27
_stay true_
10.10.18
✎
16:40
|
И, кстати, можно передать строку и колонку, с которой читать и ограничение
|
|||
28
shuhard
10.10.18
✎
17:06
|
(21)[а не по номеру его]
нужен номер в коллекции - определи его через ADOX |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |