Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

Пустые клетки в Excel через ADO   Найти похожие ветки 

 
deadbitch   (2004-01-28 16:07) [0]

Столкнулся с совершенно для меня неожиданной проблемой.
Открываю .xls через TADOConnection и читаю оттуда через TADODataset. Так вот, TADODataset видит некоторые клетки в столбцах пустыми, хотя в excel они заполнены. Долго шаманил с форматированием столбца etc. Но ничего не помогло. Помогает, если только стереть клетку и заново вбить туда ее данные. Тогда TADODataset ее видит как не пустую. Но в файле 5800 строк, поэтому такое лекарство не катит. Может, кто знает в чем проблема?

Ответьте, если можно на е-мыл. :-7


 
sniknik   (2004-01-28 16:25) [1]

либо там формула, либо данные не совпадают с определенным типом.
формулы не передаются, и не высчитываются, ADO работает только с данными.
а тип автоопределяется по первым восьми (кажется, по умолчанию, не помню) ячейкам если определился как цифра а после в ячейке текст... извини тоже в ячейке ничего не будет.
здесь выход все текстом получать (можно в строке подключения задать не определять тип а текст)

> Ответьте, если можно на е-мыл. :-7
на мыл в форуме (не только в этом) п р и н ц и п и а л ь н о не отвечают. (не знаю как кому а по мне это хороший принцип, не только тебе решение нужно, зачем же их обделять? только потому что ты первый спросил?)


 
deadbitch   (2004-01-23 13:41) [2]

Нет, там не формула. Тип столбца: Text. В этом столбце в перемешку и текст и цифры, т.е. некоторые клетки только буквы, а некоторые только цифры.
А передаю я так: storedproc.parameters[nn].value := dataset.fields[nn].value, т.е. без типизации.
В чем же дело, все таки. Босс уже негодует... :(((


 
sniknik   (2004-01-28 19:28) [3]

> Тип столбца: Text.
откуда видно, в экселе тип задал? плюнь на это, неработает, екселевское форматирование jet-ом не воспринимается
> А передаю я так: ...
вроде говорил с чтением проблемы? так понимаю в гриде связаном с датасетом нет записей (пропущены) хотя если экселем откроеш там чтото есть. вот эта проблема решается так (можно попробовать)
строку конекта делаеш
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\ExelFile.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=1;";Persist Security Info=False
HDR=YES - первая строка воспринимается как названия полей (NO будет F1 F2..... )
IMEX=1 вот от этого зависит будут ли поля как текст восприниматся (а значит и не пропускатся) значение 1 обязательно
но кроме этого в первых 8 ячейках(упоминаемый дефаулт) обязательно должно текстовое поле промелькнуть (для автоопределителя типа) если там все цифры все одно числовое будет.
можно сделать автоопределение до большей глубины (если файл поправить затруднительно) это в реестре TypeGuessRows=100; //сюда число просматриваемых строк (и тогда тип строка дожна хоть раз мелькнуть в 100 первых записях, для текстового определения поля)
ветка где это находится
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

поставь все, и попробуй еще раз прочитать "неправильную" таблицу с пропусками.

> Босс уже негодует... :(((
ну чтож поделаеш если он такой нервный, меняй боса.


 
deadbitch   (2004-01-28 20:14) [4]

Там в том-то и проблема, что когда я передаю storedproc.parameters[nn].value := dataset.fields[nn].value, это самое dataset.fields[nn].value = NULL, это я в дебагмоде посмотрел, соотв-но в таблице БД поля NULL. А в эксель смотришь - там поле не пустое, стоит там цифра. Это я случайно подметил, а тоб весь проект пошел на фиг. Бо у меня измер. каналы электросетей, вот это была бы феня. :)))
ps: но прикол еще такой. идет например в этом столбце текст, а потом цифры. вот первая цифра ADO не видится, а следующие видятся. Потом опять текст. Затем цифры, некторые уже в разброс видятся, а некоторые как NULL проходят. :-7 Чертовщина...
Сейчас попробую твой метод. :)


 
deadbitch   (2004-01-28 20:41) [5]

Теперь такая проблема. Поставил IMEX = 1 & TypeGuessRows = 100. Наконец-то увиделись цифры, которые были не видны. Но теперь в какой-то момент импорта вылазит ошибка EOLEException: Application uses a value of the wrong type for the current operation. Т.е. типа неправильный тип я использую. А где я его использую если у меня везде .Value. А тут такое дело: у меня все поля достаются нетипизируясь, кроме:

dm.p_AddCC.Parameters.ParamByName("@ReportName").Value :=
dm.adExcel.Fields[0].AsString + #32 + dm.adExcel.Fields[1]. AsString + #32 + dm.adExcel.Fields[4].AsString + #32 + dm. adExcel.Fields[5].AsString + #32 + dm.adExcel.Fields[6].AsString + #32 + dm.adExcel.Fields[20].AsString;
dm.p_AddCC.Parameters.ParamByName("@ConstantEnergy").Value := dm. adExcel.Fields[8].Value;
>> dm.p_AddCC.Parameters.ParamByName("@Destination").Value := dm.adExcel.Fields[20].Value;

поскольку мне надо соединить 6 параметров в одну строку.
Эти три строки кода идут подряд.
На помеченной строке останавливается ошибка после некоторого кол-ва циклов (по строкам). Что-то подсказывает, что после 100-го. :) Блин, то понос, то золотуха.


 
sniknik   (2004-01-28 21:32) [6]

> Что-то подсказывает, что после 100-го. :)
не, врядли в отличии от самого ехеля тут тип дается раз и на весь столбец. т.е. если сразу не отказало то дальше не должно. (по этой причине, может другая ошибка)

> поскольку мне надо соединить 6 параметров в одну строку.
не боишся что размер 255 превысит? проверь, при превышении(если) передавай как memo поле. (или можно в запросе суммировать попробовать, но тип приемник естественно поменять на больший)
в общем это еще одно "слабое звено".

> Но теперь в какой-то момент импорта ...
импорта? а стандартным DTS не пробовал, в MSSQL? даже если неполучится, сохрани как SQL скрипт, можно много интересного узнать.


 
deadbitch   (2004-01-28 22:25) [7]

Стандартным то можно, но мне надо импортировать кроме этого месячные отчеты от узлов сети, которые стандартными методами никак нельзя. Там логика напихана.
Короче, я все перепробовал, вылазит эта ошибка при включенном IMEX. Без него, там где соединение параметров, проходит только .AsString. На остальные спеллкасты :) вылазит ошибка конвертирования OleStr в Double. Мля. Мне все же надо в программе импорт, а не ДТС-ом. Не перебивать же все строки с цифрами. :(


 
sniknik   (2004-01-28 22:32) [8]

> вылазит ошибка конвертирования OleStr в Double.
1 точку/запятую в системе поменяй на обратный символ (если стоит точка разделителем то на запятую, запятая ....)
2 попробуй конвертацию в запросе прописать.

> Короче, я все перепробовал
не говори так, все по определению нельзя перепробовать.


 
deadbitch   (2004-01-29 00:55) [9]

Короче, компромиссное решение.
1. IMEX = 1
2. HDR = NO
3. TypeGuessRows = 1
4. В первой строке файла во всех столбцах прописать такие значения, чтобы Джет ДБ однозначно распознал его тип. Если это целое то 11, если вещ. то 1,1, если текст то "aa".
5. Указать в рантайме типы полей датасету такие же какие будут распознаны Джет ДБ. Вот так:

for i := 0 to dm.adExcel.FieldDefs.Count-1 do
dm.adExcel.FieldDefs[i].DataType := ftWideString;
dm.adExcel.FieldDefs[8].DataType := ftLargeint;
dm.adExcel.FieldDefs[9].DataType := ftLargeint;
dm.adExcel.FieldDefs[10].DataType := ftFloat;
dm.adExcel.FieldDefs[11].DataType := ftFloat;
dm.adExcel.FieldDefs[12].DataType := ftLargeint;
dm.adExcel.FieldDefs[16].DataType := ftFloat;
dm.adExcel.FieldDefs[17].DataType := ftFloat;
dm.adExcel.FieldDefs[21].DataType := ftInteger;
dm.adExcel.FieldDefs[29].DataType := ftFloat;
dm.adExcel.FieldDefs[30].DataType := ftFloat;
dm.adExcel.FieldDefs[32].DataType := ftFloat;
dm.adExcel.FieldDefs[71].DataType := ftLargeint;
dm.adExcel.FieldDefs[74].DataType := ftLargeint;
dm.adExcel.FieldDefs[76].DataType := ftLargeint;

6. Везде использовать нетипизованное обращение. Типа:

dm.p_AddCC.Parameters.ParamByName("@MainSubstation").Value := dm.adExcel.Fields[0].Value;

7. Если использовать типизованное, то только чтобы тип совпадал с тем, что указал сам и что поймет Джет ДБ. :)
8. Если ничего не забыл, то таким образом никогда не потеряются значения ячеек. :)


 
deadbitch   (2004-01-29 01:00) [10]

Добавочка. Если использовать IMEX=0, то надо чтобы столбцы имели клетки одного типа, т.е. чтоб если целое, то шло целое. Если же идет смена типов, то похоже Джет ДБ от этого делается дурно и значения некоторых клеток теряются, особенно тех, которые идут на границах смены типов. :( Или же вылазить тот самый эксепшн, который говорит, что мы берем поле как тип, который на самом деле не такой. Причем ошибка видимо вылазит как раз при смене типа клетки. :)
Вот такое научное изыскание я провел сегодня. Спасибо sniknik за асситирование - про IMEX я не знал. Зажимы и тампоны выкинуть. :)) Повязки снять.

ps: я проапдейтил Джет ДБ до SP8, спасибо Майкрософт, но это меня не спасло. :(


 
sniknik   (2004-01-29 08:09) [11]

> Или же вылазить тот самый эксепшн, который говорит, что мы берем поле как тип, который на самом деле не такой. Причем ошибка видимо вылазит как раз при смене типа клетки. :)
ну а чего же ты хочеш если у тебя там действительно разные типы, надо делать обработку которая это учитывает. и не ложить в вещественную ячейку числа "1.2" попеременно с "1,3" к примеру. и т.д. отследить все случаи "непорядка".


 
deadbitch   (2004-01-31 19:10) [12]

Ну там нет смены с точки на запятую в вещественных, потому что на компах, где отчет набивается русская локаль. А в ней ведь запятая. Смена типа видимо в случае если Джет ДБ определил столбец как целый, а где-то после числа встречается срока - вот здесь он вылетает. Что интересно при Extended Properties=Excel 8.0 (и все) как рекомендует Марко Кэнту ( я там брал инфу по работе с Экселем) НИКАКИХ ошибок не вылазит. Но теряются клетки. Млин... :(


 
sniknik   (2004-01-31 21:49) [13]

> Ну там нет смены с точки на запятую в вещественных, потому что на компах, где отчет набивается русская локаль. А в ней ведь запятая.
значит если запятая и текст то надо менять на точку, для примера посмотри
SELECT Left("537,89", InStr("537,89", ",")-1)+"."+Right("537,89", Len("537,89")-InStr("537,89", ",")) FROM [Лист1$]

> Смена типа видимо в случае если Джет ДБ определил столбец как целый, а где-то после числа встречается срока - вот здесь он вылетает.
если как целый то пр не совпадении типа должно быть null

> Но теряются клетки. Млин... :(
смысл как раз в том чтобы определяло как текст, тогда ничего терятся не будет, но уж разбор по типам будь добр сам делай.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.034 c
11-79692
Кладов
2003-06-05 09:27
2004.02.25
Совместимость MCK-проектов с FPC


3-79650
guest_Dmitry
2004-01-31 12:45
2004.02.25
Access через ADO - логин и пароль?


6-80083
beeper
2003-12-16 19:31
2004.02.25
Изменить настройки сети


8-80045
Tol-123
2003-10-25 19:57
2004.02.25
Размер----ScreenShot


6-80065
L0N6
2003-12-17 17:35
2004.02.25
Быстрая передача данных по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский