Практическое руководство. Создание региональных строковых литералов в Excel с помощью отражения
В проектах Office Excel корректно отображает строки данных для определенных языковых стандартов, если строки в проекте отформатированы в формате "Английский (США)". Это поведение можно изменить для проектов Office, которые предназначены для .NET Framework 3.5. Для этого установите для параметра Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute значение false. В то же время, если строковые литералы передаются в Excel после изменения этого атрибута, то автоматически используется код языка текущего потока, и данные могут быть неправильно отформатированы. Дополнительные сведения см. в разделе Форматирование данных в Excel при помощи различных региональных параметров;
Применение. Сведения этого раздела применяются к проектам уровня документа и уровня приложения для Excel 2007 и Excel 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.
Если установить для атрибута Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute значение false в проекте Office, предназначенном для .NET Framework 3.5, то для принудительных вызовов свойств и методов объектов Excel при использовании формата данных "Английский (США)" с кодом языка 1033 можно использовать отражение. При этом форматирование "Английский (США)" можно использовать для всех строк, которые передаются в свойство или метод. Код будет корректно работать во всех языковых стандартах.
В следующих примерах показана установка или получение свойства элемента управления NamedRange в проекте уровня документа для Excel, но для объектов Excel в проектах уровня приложения применяются те же самые принципы.
Установка свойства в диапазоне Excel с помощью отражения
Создайте вспомогательный метод, использующий метод InvokeMember, чтобы задать значение свойства для объекта Excel. Укажите параметры объекта Excel, имя свойства и параметры свойства. Во вспомогательном методе следует использовать перегрузку InvokeMember с параметром CultureInfo, а затем передать в него код языка "Английский (США)".
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)); }
Создайте элемент управления NamedRange на ячейку А5 и назовите его 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");
Вместо задания свойства Formula NamedRange1 напрямую, вызовите вспомогательный метод SetPropertyInternational и передайте базовый объект Range для элемента управления NamedRange, а также имя и значение свойства.
Примечание
Передача элемента управления NamedRange напрямую невозможна.Вместо этого следует получить базовый объект Excel Range с помощью свойства InnerObject, а затем передать его в метод.Дополнительные сведения см. в разделе Программные ограничения ведущих элементов и элементов управления ведущего приложения.
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)")
SetPropertyInternational(NamedRange1.InnerObject, "Formula", "=SUM(12, 34)");
Извлечение значения свойства из диапазона Excel с помощью отражения
Создайте вспомогательную функцию, использующую метод 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)); }
Вызовите функцию GetPropertyInternational и передайте в нее NamedRange и имя свойства.
Примечание
Следующий пример кода предполагает наличие на листе управляющего элемента NamedRange с именем NamedRange1.
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 при помощи различных региональных параметров
Глобализация и локализация решений Microsoft Office