本节包含有关Microsoft Office Excel 解决方案的特殊注意事项的信息,这些解决方案将在具有非英语设置的 Windows 计算机上运行。 全球化和本地化Microsoft Office 解决方案的大多数方面与使用 Visual Studio 创建其他类型的解决方案时遇到的方面相同。 有关常规信息,请参阅 全球化和本地化应用程序。
默认情况下,只要所有使用托管代码传递或处理的数据都采用英语(美国)格式,Microsoft Office Excel 在任何 Windows 区域设置中的主机控件都能正常工作。 在面向 .NET Framework 4 或 .NET Framework 4.5 的项目中,此行为由公共语言运行时(CLR)控制。
适用于: 本主题中的信息适用于 Excel 的文档级项目和 VSTO 外接程序项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能。
使用各种区域设置在 Excel 中设置数据格式
必须在将具有区域设置敏感格式(如日期和货币)的所有数据发送到 Microsoft Office Excel 或从 Office 项目的代码读取数据之前,使用英语(美国)数据格式(区域设置 ID 1033)对其进行格式化。
默认情况下,在 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,则必须根据英语(美国)格式设置日期的格式:2005/6/29。 如果单元格的格式设置为 Date 单元格,Excel 将以德语(德国)格式显示日期。
将其他区域设置 ID 传递给 Excel 对象模型
公共语言运行时(CLR)会自动将区域设置 ID 1033 传递给接受区域设置敏感数据的 Excel 对象模型中的所有方法和属性。 对于对对象模型的所有调用,无法自动更改此行为。 但是,可以通过使用 InvokeMember 来调用该方法,并将区域设置 ID 传递给方法的 culture 参数,从而将不同的区域设置 ID 传递给特定方法。
本地化文档文本
项目中的文档、模板或工作簿可能包含静态文本,该文本必须独立于程序集和其他托管资源进行本地化。 执行此作的一种简单方法是使用 Microsoft Office Word 或 Microsoft Office Excel 创建文档副本并翻译文本。 即使对代码没有进行任何更改,此过程也有效,因为任意数量的文档都可以链接到同一程序集。
您仍然必须确保代码中与文档文本交互的任何部分继续与文本的语言一致,并且书签、命名范围和其他显示字段能够适应根据不同语法和文本长度进行的任何重新格式化的 Office 文档。 对于包含相对较少的文本的文档模板,可能需要考虑将文本存储在资源文件中,然后在运行时加载文本。
文本方向
在 Excel 中,可以设置工作表的属性,以向右向左呈现文本。 宿主控件或任何具有 RightToLeft 属性的控件(放置在设计器上)在运行时自动匹配这些设置。 Word 没有双向文本的文档设置(只需更改文本的对齐方式),因此无法将控件映射到此设置。 相反,必须为每个控件设置文本对齐方式。 编写代码可以遍历所有控件,并强制它们从右到左呈现文本。
更改文化设置
文档级定制代码通常与 Excel 的主 UI 线程共享,因此对线程文化设置的任何更改都会影响该线程上运行的所有内容;这种更改不仅限于您的定制功能。
在启动主机应用程序的应用级 VSTO 外接程序之前,Windows 窗体控件已被初始化。 在这些情况下,应在设置 UI 控件之前更改语言环境。
安装语言包
如果 Windows 具有非英语设置,则可以安装 Visual Studio Tools for Office 运行时语言包,以查看与 Windows 相同的语言的 Visual Studio Tools for Office 运行时消息。 如果任何最终用户使用适用于 Windows 的非英语设置运行你的解决方案,他们必须具有正确的语言包,才能使用与 Windows 相同的语言查看运行时消息。 Visual Studio Tools for Office 运行时语言包可从 Microsoft下载中心获取。
此外,ClickOnce 消息需要可再发行的 .NET Framework 语言包。 .NET Framework 语言包可从 Microsoft下载中心获取。
区域设置和 Excel COM 调用
每当托管客户端对 COM 对象调用方法并且需要传入特定于区域性的信息时,它就使用与当前线程区域设置匹配的 CurrentCulture (区域设置)执行此作。 默认情况下,当前线程区域设置继承自用户的区域设置。 但是,从使用 Visual Studio 中的 Office 开发工具创建的 Excel 解决方案调用 Excel 对象模型时,英语(美国)数据格式(区域设置 ID 1033)会自动传递到 Excel 对象模型。 必须先使用英语(美国)数据格式设置所有具有区域设置敏感格式(如日期和货币)的数据,然后才能将其传递给 Microsoft Office Excel 或从项目代码中读取。
存储数据的注意事项
为了确保正确解释和显示数据,还应考虑当应用程序将数据(如 Excel 工作表公式)存储在字符串文本(硬编码)而不是强类型对象中时,可能会出现问题。 应使用假定为不随文化变化或英语(美国)(LCID 值 1033)格式的数据。
使用字符串文本的应用程序
可能进行硬编码的值包括用英语(美国)格式编写的日期文本,以及包含本地化函数名称的 Excel 工作表公式。 另一种可能性可能是包含数字(如“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 样式格式时生成相同的结果。
例如:
应尽可能处理强类型数据,而不是字符串文本。 例如,与其将日期存储在字符串文本中,而是将其存储为一个Double,然后将其转换为一个DateTime对象以便进行处理。
下面的代码示例采用用户在单元格 A5 中输入的日期,将其存储为 a Double,然后将其转换为 DateTime 在单元格 A7 中显示的对象。 单元格 A7 的格式必须设置为显示日期。
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);
}
}
Excel 工作表函数
Excel 的大多数语言版本会在内部翻译工作表函数名称。 但是,由于潜在的语言和 COM 互作问题,建议仅在代码中使用英语函数名称。
使用外部数据的应用程序
可能会受到影响的代码包括:用于打开或使用外部数据的代码(例如包含从旧系统导出的逗号分隔值(CSV 文件)等格式的文件)。特别是,如果这些文件使用非美式英语(en-US)格式导出,可能会产生影响。 数据库访问可能不会受到影响,因为所有值都应采用二进制格式,除非数据库将日期存储为字符串或执行不使用二进制格式的作。 此外,如果使用 Excel 中的数据构造 SQL 查询,则可能需要确保它们采用 en-US 格式,具体取决于所使用的函数。