打开 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项目调用就足够了。例:
> 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 中存在这种差异或记录在案?以及如何避免它?
我现在有一种解决方案:
我更改了我的 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,并且它实际上不能解决问题,我不愿意接受我自己的答案作为解决方案。
对于其他人的未来搜索/问题,此线程可能会有所帮助,因此我将让它保持打开状态。如果有人找到对这种行为的解释,我绝对愿意接受它作为答案:)