Показать сообщение отдельно
  #1  
Старый 09.02.2015, 16:02
childeroland childeroland вне форума
Прохожий
 
Регистрация: 15.04.2013
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Вывод дробного числа из Delphi в Excel

Здравствуйте. Целый день убил на проблему, истоки которой не могу понять. Есть код, который выводит данные из массива в диапазон ячеек 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;;;';
Давайте попробуем разобраться, а?
Ответить с цитированием