Имя: Пароль:
1C
1С v8
Импорт из Excel через ADO. Не всё вычитывает :(
0 fisher
 
01.08.13
18:45
Юзаю строку подключения
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПараметрыПодключения.ИмяФайла + "; Extended Properties=""Excel 12.0; HDR=NO;""";
Вычитываю запросом "SELECT * FROM [" + ИмяЛиста + "]"
И всё какбэ работает... Но попадаются иногда файлы содержанием вроде накладной - шапка и табличная часть, которые таким макаром вычитываются без шапки. Другие нормально. Один из файлов вообще шамански читается - только строка заголовков табличной части, а если перед этим его открыть в екселе - то полностью...
Сталкивался ли кто с подобным и получилось ли победить? Если да, то как?
1 shuhard
 
01.08.13
18:47
(0) сталкивались
как ни странно помогает открытие файлика через апликэйшен и сохранение в старых форматах

ну и да, ADODB не универсален
2 fisher
 
01.08.13
18:49
Фигово...
Пробовал и провайдера Microsoft.Jet.OLEDB.4.0; Extended Properties="Excel 8.0", такая же фигня...
3 shuhard
 
01.08.13
18:51
(2) угу
бывает

универсального рецепта нет
4 Ёпрст
 
гуру
01.08.13
18:53
вот с таким подключением попробуй еще
ConnectionString =  "Provider=Microsoft.Jet.OLEDB.4.0;
                                    |Data Source="+ПолноеИмяФайла+";
                                    |Mode=ReadWrite;
                                    |Extended Properties=""Excel 8.0;
                                    |HDR=No;
                                    |FirstRowHasNames=0;
                                    |IMEX=1;""";

ну и потом
CursorType = 3;
LockType = 3;
поставь у адорекорд
5 zladenuw
 
01.08.13
18:53
(0)а может такой механизм использовать ? http://infostart.ru/public/142187/
6 shuhard
 
01.08.13
18:55
(4)[CursorType = 3;
LockType = 3;]
ну уж это не причем
7 fisher
 
01.08.13
18:59
(3) Пересохранение в разных форматах не лечит. Видать какая-то особенность именно этого файла. Если тупо первую строчку удалить (там тоже текст какой-то), то все ОК.
(4) Пробовал
Может, есть что-то хитрое еще в Extended Properties? Где надыбать полный список ентих пропертей? Навскидку не гуглится...
8 fisher
 
01.08.13
19:00
Завтра еще пару раз апну и в архив... Пичалька...
9 Ёпрст
 
гуру
01.08.13
19:03
у меня вот че записано в какой-то поделке (не моё)
//1-я строка не читается при 'HDR=Yes' (так и задумано)
    //1-я строка не читается при 'HDR=Yes;FirstRowHasNames=1' (так и задумано)
    //1-я строка не читается при 'HDR=Yes;FirstRowHasNames=0' (HDR, видимо, главнее)
    //1-я строка не читается при 'FirstRowHasNames=1' (так и задумано)
    //1-я строка не читается при 'FirstRowHasNames=0' (no comments)
    //1-я строка читается при 'HDR=No' (так и задумано, доки не врут!)
    //1-я строка читается при 'HDR=No;FirstRowHasNames=0' (так и задумано)
    //1-я строка читается при 'HDR=No;FirstRowHasNames=1' (HDR, видимо, главнее)
    //Таким образом, можно сделать выводы, что при доступе к листам книг Excel через Jet OLEDB:
    //1) По умолчанию используется значение HDR=Yes;
    //2) Значение FirstRowHasNames вообще ни на что не влияет.
    //Mode=3; - Mode=ReadWrite;
10 shuhard
 
01.08.13
19:05
(7) [ Если тупо первую строчку удалить (там тоже текст какой-то), то все ОК. ]
тогда понятно
ADODB по первым 8 строкам тип определяет
11 fisher
 
02.08.13
10:02
(10) В идеале нужна бы опция, позволяющая отключить скайнет и тупо вычитать данные всего листа "как есть".
12 shuhard
 
02.08.13
10:58
(11) я бы взял сразу деньгами
13 fisher
 
02.08.13
14:46
(12) Разобрался. Может, у тебя такая же фигня.
Короче, имена листов для обращения по ним в запросе я получал через Connection.OpenSchema(adSchemaTables).
А оказалось, что там могут быть не только листы. Вставленные таблицы, фильтрованные области тоже туда попадают.
Т.е. в проблемных файлах получалось так, что я обращался не листу целиком, а к какой-то его области.
Единственный способ выкупить именно имена листов, который я нашел - это знак "$" в конце имени. Причем надо учесть, что имя листа может быть в одинарных ковычках.
Теперь полет вроде нормальный.
14 fisher
 
02.08.13
15:26
В итоге плюнул и сделал вычитывание имен листов через Excel.Application. Бо SchemaTables возвращает их в неправильном порядке.
15 fisher
 
02.08.13
15:33
(14) + Но оказалось, что это долго...
Оставил загрузку списка листов через ADO, и только если их больше одного - через Excel.Application.