在 Excel 中,您有两个字段:
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.DispatchInvoke 的 ComObj.VarDispInvoke。在那里,您可以找到对 Dispatch.Invoke 的调用,该调用将 lcid 作为第三个参数。这设置为 0。您可以使用注释中第一个链接中显示的技术来创建您自己的单元并将所有代码从 ComObj 复制到您自己的单元(或直接修改 ComObj)。只是不要忘记在单元的初始化中设置 VarDispProc 变量。最后一部分似乎并非在所有情况下都有效(可能取决于模块的顺序),但您可以在代码中设置变量:
VarDispProc := @VarDispInvoke;
您必须将 VarDispInvoke 放入 ComObj 复制模块的接口部分。第一个链接的代码不能直接工作,因为它修改了上述 Delphi 示例中未调用的不同方法。
更改 numberformat 调用的语言环境就足够了(以避免副作用)。
上面的示例以及所描述的修改适用于我的德语 excel 正确。如果没有修改或调用 DispCallLocaleId,我会看到与您描述的相同的问题。