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

Вниз

Странное поведение Variant при импорте из Excel   Найти похожие ветки 

 
Альф   (2008-06-10 09:47) [0]

При типовом импорте данных из таблички Excel выскакивает эксепшн на ячейках общим форматом, но содержащих integer.
Сообщение исключения вот такое:
"Could not convert variant of type (String) into type (Double)"
Код вызвавший это исключение:
   
   data := VarArrayCreate([1, 44, 1, 7], varVariant);
   data := xl.Sheet.Range["A1:G44"].Value;

   Memo.Clear();
   for i := 1 to 44 do begin
     s := "";
     for j := 1 to 7 do try
       s := s + "~" + data[i, j] + "~ ";
     except
       on E: Exception do begin
         s := s + E.Message;
         break;
       end;
     end;
     Memo.Lines.Append(s);
   end;

Строка вызвавшая исключение помечена жирным. Когда в этой же строке приводим к string принудительно, исключения не возникает  s := s + "~" + string(data[i, j]) + "~ ";
Интересует, что может вызвать такое поведение ?


 
Palladin ©   (2008-06-10 09:56) [1]

Var
r:String;
...
  data := VarArrayCreate([1, 44, 1, 7], varVariant); // ?
  data := xl.Sheet.Range["A1:G44"].Value;

  Memo.Clear;
  for i := 1 to 44 do begin
    s := "";
    for j := 1 to 7 do try
      if (data[i,j]=Null) or (data[i,j]=Unassigned)
       Then r:=""
       Else r:=data[i, j];
      s := s + "~" + r + "~ ";
    except
      on E: Exception do begin
        s := s + E.Message;
        break;
      end;
    end;
    Memo.Lines.Append(s);
  end;


попробуй


 
Anatoly Podgoretsky ©   (2008-06-10 09:59) [2]

> Альф  (10.06.2008 9:47:00)  [0]

Не все строки можно преобразовать в число, точнее только ничтожное количество.


 
Palladin ©   (2008-06-10 10:02) [3]

самое интересное, что, на первый взгляд, никто этого преобразования от компилятора не требует...


 
Альф   (2008-06-10 10:21) [4]


> Palladin ©   (10.06.08 09:56) [1]

Помогла даже не проверка, а просто введение дополнительной string переменной...  В высшей степени странно :\
Дело в том у меня в табличке нету ни Null ни Unassigned. А сама табличка вот такого вида:

Час Нагрузка
1 10
2 20
3 30

И ругалось именно на числа 1, 2, 3 и т.п.


> Anatoly Podgoretsky ©   (10.06.08 09:59) [2]

Анатолий - но у меня нигде строка не переводилась в число, а был только variant -> string. Понимаете в чём странность ?


 
Palladin ©   (2008-06-10 10:25) [5]


> Альф   (10.06.08 10:21) [4]

да я знаю, что именно введение поможет, но проверка на null все равно должна быть... я как то сталкивался с этой проблеммой, сильно не стал заморачиваться на внутреннем механизме... это не только экселя касается, а variant"ов вообще... считай это фичей


 
Palladin ©   (2008-06-10 10:31) [6]

вот простейший пример

var
 d:variant;
 s:String;
begin
 d:=12.1;
 s:=Caption;
 s:=s+d;
end;


будет ругань, причем сверхстранная, но вводим r и

var
 d:variant;
 r,s:String;
begin
 d:=12.1;
 s:=Caption;
 r:=d;
 s:=s+r;
end;


усе в порядке...
ps. я думал в d7 этого уже нет...


 
Альф   (2008-06-10 10:41) [7]

Понял.
Спасибо.
Сколько раз пользовался таким способом - проблем небыло. Значит звёзды сегодня так встали ;)


 
Альф   (2008-06-10 10:48) [8]

Хотя всётаки интересно, почему считается Unassigned, когда в ячейке явно прописан integer(0) или float(0.0) или тот же "0" получается в результате вычислений.
Может значения по умолчанию ?

Также интересно почему банальное приведение string(data[i, j]) работает и будет ли работать в дальнейшем :)


 
Palladin ©   (2008-06-10 10:51) [9]


> Может значения по умолчанию ?

это к аффтарам экселя, боюсь зависит от версии


> Также интересно почему банальное приведение string(data[i,
>  j]) работает и будет ли работать в дальнейшем

нет, как только Null встретит, так сразу и перестанет :) я"ж не зря условие вставил


 
ЮЮ ©   (2008-06-10 11:04) [10]

> я"ж не зря условие вставил


>(data[i,j]=Null) or (data[i,j]=Unassigned)

а VarIsEmpty и VarIsNull, видимо, зря написаны
Писать в коде data[i,j]=Null также чревато, как и в SQL запросе, ИМХО.


 
Palladin ©   (2008-06-10 11:08) [11]


> а VarIsEmpty и VarIsNull, видимо, зря написаны

VarToStrDef, видимо, тоже зря


 
Anatoly Podgoretsky ©   (2008-06-10 11:22) [12]

1. Что то у тебя не то, полей говоришь два, а массив объявлен на 7.
2. Variant это не string и поэтому это предположение не верно.
3. Решение в проверке перед присваиванием, только как в [10], а не в [1].
4. странностей не понимаю, просто работаю как положено работать с вариантами. Полезно взглянуть в справке на  TVarType type, как первая точка.


 
Anatoly Podgoretsky ©   (2008-06-10 11:24) [13]

А попытка преобразования в Double вот здесь data[i, j] видимо тип ячейки в Экселе Double, а там не оно.


 
Palladin ©   (2008-06-10 11:42) [14]


> Anatoly Podgoretsky ©   (10.06.08 11:24) [13]

ага, и в [6] тоже тип ячейки в Экселе Currency, а там не оно...


 
Anatoly Podgoretsky ©   (2008-06-10 12:08) [15]

> Palladin  (10.06.2008 11:42:14)  [14]

Вот именно это "не оно" ну дык вариантик



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

Форум: "Основная";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1246031571
rus
2009-06-26 19:52
2009.08.30
запрос в firebrid


1-1213336156
Anton
2008-06-13 09:49
2009.08.30
отладка библиотеки


2-1246624890
Художник
2009-07-03 16:41
2009.08.30
Сброс размера динамического массива


2-1246188747
Guest___
2009-06-28 15:32
2009.08.30
Запуск программы в определенное время


2-1246026375
Vayrus
2009-06-26 18:26
2009.08.30
Проблема с чтением DWORD значения из реестра Win 7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский