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.