使用各种区域设置对 Excel 中的数据进行格式设置
在将数据传递到 Microsoft Office Excel 或从 Office 项目中的代码读取数据之前,必须使用英语(美国)数据格式(区域设置 ID 1033)对具有区分区域设置格式的所有数据(例如日期和货币)进行格式设置。
**适用于:**本主题中的信息适用于 Excel 2007 和 Excel 2010 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
默认情况下,当您在 Visual Studio 中开发 Office 解决方案时,Excel 对象模型期望区域设置 ID 1033 数据格式(这也称为将对象模型锁定到区域设置 ID 1033)。 此行为与 Visual Basic for Applications 的运行方式相匹配。 但是,您可以在 Office 解决方案中修改此行为。
了解 Excel 对象模型如何始终期望区域设置 ID 1033
默认情况下,使用 Visual Studio 创建的 Office 解决方案不会受到最终用户区域设置的影响,并且其行为始终如同区域设置为英语(美国)一样。 例如,如果您在 Excel 中获取或设置 Value2 属性,则必须按照区域设置 ID 1033 所期望的方式来设置数据格式。 如果您使用不同的数据格式,可能会产生意外结果。
即使您对由托管代码传递或操作的数据使用英语(美国)格式,Excel 仍然会根据最终用户的区域设置来正确解释并显示数据。 Excel 可以正确设置数据格式,因为托管代码将区域设置 ID 1033 与数据一起传递,这表示数据为英语(美国)格式,因此必须重新设置格式,使其与用户的区域设置相匹配。
例如,如果最终用户将其区域选项设置为德语(德国)区域设置,则他们期望采用以下方式设置日期 2005 年 6 月 29 日的格式:29.06.2005。 但是,如果解决方案以字符串形式将该日期传递到 Excel,则您必须依据英语(美国)格式 6/29/2005 设置该日期的格式。 如果将单元格格式化为日期单元格,则 Excel 将采用德语(德国)格式显示日期。
将其他区域设置 ID 传递到 Excel 对象模型
在面向 .NET Framework 4 的项目中,公共语言运行时 (CLR) 会自动将区域设置 ID 1033 传递到接受区分区域设置的数据的 Excel 对象模型中的所有方法和属性。 无法为调入对象模型的所有调用自动更改此行为。 但是,您可以通过使用 InvokeMember 来调用方法以及通过将区域设置 ID 传递到方法的 culture 参数,从而将不同的区域设置 ID 传递到特定方法。
在面向 .NET Framework 3.5 的项目中,Visual Studio Tools for Office Runtime默认情况下将区域设置 ID 1033 传递到 Excel 对象模型。 但是,您可以使用 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 修改此行为。
修改 .NET Framework 3.5 项目以使用最终用户计算机的区域设置
在面向 .NET Framework 3.5 的项目中,您可以取消锁定整个 Excel 对象模型的区域设置 ID 行为。 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 控制这些项目中的 Excel 对象模型行为。 默认情况下,该特性设置为 true,这将锁定 Excel 对象模型,使它总是要求符合区域设置 ID 1033 的格式。 当此特性为 true 时,Visual Studio 会将解决方案所实例化的每个 Excel 对象包装到一个代理对象中,该代理对象始终将区域设置 ID 1033 传递到 Excel。 在将该特性设置为 false 时,将不使用这些代理对象,Excel 对象模型将使用最终用户的区域设置。
如果选择将该特性设置为 false,您仍然可以使用反射强制 Excel 属性和方法的特定调用使用英语(美国)数据格式(区域设置 ID 1033)。 有关更多信息,请参见如何:使用反射使字符串在 Excel 中是区域安全的。
提示
如果您将该特性设置为 false 并且任何最终用户具有除英语(美国)之外的区域设置,他们可能会在您的解决方案中遇到意外行为。
若要解除对象模型的锁定,请将项目中 AssemblyInfo.vb 或 AssemblyInfo.cs 文件中的 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 设置为 false。
<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
提示
由于当 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 为 true 时,Visual Studio Tools for Office Runtime会将所有本机 Excel 对象包装在一个代理对象中,因此您可能注意到涉及本机 Excel 对象的某些操作的性能会降低。 在这些情况下,您可以通过使用 Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap(System.Object) 方法获取没有代理的 Excel 对象,然后使用该对象执行操作,从而提高性能。 如果执行此操作,请注意 Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap(System.Object) 返回的对象使用当前线程的区域设置 ID,而不是区域设置 ID 1033。
请参见
任务
概念
Visual Studio Tools for Office Runtime 概述