我一直在尝试使用 COM 接口(interface)实现基本的 Excel 自动化,主要是利用 IDispatch::Invoke
.
我的测试涉及在新创建的 Excel 文档中添加公式。使用设计的包装器库,它看起来像这样:
sheet.getObject( "Range", "A1" ).set( "Value", 23 );
sheet.getObject( "Range", "A2" ).set( "Value", 42 );
sheet.getObject( "Range", "A3" ).set( "Formula", "=SUMME(A1:A2)" ); // WTF?
注意:我在这里使用(德语)本地化公式名称 SUMME
,而不是预期的标识符 SUM
。在 Excel 中使用宏记录器执行相同操作时,生成的 VBA 代码包含 SUM
。在我的 C++ 代码中使用 SUM
,我最终在 Excel 中遇到了 #NAME?
错误。
微软的documentation for the Range.FormulaLocal
Property说如下:
Returns or sets the formula for the object, using A1-style references in the language of the user.
(重点是我做的)。
所以我希望使用 Formula
而不是 FormulaLocal
我可以解决这些本地化问题,但显然情况并非如此。
有什么方法可以使用非本地化公式吗?我猜想有一些隐藏得很好的设置。
最佳答案
添加一个答案来记录我发现的内容:
公式
的解决方法
要设置 Formula
属性,最终需要调用 IDispatch::Invoke
,它实现为
object->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT, // <-- "locale context"
DISPATCH_PROPERTYPUT,
&dispparams,
NULL,
&excepinfo,
&argerr ) );
将 LOCALE_USER_DEFAULT
更改为 LOCALE_NEUTRAL
会导致属性 Formula
和 FormulaLocal
开始表现不同。在我的德语本地化 Excel 安装中,这两个调用
sheet.getObject( "Range", "A3" ).set( "FormulaLocal", "=SUMME(A1:A2)" );
sheet.getObject( "Range", "B3" ).set( "Formula", "=SUM(A1:A2)" );
现在做同样的事情。
目前,这并不是我的问题的真正解决方案,因为我通常希望事情没有按照记录在我背后悄悄地解决。证明:NumberFormat
和 NumberFormatLocal
仍然做同样的事情(!),这意味着我需要使用本地化的日期格式代码(例如 "JJJJ-MM -TT"
for ISO 8601) 具有两个属性。
NumberFormat
的解决方法
构建格式字符串:使用 Application.International Property .
关于c++ - 在 Excel 自动化中使用非本地化公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640228/