首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi到Excel -日期格式与德国地区的问题

问Delphi到Excel -日期格式与德国地区的问题
EN

Stack Overflow用户
提问于 2011-08-18 05:50:05
回答 2查看 4.5K关注 0票数 2

使用Delphi 2007 - Windows 7 -德语(瑞士)语言环境。

在我的应用程序中,我将显示一个显示格式为DateTime的"MMM-YY"字段。

日期3-Mar-11显示为Mai-11。

导出到Excel时,应用程序首先将网格数据写入TXT文件,然后使用OpenText() API将其导入Excel。

然后,我们将网格属性应用于单元格。因此,Excel中的date列被应用为NumberFormat = MMM-YY (custom format)。

但是,在Excel中显示为"Mai-YY",因为在德语中,Excel中的日期格式是MMM-JJ。

如何从Delphi或正确的Excel行为中应用正确的日期格式,以便在所有地区都有一个解决方案?

EN

回答 2

Stack Overflow用户

发布于 2011-08-18 07:50:22

Excel和日期有点混乱。如果您坚持使用中间文件,那么您可能被困住了。Excel使用自己的日期格式设置,它们可能/将与Windows的日期格式设置不同。因此,即使使用Windows区域设置导出,Excel在使用不同的值集时也可能不像预期的那样运行。

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

将日期导出到Excel的通用配方

注意Windows日期和时间设置中使用的字符。

代码语言:javascript
复制
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格式字符。

代码语言:javascript
复制
ExcelDayChar := ExcelApplication.International[xlDayCode];

将Windows区域设置转换为使用Excel字符。

代码语言:javascript
复制
ExcelDateFormat := ConvertWindowsLocalDateStringToExcel(ShortDateFormat);

这使用了下面的函数。请再次注意,此函数只能用于日期格式或时间格式。当您需要同时结合日期和时间的格式时,可以根据需要进行调整。

代码语言:javascript
复制
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。

代码语言:javascript
复制
aRange.NumberFormat := ExcelDateFormat;

其中aRange是(具有Excel类型的OleVariant )。

票数 4
EN

Stack Overflow用户

发布于 2011-09-20 18:26:12

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

Excel.WorkBooks1.Sheets1.Range'A'+inttostr(row),‘M’+inttostr(行).NumberFormat := '@';其中行是我周期中的一个变量,它还用于在excel中输入数据

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7102972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档