gpt4 book ai didi

delphi - 自动化不同本地化版本的 Excel 时如何正确设置 NumberFormat 属性

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

我遇到了以下问题:

当我的 Delphi 程序通过 OLE 自动执行 Excel 并尝试设置单元格的 NumberFormat 属性时,Excel 需要本地化格式的格式字符串。

通常,当通过在 Excel 中录制宏来检查格式时,Excel 会期望如下所示:Cells(1, 2).NumberFormat = "#,##0.00"

这意味着千位分隔符是“,”,小数分隔符是“.”。

实际上,我使用的是 Excel 的本地化版本。在我的语言环境中,千位分隔符是“”,小数分隔符是“,”。

因此,每当从我的 Delphi 程序中设置 NumberFormat 时,我都需要将其指定为“# ##0,00”。

我的问题是:显然,如果我在程序中对这些值进行硬编码,那么当我的程序与英语或其他不同本地化版本的 Excel 一起使用时,就会出现异常。是否有设置 NumberFormat 属性的“通用”方法? (使用默认的英语语言环境?)

谢谢!

更新:我在此页面上找到了一种更优雅的方法: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920&mode=print它是俄语的(我也不会说),但你可以轻松理解代码。

最佳答案

在 Excel 中,您有两个字段:

  • 数字格式

  • NumberFormatLocal

NumberFormat 采用美国标准中始终保持区域设置不变的格式,并且 NumberFormatLocal 期望采用设置的区域设置的格式。

例如

Sub test()
Dim r As Range
Set r = ActiveWorkbook.ActiveSheet.Range("$A$1")
r.NumberFormat = "#,##0.00"
Set r = ActiveWorkbook.ActiveSheet.Range("$A$2")
r.NumberFormat = "#.##0,00"
Set r = ActiveWorkbook.ActiveSheet.Range("$A$3")
r.NumberFormatLocal = "#,##0.00"
Set r = ActiveWorkbook.ActiveSheet.Range("$A$4")
r.NumberFormatLocal = "#.##0,00"
End Sub

使用德语设置(十进制 sep: 和千位 sep: .)可为您提供 $A$1 和 $A$4 的正确格式数字。如果您将 Windows 中的区域设置更改为您喜欢的任何内容,您可以测试它,并尝试一下您的格式是否有效。

假设您使用 Delphi 5 并具有像这样启动 Excel 的代码(并且可以访问 ComObj.pas):

var
oXL, oWB, oSheet : Variant;
LocaleId : Integer;
begin
oXL := CreateOleObject('Excel.Application');
oXL.Visible := True;
oWB := oXL.Workbooks.Add;
oSheet := oWB.ActiveSheet;
oSheet.Range['$A$1'].NumberFormatLocal := '#.##0,00';
oSheet.Range['$A$2'].NumberFormatLocal := '#,##0.00';
LocaleID:= DispCallLocaleID($0409);
try
oSheet.Range['$A$3'].NumberFormat := '#.##0,00';
oSheet.Range['$A$4'].NumberFormat := '#,##0.00';
finally
DispCallLocaleId( LocaleId);
end;
end;

默认情况下,每个调用都会经过 ComObj.VarDispInvoke,后者调用 ComObj.DispatchInvoke。在那里您可以找到对 Dispatch.Invoke 的调用,该调用获取 lcid 作为第三个参数。设置为 0。您可以使用注释中第一个链接中显示的技术来创建您自己的单元并将所有代码从 ComObj 复制到您自己的单元(或直接修改 ComObj)。只是不要忘记在单元初始化时设置 VarDispProc 变量。最后一部分似乎不适用于所有情况(可能取决于模块的顺序),但您可以在代码中设置变量:

 VarDispProc := @VarDispInvoke;

您必须将 VarDispInvoke 放入 ComObj 复制模块的接口(interface)部分。第一个链接的代码不能直接工作,因为它修改了上面的 Delphi 示例中未调用的不同方法。
更改 numberformat 调用的区域设置就足够了(以避免副作用)。
上面的示例以及所描述的修改适用于我的德语 Excel 正确。如果没有修改或调用 DispCallLocaleId,我会看到与您描述的相同的问题。

关于delphi - 自动化不同本地化版本的 Excel 时如何正确设置 NumberFormat 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10947727/

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