delphi到Excel – 与德语区域设置的date格式问题

使用Delphi 2007Windows 7德语(瑞士)语言环境
在我的应用程序中,我将Displayformat显示为"MMM-YY"的DateTime字段。
date3-Mar-11显示为Mai-11

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

如何从Delphi中应用正确的date格式或正确的Excel行为,以便我可以在所有区域设置解决scheme?

Excel和date有点混乱。 如果你坚持使用中间文件,那么你可能被卡住了。 Excel使用自己的date格式设置,它们可能会不同于Windows的date格式设置。 因此,即使使用Windows语言环境设置导出,Excel使用不同的值集时,其行为也可能不尽如人意。

使用自动化您可以询问Excel的设置。

将date导出到Excel的一般配方

请注意Windowsdate和时间设置中使用的字符。

 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! 

请注意,月份和分钟字符都是'米',但date应该是大写。 当你有一个格式string,需要date和时间时,这是需要的。 当我们输出date或时间时,我们select迎合Windows格式不区分大小写的规格。

使用International集合询问Excel的xlYearCode,xlMonthCode,xlDayCode,xlHourCode和xlMinuteCode格式化字符。

 ExcelDayChar := ExcelApplication.International[xlDayCode]; 

将您的Windows语言环境设置转换为使用Excel字符。

 ExcelDateFormat := ConvertWindowsLocalDateStringToExcel(ShortDateFormat); 

这使用下面的function。 请再次注意,此function只能用于date格式或时间格式。 当需要格式结合date和时间时,根据需要进行调整。

 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,然后设置包含date的列(或行或单元格)的数字格式,以使用您之前确定的ExcelDateFormat。

 aRange.NumberFormat := ExcelDateFormat; 

其中aRange是(一个具有)Excel范围types的OleVariant。

我在这里有同样的问题,我发现最好的解决scheme是在插入date之前将单元格(或范围)声明为文本:

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