Помогите отправить номер в Excel 2007 из Delphi 2010 в виде строки

Я отправляю число в 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, оказывается нечисловым?

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


person MarkF    schedule 11.11.2009    source источник


Ответы (3)


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

Я только что провел небольшой тест, и 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;

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

person The_Fox    schedule 11.11.2009
comment
Спасибо за проверку! Какую версию Excel вы используете? Кажется, мой Excel 97 правильно обрабатывает региональные строки. Мне интересно, является ли это поведение новым для Excel 2007. - person MarkF; 12.11.2009
comment
Конечно, верно сказать, что часто автоматизация Office требует передачи значений с использованием параметров США, а затем Excel должен локализовать их. Я выполняю обширную автоматизацию с Outlook, и мне нужно передавать даты в формате даты США, которые затем правильно локализуются в моих региональных настройках с помощью Outlook/Exchange. - person J__; 12.11.2009
comment
Спасибо всем за комментарии. Кажется, что (по крайней мере, в случае с Excel) это изменилось в более новых версиях. Это кажется серьезным недостатком или ошибкой, но, думаю, мне просто придется с этим смириться. С датой возникает настоящая проблема, так как дд/мм неправильно интерпретируется как мм/дд, если первая часть меньше 13. Ой... - person MarkF; 12.11.2009

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

person Ondrej Kelle    schedule 11.11.2009
comment
Это должно делать свое дело. Excel 2007, вероятно, определяет формат на основе типа значения. - person The_Fox; 11.11.2009
comment
Да, это работает, если я передаю значение как число с плавающей запятой. Однако я действительно пытаюсь выяснить, почему использование строки не работает. У меня есть ситуация, когда я бы предпочел передать ее как строку. - person MarkF; 11.11.2009

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

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

Worksheets("Sheet1").Range("A17").NumberFormat = "General"
person J__    schedule 11.11.2009
comment
Спасибо. У меня здесь нет Excel 2007, но я думаю, что Standard — это новый General. Однако я могу ошибаться в этом! Может ли кто-нибудь с Excel 2007 прокомментировать это? - person MarkF; 11.11.2009
comment
Правда, Стандарт — новый генерал - person The_Fox; 12.11.2009