当我们在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
有人知道我可以对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() + "nn" + ex.StackTrace);
}
}
在HowTo中查找示例:修复"旧格式或无效类型库"错误(0x80028018)。您可以使用在线提供的任何VB.NET到C#代码转换器。
您误读了文档。它说要传递区域设置id,而不是CultureInfo。这也是合乎逻辑的,Excel不是使用.NET Framework编写的,COM技术存在得更早,并且比.NET本身有更广泛的用途,因此参数应该在不同的编程语言中工作。您应该传递的是CultureInfo实例的LCID属性。