gpt4 book ai didi

excel - OLE Excel 输出中的国际日期格式问题

转载 作者:行者123 更新时间:2023-12-03 15:48:26 28 4
gpt4 key购买 nike

在我当前使用的产品中,Excel 电子表格是使用 Delphi 的 OLE 生成的。电子表格包含许多日期,应用程序从系统设置加载短日期格式并将其应用到单元格。除非系统格式至少设置为俄语、巴什基尔语、鞑靼语、雅库特语、哈萨克语和乌兹别克语之一(可能还有其他我还没有尝试过),否则这种方法效果很好。

代码是-

xlws.Cells[irow,icol] := ActivityData.Target_Date;
xlvalidrange := xlws.Range[xlws.Cells[irow,icol],xlws.Cells[irow,icol]];
xlvalidrange.NumberFormat:= LocShortDateFormat;

在本例中(调试时),ActivityData.Target_Date 为 41192,这是 Excel 存储日期和时间的格式,LocShortDateFormat 等于“dd.MM.yyyy”。这与 Windows 中显示的俄语存储日期格式匹配,并使用以下代码以编程方式检索:

LocShortDateFormat := ShortDateFormat;

打开具有此格式的电子表格会显示消息-

Excel found unreadable content in Spreadsheet.xlsx Do you want to recover the contents of this workbook?

执行此操作后,数据将简单地显示为数字 41192,单元格中没有任何格式。更奇怪的是,手动应用“dd.MM.yyyy”格式字符串,然后在单元格中显示“dd.MM.yyyy”来代替数据。

这同样适用于任何标准日期/时间字符串格式字符。通过选择“日期”类别和相应的类型作为格式,可以手动将数据更改为日期格式,然后正确显示,因此这不是数据的问题,而是格式字符串的问题。

手动选择正确的日期格式时 Excel 使用的格式字符串是 ДД.ММ.ГГГГ - 手动更改调试时使用的格式字符串会在生成的电子表格中产生正确的输出,并且不可读的内容消息会消失。

奇怪的是,中文、日语、塞尔维亚语和马其顿语(作为非英语字符集语言的示例)都可以使用标准日期/时间格式字符。

在 Excel 本身中,即使电子表格是新的且不是以编程方式创建的,即从 Excel 应用程序内创建的新电子表格,标准字符似乎也无法正常工作。

既然如此,这似乎不是 Delphi 或 Windows 的问题(即使在俄语语言环境下,C# Windows 表单也可以使用标准字符正确格式化日期),但它仍然留下了如何获取返回值的问题Delphi 中正确的格式化字符串。

我不热衷于对已知有问题的语言环境进行一系列条件“if”语句测试,但这似乎是根据我迄今为止所做的研究来处理该问题的唯一方法。

是否有任何方法可以要求 Excel 通过 OLE 使用本地日期格式而不提供格式字符串,或者获取 Excel 用于在该本地化中格式化日期的字符串,以便提供正确格式的字符串?

最佳答案

是的,您可以使用 Excel 应用程序实例上的 International 属性获取各种国际化/本地化字符和字符串。后期绑定(bind)示例:

function GetExcel_International(const aExcel: OleVariant; const aIndex: Integer): string;
begin
try
Result := aExcel.International[aIndex];
except
...
end;
end;

我们用它来获取组成格式化字符串的各种字符:

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);

然后我们使用这些将 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;

所有 xl... 常量都来 self 们自己的单元之一,但您也应该能够在早期绑定(bind)的 Delphi OLE 服务器包装器中找到它们。例如,在 Delphi/RAD Studio 安装的 ...\OCX\Servers 文件夹中的 ExcelXP 单元中。

有关 Application.International 属性的更多信息可以在以下位置找到: http://msdn.microsoft.com/en-us/library/office/bb177675(v=office.12).aspx

关于excel - OLE Excel 输出中的国际日期格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16946077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com