在Excel自动化中使用非本地化的公式
我一直在玩基本的Excel自动化使用COM接口,主要利用IDispatch::Invoke
。
我的testing涉及在新创build的Excel文档中添加一个公式。 使用devise的包装库,它看起来像这样:
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中对macroslogging器进行相同操作时,生成的VBA代码将包含SUM
。 在我的C ++代码中使用SUM
,我结束了#NAME?
在Excel中的错误。
微软的Range.FormulaLocal
财产文件说明如下:
返回或设置对象的公式,使用用户的语言中的 A1样式引用。
(重点是由我做的)。
所以我希望使用Formula
而不是FormulaLocal
我可以解决这些本地化的困境,但显然情况并非如此。
有没有什么办法可以使用非本地化的公式? 我猜想有一些很好的隐藏设置。
添加一个答案来logging我发现的:
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)" );
现在做同样的事情。
目前,这不是一个真正的解决我的问题,因为我通常希望事情没有logging在我的背后默默地打破 。 certificate: NumberFormat
和NumberFormatLocal
仍然做同样的事情(!),这意味着我需要使用这两个属性的本地化date格式代码(例如"JJJJ-MM-TT"
的ISO 8601)。
对于NumberFormat
解决方法
要构build格式string:使用Application.International属性 。