Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开Excel工作簿可以使用.Net3.5,但不能使用.Net4_C#_Excel_C# 4.0_C# 3.0 - Fatal编程技术网

C# 打开Excel工作簿可以使用.Net3.5,但不能使用.Net4

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

我正在尝试将一个“旧的.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;

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的“引用”中添加了它,并在我的主类中将其称为“使用”。(将更新我的代码以完整显示)
  • 现在,这是真正的最小代码来向您显示行为-奇怪,不是吗
更新2: 我发现了一些“新”东西:

  • 它也发生在Windows XP(x86)上
  • 您不需要在.net4中有引用Excel.Interop的项目,只要有某个.net4项目调用它就足够了。例如:
BaseProject(.net-4)-->数据层(.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中是否有任何与
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:您引用的问题的答案最高,您应该在不同的应用程序类之间进行更改