3

我想探索这条动态使用 Excel 的路径。


我想在我的 C# 应用程序中使用 Excel,而不包括 dll 和其他东西。我会先检查是否安装了所需的 Excel 版本并运行它。

首先,我想获得我需要的所有类型,但我无法掌握它们:

// works
Type typeExcel = Type.GetTypeFromProgID("Excel.Application");
object excel = Activator.CreateInstance(typeExcel);
object workbooks = typeExcel.InvokeMember("Workbooks", BindingFlags.GetProperty, null, excel, null);

// this doesn't work, returns null
Type typeWorkbooks = Type.GetTypeFromProgID("Excel.Workbooks");

如果没有正确的类型,我将无法调用成员。那么我做错了什么?如何加载我需要的所有类型并知道它们在那里?我当前的 Excel 版本是 2003。


原因:如果我包含未安装在目标系统上的 COM 库,我的应用程序将无法启动。如果我动态加载它们,我可以检查它们的存在并通知用户缺少功能。

4

2 回答 2

7

使用dynamic.

Type typeExcel = Type.GetTypeFromProgID("Excel.Application");

dynamic excel = Activator.CreateInstance(typeExcel);
excel.Visible = true;

dynamic workbooks = excel.Workbooks;
workbooks.Add();
workbooks.Add();

另请参阅此答案

于 2013-09-26T08:41:25.190 回答
2

如果我包含未安装在目标系统上的 COM 库,我的应用程序将无法启动。

您正在寻找的治疗方法比问题严重得多。正如您在代码段中尝试的那样,后期绑定的 Office 代码没有任何漂亮之处。C# 版本 4 中支持的动态关键字无疑使语法更加友好。然而,在编写代码的时候,它并没有什么友好的地方,你不会得到任何 IntelliSense。在运行时没有什么友好的,你在编码时犯的错误会导致异常,后期绑定有相当大的开销。

有一些简单的对策可以确保互操作程序集可用:

  • 要求您的用户安装 Office 主要互操作程序集 (PIA)。

  • 实际上很少需要 PIA,只有当您在自己的公共方法中公开 Office 类型并在另一个程序集中使用它时才需要它。在 Reference 节点中选择 Microsoft.Office.Interop 程序集并将其 Copy Local 属性设置为 true。重新构建,您将在构建目录中获得这些程序集。将它们与您自己的可执行文件一起复制到客户端计算机。

  • VS2010 及更高版本具有此部署细节的黄金解决方案。在 Reference 节点中选择互操作程序集并将 Embed Interop Types 属性设置为 True。互操作声明现在将合并到您自己的可执行文件中,您不必再部署互操作程序集或 PIA。

由于您接受了动态解决方案,在 VS2010 及更高版本中可用,最后一个项目符号就是您想要的。

于 2013-09-26T11:34:25.067 回答