【问题标题】:Opening Excel-Workbook works with .Net3.5 but not with .Net4打开 Excel-Workbook 适用于 .Net3.5 但不适用于 .Net4
【发布时间】: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版本?
  • 不清楚 - 哪个变量返回为空? exceltest?
  • 有趣的是这个问题http://stackoverflow.com/questions/1922851/c-sharp-excel-interoperability 说我们应该使用ApplicationClass,而不是Application。这有帮助吗?
  • @Will:您引用的问题是最重要的答案,您应该从 ApplicationClass 更改为 Application

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


【解决方案1】:

我现在有一种解决方案:

我从

更改了我的 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,它实际上并不能解决问题,所以我不愿意接受我自己的答案作为解决方案。

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

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多