如何:使用反射使字符串在 Excel 中是区域安全的

更新:2007 年 11 月

适用于

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

项目类型

  • 文档级项目

Microsoft Office 版本

  • Excel 2003

  • Excel 2007

有关更多信息,请参见按应用程序和项目类型提供的功能

使用默认的 Visual Studio Tools for Office 设置时,请始终将区分区域设置的数据字符串的格式设置为英语(美国),这样 Excel 将自动显示格式正确的数据。如果将 ExcelLocale1033Attribute 设置为 false 以更改默认值,并将字符串文本传递到 Excel,则将自动使用线程的当前 LCID,且有可能将数据设置为不正确的格式。有关更多信息,请参见使用各种区域设置对 Excel 中的数据进行格式设置

如果将 ExcelLocale1033Attribute 设置为 false,则可以使用反射在目标范围内设置或获取属性或者调用一个方法,并传入相应于“英语(美国)”的 CultureInfo,以便您可以使用任何字符串的英文名,该名称将在所有区域设置中都能正确工作。

使用反射在 Excel 范围内设置属性

  1. 创建一个名为 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));
    }
    
  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、属性名和值,而不要直接设置 NamedRange1 的 Formula 属性。

    ms178761.alert_note(zh-cn,VS.90).gif说明:

    不能直接传入 NamedRange 控件,必须通过调用 InnerObject 方法传递基础 Range 对象。有关更多信息,请参见宿主项和宿主控件的编程限制

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

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

  1. 创建一个名为 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));
    }
    
  2. 调用 GetPropertyInternational 函数并传入 NamedRange 和属性名。

    ms178761.alert_note(zh-cn,VS.90).gif说明:

    下面的代码示例假定工作表中有一个名为 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 解决方案的全球化和本地化

在 Visual Studio 中创建 Office 解决方案

其他资源

部署 Office 解决方案