2011-08-18 45 views
2

使用2007德尔福 - Windows 7的 - 德语(瑞士)区域
在我的应用程序中,我使用Displayformat显示DateTime字段为"MMM-YY"。日期3-Mar-11显示为Mai-11
德尔福到Excel - 日期格式问题与德文场所

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

如何从Delphi中应用正确的日期格式或正确的Excel行为,以便我可以在所有语言环境中都有解决方案?

+0

解决方案1:应用该取决于语言环境格式(即MMM-JJ德国)网格属性。解决方案2:通过vba应用数字格式(将使用英文字母来应用格式) – JMax

回答

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! 

请注意,月份和分钟字符都是'米',但日期应该是大写。如果您有一个格式字符串,它需要日期和时间,则这是必需的。当我们输出日期或时间时,我们选择迎合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范围类型的OleVariant。

2

我这里有同样的问题,我找到了最好的解决办法是插入日期前到小区(或区域)申报文本:

Excel.WorkBooks [1] .Sheets [1]。 Range ['A'+ inttostr(row),'M'+ inttostr(row)]。NumberFormat:='@'; 其中行是我的周期的变量,它也使用Excel输入数据