pwd*_*dst 2 delphi excel localization ole
在我正在使用Excel产品的产品中,使用Delphi的OLE生成电子表格.电子表格包含许多日期,其中应用程序从系统设置加载短日期格式并将其应用于单元格.除非系统格式设置为至少俄语,巴什基尔语,塔塔尔语,雅库特语,哈萨克语和乌兹别克语之一(可能还有其他我没有尝试过),否则这种方法很有效.
代码是 -
xlws.Cells[irow,icol] := ActivityData.Target_Date;
xlvalidrange := xlws.Range[xlws.Cells[irow,icol],xlws.Cells[irow,icol]];
xlvalidrange.NumberFormat:= LocShortDateFormat;
Run Code Online (Sandbox Code Playgroud)
在这种情况下(在调试时),ActivityData.Target_Date是41192,这是Excel存储日期和时间的格式,LocShortDateFormat等于'dd.MM.yyyy'.这与Windows中显示的俄语存储日期格式相匹配,并使用代码以编程方式检索 -
LocShortDateFormat := ShortDateFormat;
Run Code Online (Sandbox Code Playgroud)
使用此格式打开电子表格会显示消息 -
Excel在Spreadsheet.xlsx中找到不可读的内容您要恢复此工作簿的内容吗?
这样做的数据简单地显示为单元格中的NO,格式为41192.更奇怪的是,手动应用格式字符串'dd.MM.yyyy'然后在单元格中显示'dd.MM.yyyy'代替数据.
这同样适用于任何标准日期/时间字符串格式化字符.通过选择"日期"类别和相应类型作为格式,可以手动将数据更改为日期格式,然后正确显示,因此这不是数据问题,而是格式字符串.
当手动选择正确的日期格式时,Excel使用的格式字符串是ДД.ММ.ГГГГ - 手动更改调试时使用的格式字符串会在生成的电子表格中生成正确的输出,并且不可读的内容消息将消失.
奇怪的是,中文,日文,塞尔维亚文和马其顿文(作为非英文字符集语言的样本)都使用标准的日期/时间格式字符.
在Excel本身,标准字符似乎无法正常运行,即使电子表格是新的并且尚未以编程方式创建,即从Excel应用程序中创建的新电子表格.
在这种情况下,它似乎不是一个Delphi或Windows问题(C#Windows表单没有问题使用标准字符正确格式化日期,即使使用俄语语言环境),但它仍然留下如何返回正确格式的问题Delphi中的字符串.
我并不热衷于做一系列有条件的"if"语句测试已知有问题的语言环境,但这似乎是基于我迄今为止所做的研究来处理问题的唯一方法.
有没有办法要求Excel通过OLE使用本地日期格式而不提供格式化字符串,或者获取Excel用于格式化本地化日期的字符串以便以正确的格式提供字符串?
是的,您可以使用InternationalExcel应用程序实例上的属性获取各种国际化/本地化字符和字符串.后期示例:
function GetExcel_International(const aExcel: OleVariant; const aIndex: Integer): string;
begin
try
Result := aExcel.International[aIndex];
except
...
end;
end;
Run Code Online (Sandbox Code Playgroud)
我们使用它来获取构成格式化字符串的各种字符:
ExcelYearCharacter := GetExcel_International(FExcelApplication, xlYearCode);
ExcelMonthCharacter := GetExcel_International(FExcelApplication, xlMonthCode);
ExcelDayCharacter := GetExcel_International(FExcelApplication, xlDayCode);
ExcelHourCharacter := GetExcel_International(FExcelApplication, xlHourCode);
ExcelMinuteCharacter := GetExcel_International(FExcelApplication, xlMinuteCode);
Run Code Online (Sandbox Code Playgroud)
然后我们使用它们从Windows转换为Excel格式:
function ConvertWindowsLocalDateStringToExcel(const aString: string): string;
begin
Result := StringReplace(aString, UpperCase(WindowsYearCharacter),
UpperCase(ExcelYearCharacter), [rfReplaceAll]);
Result := StringReplace(Result, LowerCase(WindowsYearCharacter),
LowerCase(ExcelYearCharacter), [rfReplaceAll]);
Result := StringReplace(Result, UpperCase(WindowsMonthCharacter),
UpperCase(ExcelMonthCharacter), [rfReplaceAll]);
Result := StringReplace(Result, LowerCase(WindowsMonthCharacter),
LowerCase(ExcelMonthCharacter), [rfReplaceAll]);
Result := StringReplace(Result, UpperCase(WindowsDayCharacter),
UpperCase(ExcelDayCharacter), [rfReplaceAll]);
Result := StringReplace(Result, LowerCase(WindowsDayCharacter),
LowerCase(ExcelDayCharacter), [rfReplaceAll]);
end;
Run Code Online (Sandbox Code Playgroud)
所有xl...常量都来自我们自己的一个单元,但你应该能够在早期绑定的Delphi OLE服务器包装器中找到它们.例如,在Delphi/RAD Studio安装文件夹中的ExcelXP单元中...\OCX\Servers.
有关该Application.International属性的更多信息,请访问:http:
//msdn.microsoft.com/en-us/library/office/bb177675(v = office.12).aspx
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |