Поделиться через


Форматирование данных в Excel при помощи различных региональных параметров

Обновлен: Ноябрь 2007

Применение

Сведения в данном разделе относятся только к указанным проектам Visual Studio Tools for Office и версиям приложений Microsoft Office.

Тип проекта

  • Проекты уровня документа

Версия Microsoft Office

  • Excel 2003

  • Excel 2007

Дополнительные сведения см. в разделе Доступность функций по типам приложений и проектов.

Все данные, для которых существуют настройки, зависящие от языковых стандартов (например, даты и денежные единицы), перед передачей в Microsoft Office Excel или чтением данных из кода в проекте Visual Studio Tools for Office необходимо форматировать с помощью формата данных "Английский (США)" (код языка 1033).

По умолчанию среда выполнения Visual Studio Tools for Office настраивает объектную модель Excel на форматирование данных, соответствующее коду языка 1033 (что также называется блокировкой объектной модели кодом языка 1033). Данное поведение соответствует методам работы VBA. Однако в ваших решениях Visual Studio Tools for Office это поведение можно изменить.

Программирование блокировки объектной модели Excel

По умолчанию настройки уровня документа и надстройки уровня приложения, созданные с помощью Visual Studio Tools for Office, не подвержены влиянию параметров языковых стандартов на компьютере конечного пользователя и всегда функционируют так, как если бы для них был задан языковой стандарт "Английский (США)". Например при считывании или установке значения свойства Value2 в Excel данные могут форматироваться в соответствии с языковым стандартом с кодом языка 1033. При использовании другого формата данных результат может отличаться от ожидаемого.

Даже при использовании формата "Английский (США)" для данных, которые передаются или обрабатываются управляемым кодом, Excel верно интерпретирует и отображает данные согласно языковым параметрам конечного пользователя. Excel может верно форматировать данные, поскольку управляемый код передает код языка 1033 вместе с данными, указывая, что данные предоставляются в формате "Английский (США)" и, таким образом, должны быть переформатированы, чтобы соответствовать языковым параметрам пользователя.

Например, если конечные пользователи используют языковой стандарт "Немецкий (Германия)", то ожидается, что дата "29 июня 2005 г." будет отформатирована как "29.06.2005". Однако если решение передает дату в Excel в виде строки, дату следует форматировать с использованием формата "Английский (США)": "6/29/2005". Если ячейки форматируются как ячейки даты, Excel отобразит дату в формате "Немецкий (Германия)".

Снятие блокировки объектной модели Excel

Средства Visual Studio Tools for Office позволяют снять блокировку кода языка для всей объектной модели Excel. В решениях Visual Studio Tools for Office поведение объектной модели Excel определяется атрибутом ExcelLocale1033Attribute. По умолчанию этому атрибуту присваивается значение true, которое блокирует форматирование в объектной модели Excel кодом языка 1033. Когда этот атрибут имеет значение true, Visual Studio Tools for Office заключает каждый объект Excel, установленный решением, в прокси-объект, который всегда передает код языка 1033 в Excel. Если атрибуту присвоено значение false, то эти прокси-объекты не используются, и объектная модель Excel будет использовать языковые параметры конечного пользователя.

ms268748.alert_note(ru-ru,VS.90).gifПримечание.

Если для атрибута задано значение false, и при этом у каких-либо конечных пользователей установлены языковые параметры, отличные от "Английский (США)", решение у них может работать не так, как ожидается. Можно написать код таким образом, чтобы решение работало с любыми языковыми параметрами. Дополнительные сведения см. в разделе Практическое руководство. Создание региональных строковых литералов в Excel с помощью отражения.

Чтобы разблокировать объектную модель, следует задать для атрибута ExcelLocale1033Attribute в файле проекта AssemblyInfo.vb или AssemblyInfo.cs значение false.

<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
ms268748.alert_note(ru-ru,VS.90).gifПримечание.

Поскольку среда выполнения Visual Studio Tools for Office создает оболочку вокруг всех встроенных объектов Excel в прокси-объекте, если ExcelLocale1033Attribute имеет значение true, то может наблюдаться замедление некоторых операций, использующих встроенные объекты Excel. В этих случаях можно повысить производительность, используя метод Unwrap для получения объектов Excel без прокси, а затем выполнить операцию с помощью этого объекта. В этом случае следует учитывать, что объект, возвращаемый Unwrap, использует код языка текущего потока, а не код языка "1033".

Снятие блокировки отдельных объектов Excel в проектах Excel 2003

При разработке решений для Excel 2003 в некоторых случаях бывает необходимо модифицировать встроенный объект Excel (т.е. экземпляр класса, заданного в пространстве имен Microsoft.Office.Interop.Excel), чтобы он использовал код языка текущего потока вместо кода языка 1033. Например это необходимо сделать, если требуется передать значение null в качестве параметра out метода, принадлежащего объекту Excel.

Чтобы изменить поведение кода языка для отдельных объектов Excel в проектах Excel 2003, следует использовать методы класса ExcelLocale1033Proxy. Вызовите метод Unwrap, чтобы настроить объект Excel на использование кода языка текущего потока вместо кода языка 1033.

После вызова Unwrap, чтобы изменить объект Excel, существует вероятность того, что будет необходимо снова использовать объект, но в ситуации, когда нужно будет использовать код языка 1033, вместо кода языка текущего потока. Для включения объекта Excel в прокси-объект, использующий код языка 1033 вместо кода языка текущего потока, следует вызвать метод Wrap.

ms268748.alert_note(ru-ru,VS.90).gifПримечание.

Методы Unwrap и Wrap являются устаревшими в проектах Visual Studio Tools for Office для Excel 2007. Среда выполнения Visual Studio Tools for Office, использующаяся с проектами Excel 2007, содержит усовершенствования, благодаря которым встроенные объекты Excel работают должным образом, когда ExcelLocale1033Attribute имеет значение true. Дополнительные сведения о среде выполнения Visual Studio Tools for Office см. в разделе Общие сведения об инструментах Visual Studio для среды выполнения Office.

Вызов методов с выходными параметрами при блокировке объектной модели Excel

Если атрибут ExcelLocale1033Attribute имеет значение true в решении Excel 2003, то при передаче значения null в качестве параметра out метода в объектную модель Excel будет вызвано исключение. Чтобы передать значение null в качестве параметра out, перед вызовом метода необходимо вызвать метод Unwrap, передав ему объект, содержащий нужный метод.

В качестве альтернативы можно присвоить значение параметру до вызова метода. Дополнительные сведения о параметрах out см. в разделе out (Справочник по C#).

Например, следующий код вызывает исключение, если атрибут ExcelLocale1033Attribute имеет значение true. Метод ExportXml имеет параметр out.

Dim outString As String = Nothing
Dim result As Excel.XlXmlExportResult = _
    Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = null;
Excel.XlXmlExportResult expResult =
Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);

Чтобы решить эту проблему, можно передать объект XmlMap в метод Unwrap перед вызовом ExportXml.

Dim outString As String = Nothing
Dim map As Excel.XmlMap = TryCast( _
    Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap( _
    Globals.ThisWorkbook.XmlMaps(1)), Excel.XmlMap)
Dim result As Excel.XlXmlExportResult = map.ExportXml(outString)
string outString = null;
Excel.XmlMap map = Microsoft.Office.Tools.Excel.
    ExcelLocale1033Proxy.Unwrap(
    Globals.ThisWorkbook.XmlMaps[1]) as Excel.XmlMap;
Excel.XlXmlExportResult expResult = map.ExportXml(out outString);

Также можно присвоить переменной outString значение до того, как передать ее в метод ExportXml.

Dim outString As String = String.Empty
Dim result As Excel.XlXmlExportResult = _
    Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = String.Empty;
Excel.XlXmlExportResult expResult =
    Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);

См. также

Задачи

Практическое руководство. Локализация решений Excel

Практическое руководство. Создание региональных строковых литералов в Excel с помощью отражения

Основные понятия

Создание решений Office в Visual Studio

Общие сведения об инструментах Visual Studio для среды выполнения Office

Ссылки

ExcelLocale1033Attribute

ExcelLocale1033Proxy

Другие ресурсы

Расширение метаданных с помощью атрибутов