C#操作Word时的版本问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 15:41   206   0

开发程序来对Word文档进行操作有多种方式实现,我利用的一种方式是通过MS office Word的API调用WINWORD程序。通过这种方式需要在项目中引用COM组件Microsoft.Office.Interop.Word.dll。

这里有一个版本的问题。Microsoft.Office.Interop.Word的大版本有两个,一个是12.0.0.0,一个是15.0.0.0。12.0的对应Word 2007,15.0的对应Word 2013。引用12.0版本可以支持Word 2007和Word 2010,引用15.0版本可以支持Word 2013及以上版本。

如果是打开Word文档引用12.0版本任何版本的Word程序都可以支持。换句话说,只要12.0版本中的API的方法在高版本中的重载没有改变或者说与低版本的保持了一致,那么是不存在不支持高版本问题的,也就是说在高版本中有部分API是可以利用12.0版本的。另外,要实现这种效果在引用Microsoft.Office.Interop.Word.dll时引用的属性“嵌入互操作类型”必须为true,否则任何操作都会出现版本问题,即使是基本的打开Word文档也会因为版本问题而导致无法打开文档。

=================================================================

C# 中获取系统安装的MS Offfice信息(是否安装、版本、安装路径)

c# 判断office是否安装 C#判断office版本

C#获取本地的Word的版本
=================================================================

嵌入互操作类型(Embed Interop Types)

运用office编程调用Excel 的PIA时Microsoft.Office.Interop.Excel.dll时会产生如下问题:

1.提示错误:未能加载文件或程序集“Microsoft.Office.Interop.Excel.dll”

2.安装的Excel PIA版本和编译时使用PIA的版本不一致。

解决方案:

  通过 /link 选项,可以部署包含嵌入类型信息的应用程序。 这样,该应用程序无需引用运行时程序集,便可以使用运行时程序集中实现嵌入类型信息的类型。如果发布了各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以使用各种版本,而不必重新编译。有关示例,请参见 演练:嵌入托管程序集中的类型(C# 和 Visual Basic)。使编译器允许正在编译的项目使用指定程序集中的 COM 类型信息。
  当涉及 COM 互操作时,使用 /link 选项尤为有用。 通过嵌入 COM 类型,您的应用程序不再要求目标计算机上有主互操作程序集 (PIA)。/link 选项指示编译器:将所引用互操作程序集中的 COM 类型信息嵌入生成的编译代码中。 该 COM类型由 CLSID (GUID) 值标识。这样,您的应用程序可以在安装有 CLSID 值相同的相同 COM 类型的目标计算机上运行。自动执行 Microsoft Office 的应用程序就是很好的示例。由于 Office 这样的应用程序通常在不同的版本中采用相同的 CLSID 值,因此只要目标计算机上安装有 .NET Framework 4 或更高版本,且您应用程序使用的方法、属性或事件包含在所引用 COM 类型中,您的应用程序就可以使用引用的 COM 类型。
  /link 选项仅嵌入接口、结构和委托。 不支持嵌入 COM 类。

  若要在 Visual Studio 中设置 /link 选项,请添加程序集引用,并将 Embed Interop Types 属性设置为 true。Embed Interop Types 属性的默认设置为 false。

  在代码中创建嵌入 COM 类型的实例时,必须使用适当的接口来创建该实例。如果尝试使用 CoClass 创建嵌入COM 类型的实例,将导致错误。

——/link(C# 编译器选项)

  在引用 COM 对象的应用程序中嵌入类型信息,则可以不需要主互操作程序集 (PIA)。此外,利用嵌入的类型信息可实现应用程序的版本中立性。即,可以将程序编写为使用多个 COM 库版本中的多个类型,而不是每个版本都需要一个特定的 PIA。对于使用 Microsoft Office 库中对象的应用程序,这是一种常用方案。嵌入类型信息后,程序的同一个生成可以使用不同计算机上的不同 Microsoft Office 版本,而无需为 Microsoft Office 的每个版本重新部署该程序或 PIA。

  由于嵌入的互操作类型信息,本演练中创建的应用程序将以不同的 Microsoft Office 版本运行。如果 Embed Interop Types 属性设置为 False,则必须为应用程序以后运行时使用的每个 Microsoft Office 版本包括一个PIA。

——演练:嵌入 Microsoft Office 程序集中的类型信息(C#和 Visual Basic)

——如何:通过使用 Visual C# 2010 功能访问 Office 互操作对象(C# 编程指南)

dynamic编程的知识需要进一步了解。

关于ODBC数据源和Office互操作的问题解决方案:

1.ODBC数据源
  AccessDatabaseEngine.exe是Office2007 Access的ODBC数据库驱动程序。
  如果系统安装的是Office2003(Version 11.0),一般会提供了OLEDB8.0(Jet4.0)驱动程序支持(*.xls)读取,此时不会支持OLEDB12.0格式数据(*.xlsx)的读取,请安装AccessDatabaseEngine.exe,之后将支持两种格式。
2.系统安装了Office2007(Version 12.0)会提供了OLEDB8.0和12.0的数据库驱动程序,可通过Windows\System32\odbcad32.exe(或者64bit OS路径Windows\SysWow64\odbcad32.exe)查看。
  安装了Office2010(Version 14.0)会提供8.0、12.0和14.0的数据库驱动程序。
  程序编译为x86项目,所以安装32位的Office驱动程序。
2.Office互操作(Microsoft.Office.Interop.Excel.dll)

添加.net引用dll,将“嵌入式互操作”设置为true。这样对安装部署的机器没有Office版本限制。(原理如上)

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP