Share via


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

Actualización: noviembre 2007

Se aplica a

La información de este tema sólo se aplica a los proyectos y versiones especificados de Visual Studio Tools para Office de Microsoft Office.

Tipo de proyecto

  • Proyectos de nivel de documento

Versión de Microsoft Office

  • Excel 2003

  • Excel 2007

Para obtener más información, consulte Características disponibles por aplicación y tipo de proyecto.

Cuando utilice la configuración de Visual Studio Tools para Office predeterminada, dé siempre a los datos confidenciales de la configuración regional el formato de inglés (Estados Unidos), para que Excel muestre automáticamente los datos con el formato correcto. Si cambia la opción predeterminada estableciendo ExcelLocale1033Attribute en false y pasa literales de cadena a Excel, se utilizará automáticamente el LCID activo del subproceso y los datos podrán tener un formato incorrecto. Para obtener más información, vea Aplicar formato a datos de Excel con varias configuraciones regionales.

Si establece ExcelLocale1033Attribute en false, puede utilizar la reflexión para establecer u obtener una propiedad o invocar un método en el intervalo de destino, pasando una CultureInfo de inglés (Estados Unidos) para que pueda utilizar el nombre en inglés de cualquier cadena y funcione correctamente en todas las configuraciones regionales.

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

  1. Cree una función auxiliar llamada SetPropertyInternational para pasar el LCID de inglés (Estados Unidos) cada vez que establezca en rangos de Excel valores de propiedad mediante un literal de cadena.

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

    Nota:

    No puede pasar directamente el control NamedRange, debe pasar el objeto Range subyacente llamando al método InnerObject. 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 llamada GetPropertyInternational para establecer el LCID cada vez que recupera los valores de propiedad de rangos de 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. 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

Aplicar formato a datos de Excel con varias configuraciones regionales

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

Crear soluciones de Office en Visual Studio

Otros recursos

Implementar soluciones de Office