Delphi到Excel - 使用德语语言环境的日期格式问题

时间:2011-08-18 05:50:05

标签: delphi excel datetime

使用 Delphi 2007 - Windows 7 - 德语(瑞士)语言区域
在我的应用程序中,我正在显示一个Dateforma字段,其中Displayformat为"MMM-YY" 日期3-Mar-11显示为Mai-11

导出到Excel时,应用程序首先将网格数据写入TXT文件,然后使用OpenText() API将其导入Excel。 然后我们将网格属性应用于单元格。因此,Excel中的日期列应用NumberFormat = MMM-YY (custom format) 但是,在Excel中,日期显示为"Mai-YY",因为在德语中,Excel中的日期格式为MMM-JJ

如何从Delphi应用正确的日期格式或正确的Excel行为,以便我可以在所有区域设置中找到解决方案?

2 个答案:

答案 0 :(得分:4)

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格式的不区分大小写的规范。

使用国际集合为其xlYearCode,xlMonthCode,xlDayCode,xlHourCode和xlMinuteCode格式化字符询问Excel。

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范围类型。

答案 1 :(得分:2)

我在这里遇到了同样的问题,我找到的最佳解决方案是在插入日期之前将单元格(或范围)声明为文本:

Excel.WorkBooks [1] .Sheets [1] .Range ['A'+ inttostr(row),'M'+ inttostr(row)]。NumberFormat:='@'; 其中row是我的循环的变量,也用于在excel中输入数据