Excel 解决方案的全球化和本地化

本节包含有关将在具有 Windows 非英语设置的计算机上运行的 Microsoft Office Excel 解决方案的特殊注意事项的信息。全球化和本地化 Microsoft Office 解决方案过程中所遇到的大多数问题与您使用 Visual Studio 创建其他各种解决方案时遇到的问题相同。有关常规信息,请参见对应用程序进行全球化和本地化。在 MSDN 网页使用 Microsoft Visual Studio Tools for the Microsoft Office System 创建的解决方案的全球化和本地化问题上也提供了全球化和本地化信息。

默认情况下,Microsoft Office Excel 的宿主控件在任何 Windows 区域设置中均可正确工作,只要使用托管代码传递或操作的所有数据的格式都是使用“英语(美国)”格式设置进行设置的。在面向 .NET Framework 4 或 .NET Framework 4.5的项目,此行为由公共语言运行时 (CLR) (clr) 控制。

**适用于:**本主题中的信息适用于 Excel 2013 和 Excel 2010 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

在 Excel 中设置了格式的数据具有不同区域设置

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

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

Bb157877.collapse_all(zh-cn,VS.110).gif了解 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 将采用德语(德国)格式显示日期。

Bb157877.collapse_all(zh-cn,VS.110).gif将其他区域设置 ID 传递到 Excel 对象模型

公共语言运行时 (CLR) 会自动将区域设置 ID 1033 传递到接受区分区域设置的数据的所有方法和属性在 Excel 对象模型。无法为调入对象模型的所有调用自动更改此行为。但是,您可以通过使用 InvokeMember 来调用方法以及通过将区域设置 ID 传递到方法的 culture 参数,从而将不同的区域设置 ID 传递到特定方法。

本地化文档文本

项目中的文档、模板或工作簿中可能包含静态文本,静态文本必须与程序集及其他托管资源分开进行本地化。完成此任务的一个直接的方法是,创建文档的副本,然后使用 Microsoft Office Word 或 Microsoft Office Excel 对文本进行翻译。即使您不对代码做任何更改,此过程仍然有效,因为任意数量的文档都可以链接到同一程序集。

您还必须确保与文档文本进行交互的任何代码部分都要与文本的语言保持匹配,并确保书签、命名范围以及其他显示字段能够适应根据不同的语法和文本长度的需要对 Office 文档重新调整的格式设置。对于包含相对较少文本的文档模板,可以考虑在资源文件中存储文本,然后在运行时加载该文本。

Bb157877.collapse_all(zh-cn,VS.110).gif文本方向

在 Excel 中,可以设置工作表的属性,以从右向左呈现文本。放在设计器上的宿主控件或任何具有 RightToLeft 属性的控件将在运行时自动匹配这些设置。Word 没有针对双向文本的文档设置(您只能更改文本的对齐方式),因此这些控件不能映射到此设置。但您必须为每个控件设置文本对齐方式。可以编写代码遍历所有控件,强制这些控件从右向左呈现文本。

Bb157877.collapse_all(zh-cn,VS.110).gif更改区域性

将文档级自定义项代码通常共享 Excel 主 UI 线程,因此,对线程区域性影响任何其他内容在该线程上运行的所有更改;更改不会限制对自定义。

Windows 窗体控件在宿主应用程序启动应用程序级外接程序之前进行初始化。在这些情况下,应在设置 UI 控件之前更改区域性。

安装语言包

如果 Windows 具有非英语设置,则可安装 Visual Studio Tools for Office Runtime语言包来以 Windows 使用的语言查看 Visual Studio Tools for Office Runtime消息。如果最终用户运行您的非英语设置的解决方案窗口中,则必须安装相应的语言包看到的语言运行时消息。Visual Studio Tools for Office Runtime 语言包可从 Microsoft 下载中心可用。

此外,可再发行的 .NET Framework 语言包对于 ClickOnce 消息是必需的。.NET Framework 语言包可从 Microsoft 下载中心获得。

区域设置和 Excel COM 调用

每当托管客户端对 COM 对象调用一个方法并且需要传入特定于区域性的信息时,它都使用与当前线程区域设置匹配的 CurrentCulture(区域设置)来执行这些操作。默认情况下,当前线程区域设置是从用户的区域设置继承而来的。但是,当您从使用 Visual Studio 中的 Office 开发工具创建的 Excel 解决方案中调用 Excel 对象模型时,会自动将英语(美国)数据格式(区域设置 ID 1033)传递到 Excel 对象模型。在将数据传递到 Microsoft Office Excel 或从项目代码中读取数据之前,必须使用英语(美国)数据格式对具有区分区域设置格式的所有数据(如日期和货币)进行格式设置。

存储数据的注意事项

若要确保数据正确解释和显示,还应考虑可能发生,在字符串文本存储数据,例如 Excel 工作表公式中,(硬编码) 而不是在强类型对象。应使用采用区域性固定的或英语(美国)(LCID 值为 1033)样式进行格式设置的数据。

Bb157877.collapse_all(zh-cn,VS.110).gif使用字符串的应用程序

可硬编码的可能值包括用英语(美国)格式编写的日期文本,以及包含本地化函数名的 Excel 工作表公式。还可能是包含数字(如“1,000”)的硬编码字符串;在某些区域性中,“1,000”被解释为一千,而在另一些区域性中它表示一点零。根据错误的格式执行计算和比较会导致不正确的数据。

Excel 根据随字符串传递的 LCID 解释所有字符串。如果字符串的格式与传递的 LCID 不对应,则会出现问题。使用 Visual Studio 中的 Office 开发工具创建的 Excel 解决方案在传递所有数据时都使用 LCID 1033 (en-US)。Excel 根据区域设置和 Excel 用户界面语言显示数据。Visual Basic for Applications (VBA) 也采用这种工作方式;字符串被设置为 en-US 格式,而 VBA 通常传递 0(非特定语言)作为 LCID。例如,下面的 VBA 代码根据当前的用户区域设置显示 2004 年 5 月 12 日的正确格式:

'VBA
Application.ActiveCell.Value2 = "05/12/04"

当在通过 Visual Studio 中的 Office 开发工具创建的解决方案中使用并通过 COM 互操作传递到 Excel 时,相同的代码在日期格式为 en-US 样式时会产生相同的结果。

例如:

Me.Range("A1").Value2 = "05/12/04"
this.Range["A1"].Value2 = "05/12/04";

应尽可能使用强类型数据而不要使用字符串。例如,不将日期存储为字符串格式,而是存储为 Double,然后将其转换为 DateTime 对象进行操作。

下面的代码示例获取用户在单元格 A5 中输入的日期,将其存储为 Double,然后转换为 DateTime 对象以在单元格 A7 中显示。必须设置单元格 A7 的格式以显示日期。

Private Sub ConvertDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles ConvertDate.Click

    Try
        Dim dbl As Double = Me.Range("A5").Value2
        Dim dt As System.DateTime = System.DateTime.FromOADate(dbl)
        Me.Range("A7").Value2 = dt

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
private void ConvertDate_Click(object sender, EventArgs e)
{
    try
    {
        double dbl = (double)(this.Range["A5"].Value2);
        System.DateTime dt = System.DateTime.FromOADate(dbl);
        this.Range["A7"].Value2 = dt;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Bb157877.collapse_all(zh-cn,VS.110).gifExcel 工作表函数

Excel 大多数语言版本都在内部转换了工作表函数名。但是,因为潜在的语言和 COM 互操作问题,强烈建议您在代码中仅使用英语函数名。

Bb157877.collapse_all(zh-cn,VS.110).gif使用外部数据的应用程序

对于打开或以其他方式使用外部数据(如包含从旧系统导出的逗号分隔值的文件(CSV 文件))的任何代码,如果这些文件是使用除 en-US 格式之外的任何格式导出的,则这些代码也会受到影响。由于数据库中的所有值都应为二进制格式,因此只要数据库不将日期作为字符串存储且不执行不使用二进制格式的操作,数据库访问就不会受到影响。另外,如果使用 Excel 中的数据构造 SQL 查询,则可能需要根据使用的函数来确保数据为 en-US 格式。

请参见

任务

如何:面向 Office 多语言用户界面

概念

Office 解决方案中的可选参数

其他资源

设计和创建 Office 解决方案