如何:使用反射使字符串在 Excel 中是区域安全的
更新:2007 年 11 月
适用于 |
---|
本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。 项目类型
Microsoft Office 版本
有关更多信息,请参见按应用程序和项目类型提供的功能。 |
使用默认的 Visual Studio Tools for Office 设置时,请始终将区分区域设置的数据字符串的格式设置为英语(美国),这样 Excel 将自动显示格式正确的数据。如果将 ExcelLocale1033Attribute 设置为 false 以更改默认值,并将字符串文本传递到 Excel,则将自动使用线程的当前 LCID,且有可能将数据设置为不正确的格式。有关更多信息,请参见使用各种区域设置对 Excel 中的数据进行格式设置。
如果将 ExcelLocale1033Attribute 设置为 false,则可以使用反射在目标范围内设置或获取属性或者调用一个方法,并传入相应于“英语(美国)”的 CultureInfo,以便您可以使用任何字符串的英文名,该名称将在所有区域设置中都能正确工作。
使用反射在 Excel 范围内设置属性
创建一个名为 SetPropertyInternational 的 Helper 函数,以便每次通过传递字符串在 Excel 范围内设置属性值时,都传递表示“英语(美国)”的 LCID。
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、属性名和值,而不要直接设置 NamedRange1 的 Formula 属性。
说明: 不能直接传入 NamedRange 控件,必须通过调用 InnerObject 方法传递基础 Range 对象。有关更多信息,请参见宿主项和宿主控件的编程限制。
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)")
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)");
使用反射检索 Excel 范围中的属性值
创建一个名为 GetPropertyInternational 的函数,以便在每次检索 Excel 范围中的属性值时设置 LCID。
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);
请参见
任务
概念
在 Visual Studio 中创建 Office 解决方案