打开Excel-Workbook可以使用.Net3.5但不能使用.Net4

时间:2012-05-04 06:33:21

标签: c# excel c#-4.0 c#-3.0

我正在尝试将“旧”.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的方式有什么变化吗?

更新:回答您的问题:

  • Windows 7 Enterprise(x64)上的Office 2010(x86)
  • 我刚刚将它添加到Visual Studio中的“references”中,并在我的Main-Class中将其称为“using”。 (将更新我的代码以显示它已满)
  • 现在这是向你展示行为的真正最小代码 - 奇怪的不是吗?

更新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,因为它调用的是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中存在这种差异或者在某处记录了什么?以及如何避免它?

1 个答案:

答案 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,它实际上无法解决问题我不愿意接受我自己的答案作为解决方案。

对于其他人的未来搜索/问题,这个帖子可能会有所帮助,所以我会让它留在这里。如果有人找到行为的解释,我绝对愿意接受它作为答案:)