Форум: "Основная";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c