![]() |
|
Импорт из 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. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |