Delphi to Excel - проблема с форматом даты в немецкой локали - PullRequest
2 голосов
/ 18 августа 2011

Использование Delphi 2007 - Windows 7 - Немецкий (Швейцария) языковой стандарт .
В моем приложении я отображаю поле DateTime с помощью Displayformatкак "MMM-YY".
Дата 3-Mar-11 отображается как Mai-11.

При экспорте в Excel приложение сначала записывает данные сетки в файл TXT, а затем импортирует их в Excel, используя OpenText() API.
Затем мы применяем свойства сетки к ячейкам.Таким образом, столбец даты в Excel применяется NumberFormat = MMM-YY (custom format).
Но в Excel дата отображается как "Mai-YY", потому что на немецком языке формат даты в Excel - MMM-JJ.

КакЯ применяю правильный формат даты из Delphi ИЛИ корректное поведение Excel, чтобы у меня было решение во всех локалях?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Excel и даты немного путаются. Если вы придерживаетесь промежуточного файла, то вы, вероятно, застряли. Excel использует свои собственные настройки формата даты, и они могут / будут отличаться от настроек формата даты в Windows. Таким образом, даже при экспорте с использованием настроек языкового стандарта Windows Excel может работать не так, как ожидалось, когда он использует другой набор значений.

Используя автоматизацию, вы можете запросить Excel о его настройках.

Общий рецепт экспорта дат в Excel

Помните о символах, используемых в настройках даты и времени Windows.

WindowsYearCharacter: string = 'y';   // Do no localize!
WindowsMonthCharacter: string = 'm';  // Do no localize!
WindowsDayCharacter: string = 'd';    // Do no localize!
WindowsHourCharacter: string = 'h';   // Do no localize!
WindowsMinuteCharacter: string = 'm'; // Do no localize!

Обратите внимание, что символ «Месяц» и «минута» обозначены буквой «m», хотя для дат следует указывать их в верхнем регистре. Это необходимо, когда у вас есть строка формата, которая принимает и дату, и время. Поскольку мы экспортируем либо даты, либо время, мы решили учитывать спецификацию форматов Windows без учета регистра.

Опрос Excel для символов форматирования xlYearCode, xlMonthCode, xlDayCode, xlHourCode и xlMinuteCode с использованием международной коллекции.

ExcelDayChar := ExcelApplication.International[xlDayCode];

Преобразование настроек языка Windows для использования символов Excel.

ExcelDateFormat := ConvertWindowsLocalDateStringToExcel(ShortDateFormat);

Используется следующая функция. Обратите внимание, что эта функция может использоваться только для или формата даты или времени. При необходимости адаптируйте, если вам нужны форматы, объединяющие дату и время.

function ConvertWindowsLocalDateStringToExcel(const aString: string): string;
begin
  // Year character vervangen :
  Result := StringReplace(aString, UpperCase(WindowsYearCharacter), UpperCase(ExcelYearCharacter), [rfReplaceAll]);
  Result := StringReplace(Result, LowerCase(WindowsYearCharacter), LowerCase(ExcelYearCharacter), [rfReplaceAll]);

  // Month character vervangen :
  Result := StringReplace(Result, UpperCase(WindowsMonthCharacter), UpperCase(ExcelMonthCharacter), [rfReplaceAll]);
  Result := StringReplace(Result, LowerCase(WindowsMonthCharacter), LowerCase(ExcelMonthCharacter), [rfReplaceAll]);

  // Day character vervangen :
  Result := StringReplace(Result, UpperCase(WindowsDayCharacter), UpperCase(ExcelDayCharacter), [rfReplaceAll]);
  Result := StringReplace(Result, LowerCase(WindowsDayCharacter), LowerCase(ExcelDayCharacter), [rfReplaceAll]);
end;

Затем экспортируйте свои данные в Excel, а затем установите числовой формат для столбцов (или строк, или ячеек), содержащих даты, для использования формата ExcelDateFormat, который вы определили ранее.

aRange.NumberFormat := ExcelDateFormat;

Где aRange (тип OleVariant с) в диапазоне Excel.

2 голосов
/ 20 сентября 2011

У меня была та же проблема, и лучшее решение, которое я нашел, было объявить ячейку (или диапазон) в виде текста перед вставкой даты:

Excel.WorkBooks [1] .Sheets [1].Range ['A' + inttostr (строка), 'M' + inttostr (строка)]. NumberFormat: = '@';где строка - это переменная моего цикла, которая также используется для ввода данных в excel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...