Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

Странное поведение 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1246524209
petr
2009-07-02 12:43
2009.08.30
Работа с рееестром


15-1245082595
DillerXX
2009-06-15 20:16
2009.08.30
Советский усилитель


2-1246549168
vslabchenko
2009-07-02 19:39
2009.08.30
Парадокс с ShellExecute


15-1246566925
Юрий
2009-07-03 00:35
2009.08.30
С днем рождения ! 3 июля 2009 пятница


15-1246469626
dmk
2009-07-01 21:33
2009.08.30
Бесперебойники