Помогите с отправкой номера в Excel 2007 из Delphi 2010 в виде строки - PullRequest
0 голосов
/ 11 ноября 2009

Я отправляю число в Excel 2007 в виде строки (Cell.Value: = '2,5') с использованием позднего связывания. Фактический код больше похож на:

var CellVal: OLEVariant;
...
CellVal := FloatToStr(2.5);  // Regionally formatted.
Cell.Value := CellVal;

В моей версии Excel 97 это значение будет отформатировано как «Общее» по умолчанию и будет отображаться как число. Клиент с Excel 2007 получает ячейку, отформатированную как «Стандарт», и Excel, кажется, видит ее в виде строки (она не выровнена по правому краю.) Обратите внимание, что я использую региональные настройки для форматирования числа, и Excel, кажется, использует региональные настройки по умолчанию.

Если клиент просто вводит 2,5 в ячейку, он принимает его как число, и если он делает копию строки '2,5' из буфера обмена в ячейку, он также принимается как число. Кто-нибудь знает, почему строковое значение, отправляемое через интерфейс автоматизации в Excel, не является числом?

Спасибо за любые предложения! Отредактировано, чтобы указать региональный десятичный разделитель для клиента ','.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Вероятно, потому что вы даете ему строку. Вы пытались передать ему значение с плавающей запятой напрямую?

3 голосов
/ 11 ноября 2009

Поскольку вы не можете форматировать комментарии:

Я только что провел небольшой тест, и Excel не хочет, чтобы значение с плавающей точкой в ​​региональном формате форматировалось как строка, а просто точка в качестве десятичного разделителя.

procedure TForm1.Button1Click(Sender: TObject);
var
  App: Variant;
  Workbook: Variant;
  Worksheet: Variant;
  DoubleValue: Double;
begin
  App := CreateOleObject('Excel.Application');
  Workbook := App.Workbooks.Add;
  Worksheet := Workbook.ActiveSheet;
  DoubleValue := 1.2;
  Worksheet.Range['A1'].Value := DoubleValue; //DoubleValue is a double, excel recognizes a double
  Worksheet.Range['A2'].Value := '1.2'; //excel recognizes a double
  Worksheet.Range['A3'].Value := '1,2'; //excel recognizes a string
  Worksheet.Range['A4'].Value := FloatToStr(1.2); //excel recognizes a string
  App.Visible := True;
end;

Имейте в виду, что в качестве десятичного разделителя используется запятая.

0 голосов
/ 11 ноября 2009

Не могу объяснить, почему поведение отличается, но, похоже, дело в том, как Excel 2007 интерпретирует входящее значение.

Как насчет установки формата ячейки в коде?

Worksheets("Sheet1").Range("A17").NumberFormat = "General"
...