打开 Excel 工作簿适用于 .Net3.5 但不与 .净4.

本文关键字:Excel 工作簿 适用于 Net3 打开 | 更新日期: 2023-09-27 18:33:04

我正在尝试转换"旧" .净-3.5-项目到 .Net-4.0. 到目前为止,一切正常,但 Excel-Interop。

我遇到的问题是打开工作簿。我已经尝试了一个全新的项目,并使用.净-3.5 和一次与 .Net-4.0. 使用"旧"框架,它可以按预期工作,但在 4.0 中,我只能得到null结果?

我在测试应用程序中的代码是这样的:

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");
            }
        }
    }
}

测试应用程序仅包含一个WinForm-Form(来自模板(,我只添加了一个具有上述行为的按钮。

我在这里缺少什么吗?在 4.0 中使用 Excel 的方式有什么变化吗?

更新:要回答您的问题:

  • 这是Windows 7 Enterprise(x64(上的Office 2010(x86(
  • 我只是在Visual Studio的"引用"中添加了它,并在我的主类中将其称为"using"。(将更新我的代码以显示完整(
  • 现在,这是向您展示行为的真正最小代码 - 很奇怪不是吗?

更新 2:我发现了一些"新"东西:

  • 它也发生在Windows XP(x86(上。
  • 你不需要在.net4中引用Excel.Interop的项目,它被一些.net4项目调用就足够了。例:
BaseProject (.net-4( --

> DataLayer (.net-3.5( 引用 Excel.Interop -->演示文稿 (.net-4(

在此示例中,将发生错误。即使数据层是.net-3.5。BaseProject 必须是 .net-4,因为它调用的是 .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:

回答评论的问题(谢谢威尔!我稍微扩展了一下示例。主要问题出在事件上。为什么 .net-4 中存在这种差异或记录在案?以及如何避免它?

打开 Excel 工作簿适用于 .Net3.5 但不与 .净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,并且它实际上不能解决问题,我不愿意接受我自己的答案作为解决方案。

对于其他人的未来搜索/问题,此线程可能会有所帮助,因此我将让它保持打开状态。如果有人找到对这种行为的解释,我绝对愿意接受它作为答案:)