在Excel自动化中使用非本地化公式

时间:2017-01-13 17:29:08

标签: c++ excel com localization office-automation

我一直在使用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我可以解决这些本地化困境,但显然事实并非如此。

有什么方法可以使用非本地化公式吗?我猜那里有一些隐藏的设置。

1 个答案:

答案 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会导致属性FormulaFormulaLocal的行为开始不同。在我的德语本地化Excel安装中,两个调用

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

现在做同样的事情。

目前,这不是我的问题的真正解决方案,因为我通常期望没有记录的事情在我背后默默地打破。证明:NumberFormatNumberFormatLocal仍然执行相同的操作(!),这意味着我需要使用两种属性的本地化日期格式代码(例如,{8}的ISO "JJJJ-MM-TT")。

NumberFormat

的解决方法

构建格式字符串:使用Application.International Property