使用InvokeMember通过C#在Excel中培养特定的属性

当我们在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文化抛出exception。 请注意,在区域设置中更改当前文化不会影响是否抛出exception。 虽然它将根据区域设置确定是否将string解释为使用Value2属性时的数字。

我基于这个例子的代码,这个代码写得很好用: https : //social.msdn.microsoft.com/Forums/office/en-US/2aee0a8a-aaff-48a8-9364-edf1e3fbb9b4/setting -rangevalue2-行为改变之间净20和净40换国际版本-的?论坛= exceldev

有没有人知道我可以做什么样的改变来调用Range.Value2以及en-US以外的特定文化?

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中查找示例:修复“旧格式或无效types库”错误(0x80028018) 。 您可以使用任何VB.NET到C#代码转换器在线提供。