【问题标题】:Delphi to Excel - Date Format Issue with German LocaleDelphi to Excel - 德语语言环境的日期格式问题
【发布时间】:2011-08-18 05:50:05
【问题描述】:

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

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

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

【问题讨论】:

  • 解决方案 1:应用取决于区域设置格式的网格属性(即德语的 MMM-JJ)。方案二:通过vba申请数字格式(会用英文字母申请格式)

标签: delphi excel datetime


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2010-11-23
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多