-
При типовом импорте данных из таблички 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]) + '~ '; Интересует, что может вызвать такое поведение ?
-
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; попробуй
-
> Альф (10.06.2008 9:47:00) [0]
Не все строки можно преобразовать в число, точнее только ничтожное количество.
-
самое интересное, что, на первый взгляд, никто этого преобразования от компилятора не требует...
-
> 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 . Понимаете в чём странность ?
-
> Альф (10.06.08 10:21) [4]
да я знаю, что именно введение поможет, но проверка на null все равно должна быть... я как то сталкивался с этой проблеммой, сильно не стал заморачиваться на внутреннем механизме... это не только экселя касается, а variant'ов вообще... считай это фичей
-
вот простейший пример 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 этого уже нет...
-
Понял. Спасибо. Сколько раз пользовался таким способом - проблем небыло. Значит звёзды сегодня так встали ;)
-
Хотя всётаки интересно, почему считается Unassigned , когда в ячейке явно прописан integer(0) или float(0.0) или тот же "0" получается в результате вычислений. Может значения по умолчанию ? Также интересно почему банальное приведение string(data[i, j]) работает и будет ли работать в дальнейшем :)
-
> Может значения по умолчанию ?
это к аффтарам экселя, боюсь зависит от версии
> Также интересно почему банальное приведение string(data[i, > j]) работает и будет ли работать в дальнейшем
нет, как только Null встретит, так сразу и перестанет :) я'ж не зря условие вставил
-
> я'ж не зря условие вставил
>(data[i,j]=Null) or (data[i,j]=Unassigned)
а VarIsEmpty и VarIsNull, видимо, зря написаны Писать в коде data[i,j]=Null также чревато, как и в SQL запросе, ИМХО.
-
> а VarIsEmpty и VarIsNull, видимо, зря написаны
VarToStrDef, видимо, тоже зря
-
1. Что то у тебя не то, полей говоришь два, а массив объявлен на 7. 2. Variant это не string и поэтому это предположение не верно. 3. Решение в проверке перед присваиванием, только как в [10], а не в [1]. 4. странностей не понимаю, просто работаю как положено работать с вариантами. Полезно взглянуть в справке на TVarType type, как первая точка.
-
А попытка преобразования в Double вот здесь data[i, j] видимо тип ячейки в Экселе Double, а там не оно.
-
> Anatoly Podgoretsky © (10.06.08 11:24) [13]
ага, и в [6] тоже тип ячейки в Экселе Currency, а там не оно...
-
> Palladin (10.06.2008 11:42:14) [14]
Вот именно это "не оно" ну дык вариантик
|