Здравствуйте. Целый день убил на проблему, истоки которой не могу понять. Есть код, который выводит данные из массива в диапазон ячеек Excel. Так же в коде Delphi я задаю форматирование ячеек. В одном из рядов мне необходимо использовать дробное значение вроде x.xx... Точка или запятая разделяет разряды, мне не важно. В общем, проблема типичная казалось бы, но решение мне в голову не пришло... на моей машине работает всё нормально, у меня Win7 и Excel 2007, но когда дело доходит до Win 2003 Server с его 2003 Excel, происходит что-то невероятное: разделитель дроби игнорируется, и число становится целым... Например, значение 1.83 становится при выводе в Excel числом 183 и так далее. Что я только не пробовал, менял региональные стандарты, ставил и точку и запятую в качестве разделителя, и в самом Excel международные настройки пытался использовать, ничего не помогает, с любым форматом ячеек, кроме текстового разделитель исчезает, текст использовать не могу, так как нужно считать потом данные... Под отладчиком видно, что в массив исходный пишу число с запятой (берётся из базы данных), но установка запятой в качестве разделителя не даёт результатов. Кто может помочь разобраться?
Вот несколько кусков кода моего:
1. Так я заполняю вариантный массив
Код:
begin
Result.EmptyFlag := false;
Result.arrCommonData := VarArrayCreate([0, 47 , 0, Params.OraQuery.FieldCount - 4], varVariant);
for i := 0 to VarArrayHighBound(Result.arrCommonData, 1) do
begin
for j := 0 to VarArrayHighBound(Result.arrCommonData, 2) do
if ((j = 43) and (Params.OraQuery.FieldCount = 50 )) or ((j = 33) and (Params.OraQuery.FieldCount = 37)) then
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsFloat //[j+3] - èñêëþ÷àåì ïîëÿ 'sp.kod, sp_n1, sv.DAY_IN
else
Result.arrCommonData[i,j] := Params.OraQuery.Fields.Fields[j + 3].AsInteger;
Params.OraQuery.Next;
end;
Params.OraQuery.Close;
2. Так я вывожу данные
Код:
try
CoInitialize(nil);
Excel := CreateOleObject('Excel.Application');
Excel.DisplayAlerts := false;
Excel.Visible := False;
//Excel.UseSystemSeparators := False;
//Excel.DecimalSeparator := ',';
except
//ShowMessage ('Ïðîáëåìà ïðè çàïóñêå Microsoft Excel: ïðîâåðüòå íàëè÷èå ïðîãðàììû');
end;
if Type_47 then
begin
Excel.workbooks.add(GetCurrentDir() + '\sv_47.xls');
Sheet := Excel.WorkBooks[1].WorkSheets[1];
Sheet.Range['B8:AV55'].Value2 := arrOut;
Sheet.Range['B7:AV55'].NumberFormat :='0;-0;;';
Sheet.Range['AS7:AS55'].NumberFormat :='#,##0;;;';
Давайте попробуем разобраться, а?