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

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

Странное поведение Variant при импорте из Excel [D7, WinXP]


Альф ©   (2008-06-10 09:47:00) 

При типовом импорте данных из таблички 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]) + '~ ';
Интересует, что может вызвать такое поведение ?


Anatoly Podgoretsky   (2008-06-10 12:08:00) [1]

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

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


Palladin   (2008-06-10 11:42:00) [2]


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

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


Anatoly Podgoretsky   (2008-06-10 11:24:00) [3]

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


Anatoly Podgoretsky   (2008-06-10 11:22:00) [4]

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


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


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

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


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

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


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

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


Palladin   (2008-06-10 10:51:00) [7]


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

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


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

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


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

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

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


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

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


Palladin   (2008-06-10 10:31:00) [10]

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

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 этого уже нет...


Palladin   (2008-06-10 10:25:00) [11]


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

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


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


> 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:02:00) [13]

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


Anatoly Podgoretsky   (2008-06-10 09:59:00) [14]

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

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


Palladin   (2008-06-10 09:56:00) [15]

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;


попробуй


Наверх

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