Cómo: Garantizar la seguridad de los literales de cadena frente a la configuración regional en Excel mediante la reflexión

En los proyectos de Office, Excel muestra las cadenas de datos sensibles a la configuración regional correctamente si las cadenas del proyecto están en el formato Inglés (Estados Unidos). Puede cambiar este comportamiento en un proyecto de Office destinado a .NET Framework 3.5 estableciendo Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute en false. Sin embargo, cuando se pasan literales de cadena a Excel después de cambiar este atributo, se usa automáticamente el LCID activo del subproceso y los datos podrían tener un formato incorrecto. Para obtener más información, vea Aplicar formato a datos de Excel con varias configuraciones regionales.

Se aplica a: la información de este tema se aplica a los proyectos de nivel de documento y los proyectos de nivel de aplicación para Excel 2007 y Excel 2010. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.

Si establece Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute en false en un proyecto de Office destinado a .NET Framework 3.5, puede usar la reflexión para hacer que las llamadas concretas a propiedades y métodos de objetos de Excel usen el formato de datos Inglés (Estados Unidos) (identificador de configuración regional 1033). Al hacer esto, puede usar el formato Inglés (Estados Unidos) para cualquier cadena que se pase a la propiedad o método, y el código funcionará correctamente en todas las configuraciones regionales.

En los siguientes ejemplos se muestra cómo establecer u obtener una propiedad de un control NamedRange en un proyecto de nivel de documento para Excel, pero los mismos conceptos también se aplican a los objetos de Excel en proyectos de nivel de aplicación.

Para establecer una propiedad en un rango de Excel utilizando la reflexión

  1. Cree un método auxiliar que use el método InvokeMember para establecer un valor de propiedad de un objeto de Excel. Incluya los parámetros del objeto de Excel, el nombre de la propiedad y los parámetros de la propiedad. En el método auxiliar, use una sobrecarga InvokeMember que tenga un parámetro CultureInfo y pase el identificador de configuración regional de Inglés (Estados Unidos) a este parámetro.

    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. Cree un control NamedRange en la celda A5 y denomínelo 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. En lugar de establecer la propiedad Formula de NamedRange1 directamente, llame al método auxiliar SetPropertyInternational y pase el objeto Range subyacente del control NamedRange, el nombre de la propiedad y el valor.

    Nota

    No puede pasar el control NamedRange directamente. En su lugar, debe obtener el objeto Range subyacente de Excel mediante la propiedad InnerObject y, a continuación, pasar este objeto al método. Para obtener más información, vea Limitaciones de programación de elementos y controles Host.

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

Para recuperar un valor de propiedad de un rango de Excel utilizando la reflexión

  1. Cree una función auxiliar que use el método InvokeMember para obtener un valor de propiedad de un objeto de Excel. El objeto, el nombre de la propiedad y los parámetros de la propiedad se pasan al método auxiliar.

    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. Llame a la función GetPropertyInternational y pase el control NamedRange y el nombre de la propiedad.

    Nota

    El ejemplo de código siguiente supone que tiene un control NamedRange denominado NamedRange1 en la hoja de cálculo.

    Dim formula As String = CType( _
        GetPropertyInternational(NamedRange1.InnerObject, "Formula"), String)
    
    MessageBox.Show(formula)
    
    string formula = (string)
        GetPropertyInternational(NamedRange1.InnerObject, "Formula");
    
    MessageBox.Show(formula);
    

Vea también

Tareas

Cómo: Apuntar a MUI (Multilingual User Interface, Interfaz de usuario multilingüe) de Office

Conceptos

Cargar y utilizar tipos dinámicamente

Aplicar formato a datos de Excel con varias configuraciones regionales

Globalización y localización de las soluciones de Office

Otros recursos

Deploying Office Solutions

Diseñar y crear soluciones de Office