【发布时间】:2013-10-02 02:53:47
【问题描述】:
我想探索这条动态使用 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 库,我的应用程序将无法启动。如果我动态加载它们,我可以检查它们的存在并通知用户缺少功能。
【问题讨论】:
-
您到底想完成什么?如果您想依赖互操作(因此不必使用 DLL,但必须将给定的引用添加到您的项目并将您的开发定位到专门引用的 Office 版本),您不需要这样做。这里有一个入门指南:support.microsoft.com/kb/302084/en-us
-
PS:还请记住,Office 2003 相当老旧并且有“一些特殊性”。例如,“可再发行主互操作程序集”必须安装在您要使用该应用程序的计算机上 (microsoft.com/en-us/download/details.aspx?id=20923)。这也是 Office 2007(其特定软件包)所必需的;但自 Office 2010 以来不再存在。
-
@varocarbas 我稍后会问我的老板是否可以使用 Office 2010。但现在我坚持使用 2003。
-
好的。这些是“经典”互操作规则。显然,GSerg 提出了一些我不太确定的替代方案(符合您原始代码中所写的内容)。
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。