在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的效果是, FormulaFormulaLocal属性的行为不同。 在我的德语本地化Excel安装两个电话

 sheet.getObject( "Range", "A3" ).set( "FormulaLocal", "=SUMME(A1:A2)" ); sheet.getObject( "Range", "B3" ).set( "Formula", "=SUM(A1:A2)" ); 

现在做同样的事情。

目前,这不是一个真正的解决我的问题,因为我通常希望事情没有logging在我的背后默默地打破 。 certificate: NumberFormatNumberFormatLocal仍然做同样的事情(!),这意味着我需要使用这两个属性的本地化date格式代码(例如"JJJJ-MM-TT"的ISO 8601)。

对于NumberFormat解决方法

要构build格式string:使用Application.International属性 。