如何从 Visual Studio C# 使用 Office?

Posted

技术标签:

【中文标题】如何从 Visual Studio C# 使用 Office?【英文标题】:How to use Office from Visual Studio C#? 【发布时间】:2010-09-28 22:25:57 【问题描述】:

在 Visual Studio 中添加对 Office 的 COM 互操作的引用的技术是:

    参考文献 添加参考 选择COM标签 选择 Microsoft Office 11.0 对象库

出现了神奇的命名参考:

Microsoft.Office.Core

Project.csproj 文件显示了参考的详细信息:

<COMReference Include="Microsoft.Office.Core">
   <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>3</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

并且项目被签入源代码管理,一切都很好。


然后,使用 Office 2007 的开发人员从源代码​​管理中获取项目,但无法构建它,因为这样的引用不存在。

他(即我)签出 .csproj 文件,删除对

的引用
Microsoft Office 11.0 Object Library

并将 COM 引用重新添加为

Microsoft Office 12.0 Object Library

神奇地出现了一个命名引用:

Microsoft.Office.Core

Project.csproj 文件显示了参考的详细信息:

<COMReference Include="Microsoft.Office.Core">
  <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
  <VersionMajor>2</VersionMajor>
  <VersionMinor>4</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

并且项目被签入源代码管理,一切都很好。


然后,使用 Office 2003 的开发人员从源代码​​管理中获取项目,但无法构建它,因为这样的引用不存在。

他(即不是我)签出 .csproj 文件,删除对

的引用
Microsoft Office 12.0 Object Library

并将 COM 引用重新添加为

Microsoft Office 11.0 Object Library

神奇地出现了一个命名引用:

Microsoft.Office.Core

Project.csproj 文件显示了引用的详细信息:

<COMReference Include="Microsoft.Office.Core">
  <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
  <VersionMajor>2</VersionMajor>
  <VersionMinor>3</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

并且项目被签入源代码管理,一切都很好。

然后构建项目,将其压到 CD 上,然后发送给拥有 Office 2007 的客户。

一切都不好。


在过去(即 .NET dll 地狱之前),我们会使用 版本独立的 ProgID 来引用 Office 对象,即:

"Excel.Application"

解析为已安装 Office 的 clsid,例如

00024500-0000-0000-C000-000000000046    

然后使用对 COM 的调用(语言神经伪代码)构造其中的一个类:

public IUnknown CreateOleObject(string className)

    IUnknown unk;

    Clsid classID = ProgIDToClassID(className);
    CoCreateInstance(classID, null, 
          CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
          IUnknown, out unk);

    return unk;


问题

1) 已批准的自动化已安装 Office 应用程序的技术是什么?

2) Office 2003 Primary Interop Assemblies 有什么用处?

3) 如果我使用 Office 2003 主互操作程序集,是否必须安装 Office 2003?

4) 如果我使用 Office 2003 主要互操作程序集进行构建,我的客户会永远与 Office 20003 绑定吗?

5) 是否有任何 Office 2007 主互操作程序集?

6) 如果我安装 Office 2007 主要互操作程序集,我是否必须安装 Office 2007?

7) 使用标准 COM 互操作来驱动 Excel、Word 或 Outlook 有什么问题?例如:

[ComImport]
[Guid("00024500-0000-0000-C000-000000000046")]
public class Excel


8) 当一个人添加一个

引用 COM 标签上的项目, 相对于使用 [ComImport], 而不是使用 Office 2007 主要互操作程序集

9) 使用 COM 选项卡 添加引用与使用 COM interop 相同,不同之处在于它需要 类型库 才能看到了吗?

10) Office 2003 主互操作程序集是否向后和向前兼容: - 办公室 14 - 办公室 2007 - 办公室 2003 - 办公室 XP - 办公室 2000 - 办公室 97 - 办公室 95

如果客户和开发人员安装了新版本的 Office,它还能正常工作吗?

11) 我们是否必须将 Office 2003 主要互操作程序集与我们的应用程序一起提供?

12) 客户是否必须先安装 Office 2003 主互操作程序集才能使用我们的应用程序?

13) 如果客户安装 Office 2003 主要互操作程序集,他们是否必须安装 Office

14) 如果客户安装 Office 2003 主要互操作程序集,他们是否必须安装 Office 2003

15) Office 2003 Primary Interop Assembles 是 Office 2003 的免费、精简、可再分发版本吗?

16) 如果我的开发机器安装了 Office 2007,我是否可以使用 Office 2003 PIA,并交付给安装了 Office XP 的客户?

【问题讨论】:

抱歉,无法投票,票数已满。但这当然是值得的。 【参考方案1】:

哇,问题太多了。我认为,一般来说,如果您的应用程序使用 PIA,那么您假设您的目标受众安装了某些版本的 Office。当目标用户安装 Office 时,PIA 将安装在 GAC 中。如果他们没有安装 Office,那么您为什么要针对 Office?

是的,Office dll 是自动化 Office 的正确方法。有一个程序集列表 here,其中包括一些用于 Office 2007 的程序集。

【讨论】:

安装 Office 时未安装 PIA,否则我将能够构建解决方案。 我发现只有在安装 Office 时才安装 PIA:IFF 都已安装 Dotnet,而且您还专门选择安装所需的网络互操作性选项。但是,您始终可以运行修复安装并将它们添加回来。 msdn.microsoft.com/en-us/library/aa679806(v=office.11).aspx Microsoft Office 2003 的 Microsoft .NET 开发 我发现很难确定 PIA 是否已经注册; Gacutil 或许可以提供帮助,但我放弃了这条路线。【参考方案2】:

答案是“复制本地”任何您为互操作获得的程序集 dll。在输出文件夹中拥有程序集 dll 后,添加对它的引用,并将其检入源代码管理。

现在每个人都有引用的程序集 dll。

【讨论】:

获取库的方法如下:devcity.net/Articles/163/1/…【参考方案3】:

您使用 VSTO(Visual Studio 办公工具)吗?

http://msdn.microsoft.com/en-us/office/aa905533.aspx

【讨论】:

不是,VSTO 是一套工具吗?或者是一个支持网站,可以在开放论坛中提出问题,并从其他开发者那里得到答案?【参考方案4】:

一个旧线程,可能大多数人都会对 CopyLocal=True 感到满意,但是这里有另一种方式.. 在您的项目文件中使用both(或更多..?如果问题仍然存在,请考虑 Office 2010..)引用,然后忽略或只是告诉 MSBuild 忽略“MSB3284”警告(找不到库)。 因此,将其包含在您的 .csproj 文件中:

<COMReference Include="Microsoft.Office.Core">
   <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>3</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

接着是:

<COMReference Include="Microsoft.Office.Core">
   <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>4</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

我很想看看微软是否为此提供了 NuGet 库 - 只是为了让每个人都采用相同的方法。我认为这将消除人们在网上搜索这些答案的必要性......我相信这将违反 Microsoft Office 的许可证,因此他们是唯一提供它的人。

顺便说一句,使用本地副本,您必须小心不要错误地重新分发这些库。

【讨论】:

对于那些在最初的问题十年后仍然需要办公室图书馆的可怜人,微软现在确实提供了一个 nuget 包

以上是关于如何从 Visual Studio C# 使用 Office?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 中从数据库中获取数据(使用 C#)时使 HTML 行可点击

如何使用 Mono 编译 Visual Studio C# 项目

如何从 Visual Studio C# Winform 中打开 Access 表单?

如何从Visual Studio中的UML类图生成C#源代码

使用 Visual Studio 建模项目创建 C# 事件

如何自动化(从命令行)安装 Visual Studio Build Tools 构建环境,适用于 C++、.NET、C# 等