Конференция "Основная" » Странное поведение Variant при импорте из Excel [D7, WinXP]
 
  • Альф (10.06.08 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 © (10.06.08 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 © (10.06.08 09:59) [2]
    > Альф  (10.06.2008 9:47:00)  [0]

    Не все строки можно преобразовать в число, точнее только ничтожное количество.
  • Palladin © (10.06.08 10:02) [3]
    самое интересное, что, на первый взгляд, никто этого преобразования от компилятора не требует...
  • Альф (10.06.08 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 © (10.06.08 10:25) [5]

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

    да я знаю, что именно введение поможет, но проверка на null все равно должна быть... я как то сталкивался с этой проблеммой, сильно не стал заморачиваться на внутреннем механизме... это не только экселя касается, а variant'ов вообще... считай это фичей
  • Palladin © (10.06.08 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 этого уже нет...
  • Альф (10.06.08 10:41) [7]
    Понял.
    Спасибо.
    Сколько раз пользовался таким способом - проблем небыло. Значит звёзды сегодня так встали ;)
  • Альф (10.06.08 10:48) [8]
    Хотя всётаки интересно, почему считается
    Unassigned

    , когда в ячейке явно прописан
    integer(0)

    или
    float(0.0)

    или тот же "0" получается в результате вычислений.
    Может значения по умолчанию ?

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

    работает и будет ли работать в дальнейшем :)
  • Palladin © (10.06.08 10:51) [9]

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

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


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

    нет, как только Null встретит, так сразу и перестанет :) я'ж не зря условие вставил
  • ЮЮ © (10.06.08 11:04) [10]
    > я'ж не зря условие вставил


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

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

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

    VarToStrDef, видимо, тоже зря
  • Anatoly Podgoretsky © (10.06.08 11:22) [12]
    1. Что то у тебя не то, полей говоришь два, а массив объявлен на 7.
    2. Variant это не string и поэтому это предположение не верно.
    3. Решение в проверке перед присваиванием, только как в [10], а не в [1].
    4. странностей не понимаю, просто работаю как положено работать с вариантами. Полезно взглянуть в справке на  TVarType type, как первая точка.
  • Anatoly Podgoretsky © (10.06.08 11:24) [13]
    А попытка преобразования в Double вот здесь data[i, j] видимо тип ячейки в Экселе Double, а там не оно.
  • Palladin © (10.06.08 11:42) [14]

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

    ага, и в [6] тоже тип ячейки в Экселе Currency, а там не оно...
  • Anatoly Podgoretsky © (10.06.08 12:08) [15]
    > Palladin  (10.06.2008 11:42:14)  [14]

    Вот именно это "не оно" ну дык вариантик
 
Конференция "Основная" » Странное поведение Variant при импорте из Excel [D7, WinXP]
Есть новые Нет новых   [134491   +8][b:0][p:0.003]