我正在尝试将“旧”.Net-3.5-Project转换为.Net-4.0。到目前为止一切正常,但Excel-Interop。
我遇到的问题是打开工作簿。我已经尝试了一个全新的项目,用.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的方式有什么变化吗?
更新:回答您的问题:
更新2: 我发现了一些“新”东西:
BaseProject(.net-4) - > DataLayer(.net-3.5)引用Excel.Interop - >演示文稿(.net-4)
在此示例中,将发生错误。即使DataLayer是.net-3.5。 BaseProject必须是.net-4,因为它调用的是Presentation .net-4(并且需要...)
更新3:
刚刚发现,一切都会正常运行,但是如果你在.net4中使用其中一个事件,你就会遇到麻烦。
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);
Excel._Application
中是否存在Excel.ApplicationClass
中的任何等价事件?
更新4:
回答评论的问题(谢谢Will!)我稍微扩展了一下这个例子。主要问题在于此事件。为什么在.net-4中存在这种差异或者在某处记录了什么?以及如何避免它?
答案 0 :(得分:0)
我现在有一种解决方案:
我从
改变了我的2个事件处理程序 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");
}
}
改变逻辑
void excel_WorkbookOpen(Excel.Workbook wb)
{
if (!wb.FullName.Equals(pathToExcelFile)) // pathToExcelFile is class-wide visible
{
return;
}
Console.WriteLine("done it right");
}
所以这是我之前逻辑的解决方法。
由于这不是解释为什么它适用于3.5而不是4,它实际上无法解决问题我不愿意接受我自己的答案作为解决方案。
对于其他人的未来搜索/问题,这个帖子可能会有所帮助,所以我会让它留在这里。如果有人找到行为的解释,我绝对愿意接受它作为答案:)