【发布时间】:2012-05-13 16:54:03
【问题描述】:
我正在尝试将“旧”.Net-3.5-Project 转换为 .Net-4.0。现在一切正常,但 Excel 互操作。
我遇到的问题是打开工作簿。我已经尝试了一个全新的项目,并用 .Net-3.5 编译过一次,用 .Net-4.0 编译过一次。使用“旧”框架,它可以按预期工作,但使用 4.0 我只能得到 null 吗?
我的 testapp 中的代码是这样的:
using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Excel.Workbook test;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenWithInterop();
}
private void OpenWithInterop()
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(excel_WorkbookOpen);
test = excel.Workbooks.Open(@"C:/Test/test.xlsx");
excel.Quit();
}
void excel_WorkbookOpen(Excel.Workbook Wb)
{
if (test.Name.Equals(Wb.Name)) // Here there will be an null-exception with .net-4 but not with .net-3.5
{
Console.WriteLine("done it right");
}
}
}
}
testapp 只包含一个 WinForm-Form(来自模板),我只添加了一个具有上述行为的按钮。
这里有什么我遗漏的吗?在 4.0 中使用 Excel 的方式有什么变化吗?
更新:回答您的问题:
- 它是 Windows 7 Enterprise (x64) 上的 Office 2010 (x86)
- 我刚刚将它添加到 Visual Studio 的“引用”中,并在我的主类中将其称为“使用”。 (将更新我的代码以显示完整)
- 现在这是向您展示行为的真正最小代码 - 是不是很奇怪?
更新 2: 我发现了一些“新”的东西:
- Windows XP (x86) 上也会出现这种情况
- 您不需要在.net4 中拥有引用Excel.Interop 的项目,由一些.net4 项目调用就足够了。示例:
BaseProject (.net-4) --> DataLayer (.net-3.5) 引用 Excel.Interop --> 演示文稿 (.net-4)
在这个例子中会发生错误。即使 DataLayer 是 .net-3.5。 BaseProject 必须是 .net-4,因为它调用的是 .net-4 的 Presentation(并且必须是...)
更新 3:
刚刚发现,一切都可以正常工作,但是如果您在 .net4 中使用其中之一来处理事件,您会遇到真正的麻烦
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);
Excel._Application 中是否有类似 Excel.ApplicationClass 中的等效事件?
更新 4:
为了回答 cmets 的问题(感谢 Will!),我稍微扩展了示例。主要问题在于事件。为什么 .net-4 中存在这种差异或在某处有记录?又该如何避免呢?
【问题讨论】:
-
这对我有用,顺便说一句,您可以省略所有 System.Type.Missings,因为它们是可选参数。您是如何添加对互操作的引用的?
-
你用的是什么office版本?
-
不清楚 - 哪个变量返回为空?
excel或test? -
有趣的是这个问题
http://stackoverflow.com/questions/1922851/c-sharp-excel-interoperability说我们应该使用ApplicationClass,而不是Application。这有帮助吗? -
@Will:您引用的问题是最重要的答案,您应该从 ApplicationClass 更改为 Application