![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странное поведение 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;
попробуй