【问题标题】:C# VSTO Excel can't use en-US list separators in codeC# VSTO Excel 不能在代码中使用 en-US 列表分隔符
【发布时间】:2018-12-25 03:35:00
【问题描述】:

我正在使用 Interop 在 C# 中创建一个 VSTO 插件以与 Excel 进行通信。我一直在阅读这篇关于 Excel 中不同语言环境的文章:

https://docs.microsoft.com/sl-si/visualstudio/vsto/globalization-and-localization-of-excel-solutions

文章说:

默认情况下,您使用 Visual Studio 创建的 Office 解决方案 不受最终用户的区域设置影响,并且始终正常运行 好像语言环境是英语(美国)。例如,如果您 获取或设置 Microsoft.Office.Interop.Excel.Range.Value2* 属性 在 Excel 中,数据的格式必须按照区域设置 ID 1033 预计。如果您使用不同的数据格式,您可能会得到意想不到的结果 结果。

我当前的语言环境设置为德语,它使用 ; 作为列表分隔符,而不是使用 en-US 的 ,

这是在我的机器上运行的代码:

using Microsoft.Office.Interop.Excel;

private void ButtonClick(object sender, RibbonControlEventArgs e)
{
    var range = Worksheet.Range["A1:B1;C1:D1;E1:F1"];
}

这不起作用并引发通用HRESULT: 0x800A03EC 异常:

using Microsoft.Office.Interop.Excel;

private void ButtonClick(object sender, RibbonControlEventArgs e)
{
    var range = Worksheet.Range["A1:B1,C1:D1,E1:F1"];
}

那是什么?我如何知道在我的代码中使用哪个语言环境?我认为始终使用 en-US 是安全的。

【问题讨论】:

  • "A1:B1,C1:D1,E1:F1"Range 是正确的,并且应该适用于所有语言环境(并且在从 VBA 调用时也适用)。问题必须是 VSTO 特有的。
  • 您的问题得到解答了吗?

标签: c# excel com vsto excel-interop


【解决方案1】:

您引用的文本是指发送到 Excel 的信息(例如写入单元格)。您正在做的是一个灰色区域:您在数组定义中使用列表分隔符。

将您对Range 的使用与将公式分配给单元格(范围)进行比较:

string quote = '"'.ToString();
Globals.ThisAddIn.Application.ActiveSheet.Range["F3"].Formula =
    "=IF(A1=1," + quote + "yes" + quote + "," + quote + "no" + quote + ")";

根据文档,在公式中使用逗号作为 参数分隔符,这对于 en-us 语言环境是正确的。这正在写入 Excel。在德语语言环境中,这在工作簿中显示为 =IF(A1=1;"yes";"no"),带有分号 - VSTO 负责确保结果正确 * 在工作簿中”。这就是文档中的意思。

对于您遇到的问题,您必须为运行代码的当前语言环境(“文化”)传递正确的列表分隔符,您可以这样做:

string rangeDesignation = "A1:B1,C1:D1,E1:F1";
string listSeparator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
if (listSeparator != ",")
{
    rangeDesignation = rangeDesignation.Replace(",", listSeparator);
}
Excel.Range range = Globals.ThisAddIn.Application.ActiveSheet.Range[rangeDesignation];

【讨论】:

  • Formula 应该始终使用 en-us,而 FormulaLocal 应该始终使用界面语言。 “确保工作簿中的结果正确”的不是 VSTO,而是 Excel 在内部以 en-us 和 R1C1 参考样式工作的事实,但可能以不同的语言显示公式和/或不同的参考风格。
  • 我使用Formula 只是为了方便比较 VSTO 代码中逗号与分号的使用以及该文档的含义。如果您有更好的示例,我很乐意将其合并。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多