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 格式不区分大小写的规范。
使用 International 集合查询 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 是(带有)Excel Range 类型的 OleVariant。