如何:使用反射使字符串在 Excel 中是区域安全的
在 Office 项目中,如果将项目中字符串的格式设置为英语(美国),Excel 将正确显示区分区域设置的数据字符串。 通过将 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 设置为 false,您可以在面向 .NET Framework 3.5 的 Office 项目中更改此行为。 但是,当您在更改此特性后将字符串传递到 Excel 时,则将自动使用线程的当前 LCID,且有可能将数据设置为不正确的格式。 有关更多信息,请参见 使用各种区域设置对 Excel 中的数据进行格式设置。
**适用于:**本主题中的信息适用于 Excel 2007 和 Excel 2010 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
如果在面向 .NET Framework 3.5 的 Office 项目中的确已将 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 设置为 false,您可以使用反射强制使对 Excel 对象属性和方法的特定调用使用英语(美国)数据格式(区域设置 ID 1033)。 如果这样做,则可以为传递到属性或方法的任何字符串使用英语(美国)格式设置,并且代码在所有区域设置中都将正确工作。
下面的示例演示如何在面向 Excel 的文档级项目中设置或获取 NamedRange 控件的属性,但相同的概念也适用于应用程序级项目中的 Excel 对象。
使用反射在 Excel 范围内设置属性
创建一个帮助器方法,该方法使用 InvokeMember 方法来设置 Excel 对象的属性值。 包括 Excel 对象的参数、属性名称,以及属性的参数。 在帮助器方法中,使用一个具有 CultureInfo 参数的 InvokeMember 重载,并将表示英语(美国)的区域设置 ID 传递到此参数。
Shared Function SetPropertyInternational( _ ByVal target As Object, ByVal name As String, _ ByVal ParamArray parameters() As Object) As Object Return target.GetType.InvokeMember(name, _ Reflection.BindingFlags.Instance Or Reflection.BindingFlags.SetProperty, _ Nothing, target, parameters, _ System.Globalization.CultureInfo.GetCultureInfo(1033)) End Function
static object SetPropertyInternational(object target, string name, params object[] args) { return target.GetType().InvokeMember(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Public, null, target, args, new System.Globalization.CultureInfo(1033)); }
在单元格 A5 中创建一个 NamedRange 控件,并将其命名为 NamedRange1。
Dim NamedRange1 As Microsoft.Office.Tools.Excel.NamedRange = _ Me.Controls.AddNamedRange(Me.Range("A5"), "NamedRange1")
Microsoft.Office.Tools.Excel.NamedRange NamedRange1 = this.Controls.AddNamedRange(this.Range["A5", missing], "NamedRange1");
请调用 SetPropertyInternational 帮助器方法并传入 NamedRange 控件、属性名称和值的基础 Range 对象,而不要直接设置 NamedRange1 的 Formula 属性。
提示
您不能直接传入 NamedRange 控件, 而是必须使用 InnerObject 属性获取基础 Excel Range 对象,然后将此对象传递到方法。 有关更多信息,请参见宿主项和宿主控件的编程限制。
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)")
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)");
使用反射检索 Excel 范围中的属性值
创建一个帮助器函数,该函数使用 InvokeMember 方法来获取 Excel 对象的属性值。 对象、属性名称以及属性的参数将传入到帮助器方法。
Shared Function GetPropertyInternational( _ ByVal target As Object, ByVal name As String, _ ByVal ParamArray parameters() As Object) As Object Return target.GetType.InvokeMember(name, _ Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetProperty, _ Nothing, target, parameters, _ System.Globalization.CultureInfo.GetCultureInfo(1033)) End Function
static object GetPropertyInternational(object target, string name, params object[] args) { return target.GetType().InvokeMember(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Public, null, target, args, new System.Globalization.CultureInfo(1033)); }
调用 GetPropertyInternational 函数并传入 NamedRange 和属性名。
提示
下面的代码示例假定工作表中有一个名为 NamedRange1 的 NamedRange 控件。
Dim formula As String = CType( _ GetPropertyInternational(NamedRange1.InnerObject, "Formula"), String) MessageBox.Show(formula)
string formula = (string) GetPropertyInternational(NamedRange1.InnerObject, "Formula"); MessageBox.Show(formula);