我一直在使用COM接口进行基本的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?
错误。
Microsoft的documentation for the Range.FormulaLocal
Property说:
使用A1样式引用返回或设置对象的公式 使用用户的语言。
(我强调了)。
所以我希望使用Formula
代替FormulaLocal
我可以解决这些本地化困境,但显然事实并非如此。
有什么方法可以使用非本地化公式吗?我猜那里有一些隐藏的设置。
答案 0 :(得分:0)
添加答案以记录我发现的内容:
Formula
要设置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
仍然执行相同的操作(!),这意味着我需要使用两种属性的本地化日期格式代码(例如,{8}的ISO "JJJJ-MM-TT"
)。
NumberFormat
构建格式字符串:使用Application.International Property。