【问题标题】:Using non-localized formulae in Excel automation在 Excel 自动化中使用非本地化公式
【发布时间】:2017-05-29 03:46:11
【问题描述】:

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

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

【问题讨论】:

  • 是的,它对我有用。我正在使用西班牙语中的 Excel,并且属性公式分配有英文名称并且它可以工作。没有隐藏设置,但我记得它不适用于较旧的 Excel 版本(12 之前,现在很旧)。
  • @CarlosE.Ferro “12”是指 Office 12 又名 Office 2007 吗?我在这里使用 Excel 2010。
  • 是的,我告诉过你它已经很老了。 Excel 2007 可以正常工作,所以我不知道为什么它不能在你的上工作。对不起:-(

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


【解决方案1】:

添加答案以记录我发现的内容:

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 仍然做同样的事情(!),这意味着我需要使用本地化的日期格式代码(例如 ISO 8601 的 "JJJJ-MM-TT")和这两个属性。

NumberFormat 的解决方法

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

【讨论】:

  • 哦,我完全忘记了那个调用中的 LOCALE_ID (LCID)……我们很久以前就把它设为 0。这就是它在这里工作而不是在您的安装中工作的原因。
  • @CarlosE.Ferro 感谢您的确认(我可以在这里确认LOCALE_NEUTRAL == 0)。你也处理过NumberFormat 吗?
  • 不,我们仅将 Excel 自动化用于基本报告,并且我们很少设置单元格格式,除了我们应用旧的预定义表格格式(例如 XlClassic)的某些范围。但是是的,对于特定的小数,我们使用零和 excel.International(XlDecimalSeparator) 构建一个字符串,对于日期,我们构建像 'mm-yyyy' 这样的字符串并使用 numberFormat 属性设置它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多