使用各种区域设置对 Excel 中的数据进行格式设置

更新:2007 年 11 月

适用于

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

项目类型

  • 文档级项目

Microsoft Office 版本

  • Excel 2003

  • Excel 2007

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

在将数据传递到 Microsoft Office Excel 或从 Visual Studio Tools for Office 项目中的代码读取数据之前,必须使用英语(美国)数据格式(区域设置 ID 1033)对具有区分区域设置格式的所有数据(如日期和货币)进行格式设置。

默认情况下,Visual Studio Tools for Office 运行时会导致 Excel 对象模型期望区域设置 ID 1033 数据格式(这也称为将对象模型锁定到区域设置 ID 1033)。此行为与 Visual Basic for Applications 的运行方式相匹配。但是,您可以在 Visual Studio Tools for Office 解决方案中修改此行为。

对锁定的 Excel 对象模型进行编程

默认情况下,借助于 Visual Studio Tools for Office 创建的文档级自定义项和应用程序级外接程序不会受到最终用户区域设置的影响,而且其行为始终如同区域设置为“英语(美国)”一样。例如,如果您在 Excel 中获取或设置 Value2 属性,则必须按照区域设置 ID 1033 所期望的方式来设置数据格式。如果您使用不同的数据格式,可能会产生意外结果。

即使您对由托管代码传递或操作的数据使用英语(美国)格式,Excel 仍然会根据最终用户的区域设置来正确解释并显示数据。Excel 可以正确设置数据格式,因为托管代码将区域设置 ID 1033 与数据一起传递,这表示数据为英语(美国)格式,因此必须重新设置格式,使其与用户的区域设置相匹配。

例如,如果最终用户将其区域选项设为德语(德国)区域设置,则日期 2005 年 6 月 29 日的格式应设置为:29.06.2005。然而,如果解决方案将日期作为字符串传递到 Excel,您必须根据英语(美国)格式:6/29/2005 对日期进行格式设置。如果将单元格的格式设置为日期单元格,则 Excel 将以德语(德国)格式显示日期。

解除 Excel 对象模型的锁定

Visual Studio Tools for Office 使您能够取消锁定整个 Excel 对象模型的区域设置 ID 行为。ExcelLocale1033Attribute 控制 Visual Studio Tools for Office 解决方案中的 Excel 对象模型行为。默认情况下,该属性设置为 true,这将锁定 Excel 对象模型,使它总是要求符合区域设置 ID 1033 的格式。当该属性为 true 时,Visual Studio Tools for Office 会将解决方案所实例化的每个 Excel 对象包装到一个代理对象中,该代理对象始终将区域设置 ID 1033 传递到 Excel。在将该属性设置为 false 时,将不使用这些代理对象,Excel 对象模型将使用最终用户的区域设置。

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

如果您将该属性设置为 false 并且任何最终用户具有除英语(美国)之外的区域设置,他们可能会在您的解决方案中遇到意外行为。您可以编写自己的代码,以便代码在任何区域设置中都是有效的。有关更多信息,请参见如何:使用反射使字符串在 Excel 中是区域安全的

若要解除对象模型的锁定,请将项目中 AssemblyInfo.vb 或 AssemblyInfo.cs 文件中的 ExcelLocale1033Attribute 设置为 false。

<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
ms268748.alert_note(zh-cn,VS.90).gif说明:

因为当 ExcelLocale1033Attribute 为 true 时,Visual Studio Tools for Office 运行时将包装代理对象中的所有本机 Excel 对象,所以您可能注意到在涉及本机 Excel 对象的某些操作中性能降低。在这些情况下,您可以通过使用 Unwrap 方法获取没有代理的 Excel 对象,然后使用该对象执行操作,从而提高性能。如果执行此操作,请注意 Unwrap 返回的对象使用当前线程的区域设置 ID,而不是区域设置 ID 1033。

取消 Excel 2003 项目中特定 Excel 对象的锁定

如果要为 Excel 2003 开发解决方案,那么,有时需要修改本机 Excel 对象(即,Microsoft.Office.Interop.Excel 命名空间中所定义类的实例),以便它使用当前线程的区域设置 ID,而不是区域设置 ID 1033。例如,如果您希望将 null 作为某个方法的 out 参数来传递,而且该方法属于 Excel 对象,则必须进行这样的修改。

若要更改 Excel 2003 项目中个别 Excel 对象的区域设置 ID 行为,请使用 ExcelLocale1033Proxy 类的方法。可通过调用 Unwrap 方法来修改 Excel 对象,以便它使用当前线程的区域设置 ID,而不是区域设置 ID 1033。

在调用 Unwrap 以修改某个 Excel 对象后,您可能希望再次使用该对象,但这次您希望使用区域设置 ID 1033(而不是当前线程的区域设置 ID)。如果要将 Excel 对象包装到使用区域设置 ID 1033(而不是当前线程的区域设置 ID)的代理对象中,请调用 Wrap 方法。

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

UnwrapWrap 方法在 Excel 2007 的 Visual Studio Tools for Office 项目中已过时。用于 Excel 2007 项目的 Visual Studio Tools for Office 运行时包含一些改进功能,这些改进功能使本机 Excel 对象在 ExcelLocale1033Attribute 为 true 时按照预期方式工作。有关 Visual Studio Tools for Office 运行时的更多信息,请参见 Visual Studio Tools for Office 运行库概述

在 Excel 对象模型处于锁定状态时调用具有 out 参数的方法

在 Excel 2003 解决方案中,如果 ExcelLocale1033Attribute 为 true,那么,当您将 null 作为 Excel 对象模型中某个方法的 out 参数传递时,将收到一个异常。要将 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);

要解决此问题,可以在调用 ExportXml 之前,将 XmlMap 传入 Unwrap 方法。

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 中是区域安全的

概念

在 Visual Studio 中创建 Office 解决方案

Visual Studio Tools for Office 运行库概述

参考

ExcelLocale1033Attribute

ExcelLocale1033Proxy

其他资源

利用属性扩展元数据