Имя: Пароль:
1C
1С v8
чтение файла Excel через ado - разные типы данных
0 fimanich
 
28.09.11
10:10
Всем привет!
Читаю данные из файла Excel через ado. Все читается нормально, но:
есть колонка "Счет", и счет может быть представлен как строка, например, "60.01", а может как число, например 76. Так вот, которые как строка - нормально считываются, а которые как число - те равны Null. Есть ли какой-то выход в данной ситуации?
1 fimanich
 
28.09.11
10:29
Отзовитесь, спецы!
2 zladenuw
 
28.09.11
10:31
Null когда читаешь с excel  или когда ?
3 fimanich
 
28.09.11
10:33
Null при чтении, т.е. если в ячейке число (например,76), то
rs.Fields(2).value = Null
а если в ячейке строка, например "60.2", то
rs.Fields(2).value = "60.2"
4 ado
 
28.09.11
10:49
Да, через меня нормально только строки читаются. По крайней мере в 1С. Делай в запросе преобразование к строке.
5 ado
 
28.09.11
10:50
+(4) Через CAST, например.
6 fimanich
 
28.09.11
11:01
(4) !!!! ты именно тот, кто может помочь !!!
(5) помоги, пожалуйста, не соображу, как мне в данном случае запрос переделать, сейчас код такой:

QueryString = "
   |SELECT *
   |FROM [" + ИмяТаблицы + "]
   |";
   
   
   rs = Новый COMОбъект("ADODB.Recordset");
   
   Попытка
       rs=db.Execute(QueryString);
   Исключение
       Сообщить("Не удалось выполнить запрос к файлу Excel
       |"+ ОписаниеОшибки(),СтатусСообщения.Важное);          
   КонецПопытки;
7 ado
 
28.09.11
11:08
(6) Звездочку убери, перечисли поля поименно и заключи каждое вот в такую конструкцию: CAST(имя_поля AS char)
8 Kerk
 
28.09.11
11:13
(7) Вопрос под тему: АДО поймет русское название колонок?
9 ado
 
28.09.11
11:17
(8) А фик его знает. По идее должен.
10 ado
 
28.09.11
11:18
+(9) Вообще, это, конечно, от драйвера источника зависит.
11 shuhard
 
28.09.11
11:18
(8) зависит от провайдера, во многих случаях помогает []

на крайний случай есть индекс колонки
12 fimanich
 
28.09.11
11:25
Поменял запрос на такой (никакой код, кроме текста запроса не менял):
QueryString = "
   |SELECT
   |CAST(F1 AS char),
   |CAST(F2 AS char),
   |CAST(F3 AS char),
   |CAST(F4 AS char),
   |CAST(F5 AS char),
   |CAST(F6 AS char),
   |CAST(F7 AS char),
   |CAST(F8 AS char),
   |CAST(F9 AS char),
   |CAST(F10 AS char),
   |CAST(F11 AS char),
   |CAST(F12 AS char),
   |CAST(F13 AS char)
   |FROM [" + ИмяТаблицы + "]
   |";

В итоге ошибка:
{Форма.Форма.Форма(65)}: Ошибка при получении значения атрибута контекста (EOF)
   Пока НЕ rs.EOF Цикл
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
13 Kerk
 
28.09.11
11:25
(9))(11) Спасибо, Попробую. Если не взлетит, буду делать классическим способом.
14 Kerk
 
28.09.11
11:29
Еще вопросик: через dll-ку "ёсел.dll" будет не медленнее читать файл Excel, чем COMОбъект("Excel.Application")?
15 shuhard
 
28.09.11
11:32
(12) строку подключения поменяй
поставь в ней заветные ;HDR=No;IMEX=1"
и убери CAST
16 fimanich
 
28.09.11
11:32
(14) наверное, это тестировать надо.
У меня всё же просьба ответить на (12), а то начинаем немного от темы отходить.
17 fimanich
 
28.09.11
11:40
(15) ты не мог бы строку подключения полностью привести?
Моя первоначальная:
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ИмяФайлаЗагрузки + ";Extended Properties=" + "Excel 8.0;";

А то вот так пишу - ошибку выдает:
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ИмяФайлаЗагрузки + ";Extended Properties=" + "Excel 8.0;HDR=No;IMEX=1";
18 shuhard
 
28.09.11
11:41
(17)
MyCon = Новый COMОбъект ("ADODB.Connection");
MyCon.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\111.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1""");
MyRst = Новый COMОбъект ("ADODB.Recordset");
MyStr = "select * from [Лист1$]";
MyRst.Open (MyStr, MyCon, 2, 3);//adOpenDynamic, adLockOptimistic
Пока НЕ MyRst.EOF() Цикл
...
КонецЦикла;
MyRst.Close();
MyCon.Close();
КонецПроцедуры
19 ado
 
28.09.11
11:43
20 fimanich
 
28.09.11
12:55
(18) Огромное спасибо, взлетело!!!
Спасибо всем участникам!!!
21 shuhard
 
28.09.11
15:19
(20) вот что IMEX животворящий делает
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший