c# - 使用 InvokeMember 通过 C# 在 Excel 中的文化特定属性

标签 c# excel vsto cultureinfo invokemember

当我们在 C# 中通过 COM 调用 Excel 对象模型时,它始终使用 en-US 文化(这是几年前所做的更改,以便插件可以在所有机器上工作,而不管区域设置如何)。

我想调用具有特定文化的 Excel 对象模型,根据 Excel 文档执行此操作的方法是使用 InvokeMember 并传递cultureInfo 参数。 https://msdn.microsoft.com/en-us/library/bb157877.aspx

但是,每当我在非 en-US 的语言环境中尝试此操作时,都会收到 System.Reflection.TargetInvocationException。

因此,对于下面的示例代码,调用将适用于 en-US 文化,但会引发 fr-CA 文化异常。请注意,更改区域设置中的当前区域性不会影响是否引发异常。虽然它会根据区域设置确定在使用 Value2 属性时是否将字符串解释为数字。

我基于这个例子的代码,它在编写时似乎可以工作:
https://social.msdn.microsoft.com/Forums/office/en-US/2aee0a8a-aaff-48a8-9364-edf1e3fbb9b4/setting-rangevalue2-behavior-changed-between-net-20-and-net-40-for-international-versions-of?forum=exceldev

有谁知道我可以用除 en-US 以外的特定文化来调用 Range.Value2 进行哪些更改?

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            var excelApp = Globals.ThisAddIn.Application;
            var workbook = excelApp.Workbooks.Add();
            var worksheet = (Excel.Worksheet)workbook.Worksheets[1];
            var rangeA1 = worksheet.Range["A1"];
            var rangeB1 = worksheet.Range["B1"];
            string num1English = "1.1";
            string num1French = "1,1";

            rangeA1.GetType().InvokeMember("Value2", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.Public, null,
                                            rangeA1, new object[] { num1English }, new CultureInfo("en-US"));

            rangeB1.GetType().InvokeMember("Value2", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.Public, null,
                                            rangeB1, new object[] { num1French }, new CultureInfo("fr-CA"));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString() + "\n\n" + ex.StackTrace);
        }
    }

最佳答案

HowTo: Fix “Old format or invalid type library” error (0x80028018) 中查找示例.您可以使用任何在线提供的 VB.NET 到 C# 代码转换器。

关于c# - 使用 InvokeMember 通过 C# 在 Excel 中的文化特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37174781/

相关文章:

c# - 如何按 Controller 名称对 NSwag swagger.json 中的路径进行排序/排序

c# - 有人可以解释 RtlAdjustPrivilege

c# - 如何在C#中跟踪Windows事件

excel - 如果值相等则合并某一特定列的单元格

c# - Excel VSTO 2010 - 显示选择字段的对话框

c# - 群集感知客户端应用程序(到 SQL Server)

c# - Azure 上的 Server.MapPath 访问被拒绝

java - 修复记录: Cell information from worksheet created

visual-studio - 是否可以从 Visual Studio 2010 创建 Office 2003 VSTO 加载项?

c# - 多个按钮的 CommandBarButton 单击事件