C# 打开Excel工作簿可以使用.Net3.5,但不能使用.Net4
我正在尝试将一个“旧的.Net-3.5”项目转换为.Net-4.0。现在一切正常,但Excel互操作 我遇到的问题是打开工作簿。我已经尝试过一个全新的项目,用.Net-3.5和.Net-4.0编译过一次。对于“旧”框架,它可以正常工作,但是对于4.0,我只能得到C# 打开Excel工作簿可以使用.Net3.5,但不能使用.Net4,c#,excel,c#-4.0,c#-3.0,C#,Excel,C# 4.0,C# 3.0,我正在尝试将一个“旧的.Net-3.5”项目转换为.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; namespac
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表单(来自模板),我只添加了一个具有上述行为的按钮
这里有我遗漏的东西吗?在4.0中使用Excel的方式有什么变化吗
更新:回答您的问题:
- 它是Windows 7 Enterprise(x64)上的Office 2010(x86)
- 我只是在VisualStudio的“引用”中添加了它,并在我的主类中将其称为“使用”。(将更新我的代码以完整显示)
- 现在,这是真正的最小代码来向您显示行为-奇怪,不是吗
- 它也发生在Windows XP(x86)上
- 您不需要在.net4中有引用Excel.Interop的项目,只要有某个.net4项目调用它就足够了。例如:
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);
在Excel中是否有任何与Excel.ApplicationClass
类似的价格事件
更新4:
为了回答评论的问题(谢谢威尔!),我对示例进行了一点扩展。主要的问题在于事件本身。为什么.net-4中会有这种差异,或者有文档记录?如何避免呢?我现在有一种解决方案:
我将我的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一起工作,而且它实际上不能解决问题,所以我不愿意接受我自己的答案作为解决方案
对于其他人的未来搜索/问题,此线程可能会有所帮助,因此我将让它保持打开状态。如果有人找到了对这种行为的解释,我绝对愿意接受它作为一个答案:)这对我来说很有效,顺便说一句,你可以去掉所有System.Type.Missing,因为它们是可选参数。您是如何添加对interop的引用的?您使用的是什么office版本?不清楚-哪个变量返回为null<代码>excel
或测试
?这个问题http://stackoverflow.com/questions/1922851/c-sharp-excel-interoperability
说我们应该使用ApplicationClass,而不是Application。这有帮助吗?@Will:您引用的问题的答案最高,您应该在不同的应用程序类之间进行更改