我想探索动态使用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库,我的应用程序将无法启动。如果我动态加载它们,我可以检查它们是否存在,并通知用户缺少功能。
答案 0 :(得分:7)
使用dynamic
。
Type typeExcel = Type.GetTypeFromProgID("Excel.Application");
dynamic excel = Activator.CreateInstance(typeExcel);
excel.Visible = true;
dynamic workbooks = excel.Workbooks;
workbooks.Add();
workbooks.Add();
另见this answer。
答案 1 :(得分:2)
如果我包含未安装在目标系统上的COM库,我的应用程序将无法启动。
您正在寻找的治疗方法比问题严重得多。当您尝试使用代码段时,没有任何关于后期绑定Office代码的内容。 C#版本4中支持的 dynamic 关键字肯定会使语法更加友好。然而,在代码编写时没有任何友好的东西,你将无法获得任何智能感知。在运行时没有任何友好,你在编码时犯的错误将导致异常,后期绑定会产生相当大的开销。
有确保互操作程序集可用的简单对策:
请您的用户安装Office主互操作程序集(PIA)。
实际上需要PIA是非常罕见的,只有在您自己的公共方法中公开Office类型并在另一个程序集中使用它时才需要它。在Reference节点中选择Microsoft.Office.Interop程序集,并将其Copy Local属性设置为true。重建,您将在构建目录中获得这些程序集。将它们与您自己的可执行文件一起复制到客户端计算机。
VS2010以及此部署详细信息的Golden解决方案。在Reference节点中选择interop程序集,并将Embed Interop Types属性设置为True。互操作声明现在将合并到您自己的可执行文件中,您不必再部署互操作程序集或PIA。
由于您接受了VS2010及更高版本的动态解决方案,因此最后一颗子弹就是您想要的。