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

标签 c++ excel com localization office-automation

我一直在尝试使用 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 会导致属性 FormulaFormulaLocal 开始表现不同。在我的德语本地化 Excel 安装中,这两个调用

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

现在做同样的事情。

目前,这并不是我的问题的真正解决方案,因为我通常希望事情没有按照记录在我背后悄悄地解决。证明:NumberFormatNumberFormatLocal 仍然做同样的事情(!),这意味着我需要使用本地化的日期格式代码(例如 "JJJJ-MM -TT" for ISO 8601) 具有两个属性。

NumberFormat 的解决方法

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

关于c++ - 在 Excel 自动化中使用非本地化公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640228/

相关文章:

c++ - 如何使用每n个像素opencv计算直方图

C++ 和 DirectShow

c# - 为什么我宁愿使用 native dll 或 com 服务器从 C# 调用 Delphi 代码?

c++ - 包含错误 MIDL2003 : redefinition when compiling ATL generated idl with windows. h 和 sql.h

c++ - 为什么在 C 和 C++ 中应避免使用 system() 函数?

c++ - 错误与 'operator=' 不匹配(操作数类型为 'Person' 和 'Person*' )

c++ - 如何通过迭代使迭代器表现得像一个类型?

excel - 根据 Excel 值从网站地址中提取数据

c# - 以编程方式设置 Excel 图表标题

vba - 获取单元格中的光标位置