Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi到Excel-日期格式问题(德语区域设置)_Delphi_Excel_Datetime - Fatal编程技术网

Delphi到Excel-日期格式问题(德语区域设置)

Delphi到Excel-日期格式问题(德语区域设置),delphi,excel,datetime,Delphi,Excel,Datetime,使用德尔福2007-视窗7-德国(瑞士)地区设置 在我的应用程序中,我正在显示一个日期时间字段,显示格式为“MMM-YY” 日期2011年3月3日显示为Mai-11 导出到Excel时,应用程序首先将网格数据写入TXT文件,然后使用OpenText()API将其导入Excel。 然后我们将网格属性应用于单元。因此,Excel中的日期列应用为NumberFormat=MMM-YY(自定义格式) 但是,在Excel中,日期显示为“Mai YY”,因为在德语中,Excel中的日期格式是MMM-JJ 如

使用德尔福2007-视窗7-德国(瑞士)地区设置
在我的应用程序中,我正在显示一个日期时间字段,显示格式为
“MMM-YY”

日期
2011年3月3日
显示为
Mai-11

导出到Excel时,应用程序首先将网格数据写入
TXT
文件,然后使用
OpenText()
API将其导入Excel。
然后我们将网格属性应用于单元。因此,Excel中的日期列应用为
NumberFormat=MMM-YY(自定义格式)

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


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

Excel和日期有点混乱。如果您坚持使用中间文件,那么您可能会被卡住。Excel使用自己的日期格式设置,它们可能/将不同于Windows的日期格式设置。因此,即使使用Windows语言环境设置进行导出,Excel在使用不同的值集时也可能无法正常工作

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

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!
将日期导出到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格式的不区分大小写规范

使用国际集合查询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)。

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

Excel.工作簿[1]。工作表[1]。范围['A'+inttostr(行),'M'+inttostr(行)]。数字格式:='@';
其中,row是我的周期变量,也用于在excel中输入数据

解决方案1:应用网格属性,该属性取决于区域设置格式(即,德语为MMM-JJ)。解决方案2:通过vba应用数字格式(将使用英文字母应用该格式)