Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Excel -> ADO(Jet.OLEDB.4) ;-> AdoDataSet [D7, Access]


Quest ©   (2003-07-03 09:48:00) 

Пропадают значения при экспорте столбца значений из Excel ...
Задача: из Excel в Access экспортируется столбец со значениями,
ConnectionXLS.ConnectionString:= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Name_File+";Extended Properties=Excel8.0;Persist Security Info=False";
Связь устанавливается, но после запроса:
DataSetXLS.CommandText:="SELECT * " +
"FROM "+ "[" +
Sheet +"] "+
" WHERE F1 <> "" ;

в DataSetXLSнаходятся не все значения. (значения вида "12345678" , целое десятизначное число)
Из 92 выбираются лишь 68 ... в XLS файле менял формат ячеек, отслеживал пробелы, убирал группировки, даже шрифт и цвет ставил стандартными :)
В чём может быть проблема?


Quest   (2003-07-07 11:41:00) [1]

Большое спасибо! Именно этого и не хватало.


sniknik   (2003-07-05 00:01:00) [2]

ну вот пришол с работы, пора занятся делом. :о))
проблему вызавали не неправильные данные как ни странно а наоборот правильные с точки зрения Excel, если присмотрется там возникает упоминание что число записано строкой, и с ними как раз проблем нет, впереди до данных внушительный заголовок с пустыми полями так что колонка определяется как текстовая, а вот "правильные" числовые данные как раз игнорируются. странный поворот, можно конечно пробежатся по всем ячейкам и исправить все на числа включая заголовок или заставить все воспринимать как текст(а у тебя с таким форматированием листа по другому и не будет), к счастью есть параметр который говорит jet-у чтобы все воспринимать как текст (в общем только строку подключения поправить нужно как ниже).
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\0201040301.xls;Extended Properties="Excel 8.0; IMEX=1";Persist Security Info=False


sniknik   (2003-07-04 15:28:00) [3]

Quest © (04.07.03 14:11)
правильнее будет сказать она работает, но не так как ты от нее ожидаеш.
пришли мне файл с начитаемыми позициями. посмотрю, так сказать чегонибудь трудно (не сталкивался с такой избирательностью).


Quest   (2003-07-04 14:11:00) [4]

к сожелению и эта схема не работает, в ADODataSet поступают одни пустые значения ...


sniknik   (2003-07-03 17:36:00) [5]

это и есть способ для JET.4
попробуй так (у тебя же там разнотипные значения а ты их все под одну гребенку)
SELECT iif(IsNumeric(F1),CStr(F1),"0") FROM [Sheet1$]


Quest   (2003-07-03 17:19:00) [6]

мдааа, всё равно не катит
SELECT CStr(F1) FROM [SHEET]
тоже ругается:
... raised exception class EOleException with message "Data provider or other service returnde an E_FAIL status".

Может есть другой способ приведения к типу понимаемый ADO JET.4?


Quest   (2003-07-03 16:56:00) [7]

Премного благодарен.


sniknik   (2003-07-03 16:48:00) [8]

CStr, CInt ...
CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)

(в MSSQL используется и CAST и CONVERT, но в общем смысл понятен :о))


Quest   (2003-07-03 16:21:00) [9]

уточняю вопрос. в Oracle используется CAST, в MSSQL - CONVERT, а что можно использовать в связке EXCEL -> ADO для приведению к нужному типу ?


Quest   (2003-07-03 13:51:00) [10]

и всё же, как в запросе принудительно привести значения к одному типу?

интересно, я сам через некоторое время отвечу на этот вопрос или всё же ктото проявит инициативу? :)))


Quest   (2003-07-03 13:32:00) [11]

если кому ещё интересно, кажись нашёл!!!!

Параметры инициализации Microsoft Excel
Папка Jet\4.0\Engines\Excel содержит параметры инициализации драйвера Msexcl40.dll, используемого при доступе к внешним электронным таблицам Microsoft Excel. В следующем примере демонстрируются типичные значения элементов данной папки.

win32=<путь>\ msexcl40.dll

TypeGuessRows=8

ImportMixedTypes=Text

AppendBlankRows=1

FirstRowHasNames=Yes


Ядро базы данных Microsoft Jet следующим образом использует элементы в папке Excel.

Элемент Описание

TypeGuessRowsЧисло строк, проверяющихся при определении типа данных. Тип данных определяется по максимальному числу найденных значений одного типа. В случае совпадения используются типы в следующем порядке: Number, Currency, Date, Text, Boolean. Если обнаруживаются данные, не соответствующие выбранному типу столбца, возвращается пустое значение Null. Если столбец, содержащий данные разных типов, обнаруживается при импорте, то тип данных всего столбца определяется значением элемента «ImportMixedTypes».
По умолчанию проверяется 8 строк. Значения имеют тип DWORD в Windows 95 и Windows NT 4.0 или тип REG_DWORD в Windows NT 3.51.


Quest   (2003-07-03 13:26:00) [12]

Вроде "свет пробился", при изменении типа данных в ячейках Excel (при редактировании файла), он меняет тип лишь при "входе - выходе" из ячейки, автоматом по столбцу непрокатывает ... вывод, при запросе тип поля определяется как "текстовое" и те значения которые имеют "числовой" тип - опускаются :( ... а я считал что выбираемые значения имеют тип Variantи при помещении в DataSet сами приводятся к нужному типу ?!
выходит, необходимо делать принудительное приведение к одному типу в запросе.

Не подскажете как корректно это сделать?


Quest   (2003-07-03 11:14:00) [13]

WHERE F1 <> ""- это отсекание пустых значений по первому столбцу, иначе выбираются порядка 7000 строк, НО даже без этого условия, то есть: SELECT * FROM [SHEET], часть значений переходят в DataSet - пустыми, хотя в Excel-е они есть :(
насчёт луны я уже думал, даже ждал смены давления ...

Выяснилось следующее, если числовыезначения которые не беруться (формул в этом столбце - нет) переписать в Excel-e ручками, то они в выборке появляются! но мне нужно экспортировать очень часто и из множества файлов, неужели всё "править руками" ?!


sniknik   (2003-07-03 10:52:00) [14]

выбиратся вообщето должно все, ну то что является данными. формулы не пройдут. а данные должны.

> даже самые неправдоподобные
фазы луны влияют, подожди несколько дней. :о))

WHERE F1 <> ""
условие не выполняеся, пустая строка это что? на что сравнение? может там нет значения и надо так WHERE not ((F1 = "") or (isNull(F1)))
или вроде этого.
(операции со значением Null дают неопределенный результат)

????


Quest   (2003-07-03 10:23:00) [15]

100% решения не видно, но может у кого есть идеи?
пожалуйста выскажите, даже самые неправдоподобные


Наверх

Титульная страница Поиск, карта сайта Написать письмо