我遇到了以下问题:
当从我的Delphi程序中通过OLE自动化Excel并试图设置单元格的NumberFormat属性时,Excel期望格式字符串是本地化格式。
通常,通过在Excel中记录宏来检查格式时,Excel的预期如下:单元格(1,2).NumberFormat = "#,##0.00“
这意味着数千个分隔符是",“而十进制分隔符是”。
实际上,我使用的是Excel的本地化版本。在我的区域设置中,数千个分隔符是“",而十进制分隔符是”,“。
因此,每当从我的Delphi程序中设置NumberFormat时,我都需要像"# ##0,00“那样指定它。
我的问题是:显然,如果我在我的程序中硬编码这些值,那么当我的程序与英语或另一个不同本地化版本的一起使用时,就会有一个例外。是否有一种“通用”方法来设置NumberFormat属性?(使用默认的英语区域设置?)
谢谢!
Update:,我在这个页面上找到了一种更优雅的方法:http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920&mode=print,它是俄语的(我也不会说),但是您可以很容易地理解代码。
发布于 2012-06-08 03:46:07
在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
与德语设置(十进制9月:,和千9月:.)为$A$1和$A$4提供正确的格式化数字。如果您将窗口中的区域设置更改为您喜欢的任何内容,然后尝试,如果您的格式有效,您可以测试它。
假设您使用Delphi5并拥有像这样启动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复制模块的接口部分。第一个链接的代码不直接工作,因为它修改了一个不同的方法,在上面的Delphi示例中没有调用这个方法。
改变数字格式调用的区域设置就足够了(以避免副作用)。
上面的例子和所描述的修改为我的德语excel正确工作。如果没有修改或对DispCallLocaleId的调用,我就会看到与您描述的问题相同的问题。
发布于 2018-04-12 00:00:35
您可以让excel管理此选项,以避免其他系统中的差异:
.....NumberFormat :='#'+Excel.ThousandsSeparator+'##0'+Excel.DecimalSeparator+'00';
发布于 2018-08-08 05:15:59
还可以直接设置属性值。
SetDispatchPropValue(oSheet,
'Range['$A$1'].NumberFormatLocal',$0409);
https://stackoverflow.com/questions/10947727
复制