如何:使用反射使字符串在 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 范围内设置属性

  1. 创建一个帮助器方法,该方法使用 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));
    }
    
  2. 在单元格 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");
    
  3. 请调用 SetPropertyInternational 帮助器方法并传入 NamedRange 控件、属性名称和值的基础 Range 对象,而不要直接设置 NamedRange1 的 Formula 属性。

    提示

    您不能直接传入 NamedRange 控件, 而是必须使用 InnerObject 属性获取基础 Excel Range 对象,然后将此对象传递到方法。 有关更多信息,请参见宿主项和宿主控件的编程限制

    SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)")
    
    SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)");
    

使用反射检索 Excel 范围中的属性值

  1. 创建一个帮助器函数,该函数使用 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));
    }
    
  2. 调用 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);
    

请参见

任务

如何:面向 Office 多语言用户界面

概念

动态加载和使用类型

使用各种区域设置对 Excel 中的数据进行格式设置

Office 解决方案的全球化和本地化

其他资源

Deploying Office Solutions

设计和创建 Office 解决方案