无法从c#应用程序打开excel文件

无法从c#应用程序打开excel文件,c#,visual-studio-2012,C#,Visual Studio 2012,我试图通过打开文件对话框打开excel文件,但出现以下错误 这是我写的代码,让我知道哪里出错了 Excel.Application excelApp = new Excel.Application(); Excel.Workbook newWorkbook = excelApp.Workbooks.Add(); Excel.Workbook excelWorkbook = null; OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter

我试图通过
打开文件对话框
打开excel文件,但出现以下错误

这是我写的代码,让我知道哪里出错了

Excel.Application excelApp = new Excel.Application();
Excel.Workbook newWorkbook = excelApp.Workbooks.Add();  
Excel.Workbook excelWorkbook = null;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel Files |*.xlsx";
ofd.InitialDirectory = @"C:\";
if (ofd.ShowDialog() == DialogResult.OK)
{
    string path = System.IO.Path.GetFullPath(ofd.FileName);
    try
    {
        excelWorkbook = excelApp.Workbooks.Open(path,
        0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
        true, false, 0, true, false, false);
    }
    catch (Exception theException)
    {
        String errorMessage;
        errorMessage = "Error: ";
        errorMessage = String.Concat(errorMessage, theException.Message);
        errorMessage = String.Concat(errorMessage, " Line: ");
        errorMessage = String.Concat(errorMessage, theException.Source);
        MessageBox.Show(errorMessage, "Error");
    }
}
我这样做是因为我需要从excel表中获取值。如果你需要更多的细节,请告诉我

编辑-:当我仔细观察时,我了解到消息框在首次尝试打开文件时不会被提示,但文件不会打开,然后消息框会在每次连续尝试打开文件时出现。
根据@Pankaj的建议,我尝试在底部添加Finally,但在第二次尝试打开文件后,我仍然会收到消息框。

一旦完成,您应该关闭文件并退出excel,因此在代码末尾添加Finally

try
{
    excelWorkbook = excelApp.Workbooks.Open(path,
    0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
    true, false, 0, true, false, false);
    // ... Do all your processing with excel file here
}
catch (Exception theException)
{
    String errorMessage;
    errorMessage = "Error: ";
    errorMessage = String.Concat(errorMessage, theException.Message);
    errorMessage = String.Concat(errorMessage, " Line: ");
    errorMessage = String.Concat(errorMessage, theException.Source);
    MessageBox.Show(errorMessage, "Error");
}
finally
{
   excelWorkbook.Close();
   excelApp.Application.Quit();
   Marshal.ReleaseComObject(excelApp);  
}

这是第一次,此错误不存在,下次读取文件时会出现此错误。

您应该关闭文件并在完成此操作后退出excel,因此在代码末尾添加此最后一项

try
{
    excelWorkbook = excelApp.Workbooks.Open(path,
    0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
    true, false, 0, true, false, false);
    // ... Do all your processing with excel file here
}
catch (Exception theException)
{
    String errorMessage;
    errorMessage = "Error: ";
    errorMessage = String.Concat(errorMessage, theException.Message);
    errorMessage = String.Concat(errorMessage, " Line: ");
    errorMessage = String.Concat(errorMessage, theException.Source);
    MessageBox.Show(errorMessage, "Error");
}
finally
{
   excelWorkbook.Close();
   excelApp.Application.Quit();
   Marshal.ReleaseComObject(excelApp);  
}

此错误第一次不存在,下次读取文件时将出现此错误。

尝试为
工作簿提供true作为第三个参数。打开
。MSDN:


您只想获取值,因此以只读方式打开它就足够了。

尝试为
工作簿提供true作为第三个参数。打开
。MSDN:


您只想获取值,因此以只读方式打开它就足够了。

好吧,代码中缺少一行-:
excelApp.Visible=true

代码现在看起来像-:

excelWorkbook = excelApp.Workbooks.Open(path,
            0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
            true, false, 0, true, false, false);
// do the operations on file
.
.
// open the file here 
excelApp.Visible = true;
根据@Pankaj的建议,我申请了

finally
{
    excelWorkbook.Close();
    excelApp.Application.Quit();
    Marshal.ReleaseComObject(excelApp);
}
但问题是,当我们关闭工作簿和excel应用程序时,文件会立即关闭,我不希望文件关闭,因为我将执行操作,然后用户将查看excel文件。此外,如果用户未选择任何文件并关闭文件对话框,则关闭应用程序和工作簿将抛出未处理的NullReferenceException。所以我改进了方块,现在看起来像

finally
{
    Marshal.ReleaseComObject(excelApp);
}

不过有一个问题,一个新的文件和所选的文件一起被打开了,现在还没有问题,但我正在努力关闭新打开的文件。感谢您的回答@pankaj和@Csaba.:)

嗯,代码中缺少一行-:
excelApp.Visible=true

代码现在看起来像-:

excelWorkbook = excelApp.Workbooks.Open(path,
            0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
            true, false, 0, true, false, false);
// do the operations on file
.
.
// open the file here 
excelApp.Visible = true;
根据@Pankaj的建议,我申请了

finally
{
    excelWorkbook.Close();
    excelApp.Application.Quit();
    Marshal.ReleaseComObject(excelApp);
}
但问题是,当我们关闭工作簿和excel应用程序时,文件会立即关闭,我不希望文件关闭,因为我将执行操作,然后用户将查看excel文件。此外,如果用户未选择任何文件并关闭文件对话框,则关闭应用程序和工作簿将抛出未处理的NullReferenceException。所以我改进了方块,现在看起来像

finally
{
    Marshal.ReleaseComObject(excelApp);
}

不过有一个问题,一个新的文件和所选的文件一起被打开了,现在还没有问题,但我正在努力关闭新打开的文件。感谢您的回答@pankaj和@Csaba.:)

你有没有可能已经在Excel中打开了同一个文件?没有,我没有打开该文件虽然没有解决当前的问题,但我想我会给出一个提示,我一直认为使用Excel更容易。你有没有可能已经在Excel中打开了同一个文件?没有,我没有打开该文件虽然没有解决当前的问题,但我想我会给出一个提示,我一直认为使用Excel比使用Excel更容易。不起作用,仍然是相同的错误,“执行点”位于
try
块时会显示错误消息框,因此我认为添加finally不会有帮助。请从任务管理器中删除所有“Excel”进程,然后再试一次,它应该可以工作,Excel对于终止其进程非常固执。我刚试过,效果很好。嗯,试过了,但运气不好,我的文件根本打不开。。excelApp.Workbooks.Open是否有问题(路径,0,false,5,“,”,false,Excel.XlPlatform.xlWindows,“,true,false,0,true,false,false)@Vin,这是正确的,如果是错误的,文件在第一次迭代中不会打开,问题是它没有正确关闭。您是否尝试添加此封送处理。ReleaseComObject(excelApp);不起作用,仍然是同一个错误,当“执行点”在
try
块中时会显示错误消息框,因此我认为添加finally不会有帮助。从任务管理器中删除所有“Excel”进程,然后再试一次,它应该会起作用,Excel对于终止其进程非常固执。我刚试过,效果很好。嗯,试过了,但运气不好,我的文件根本打不开。。excelApp.Workbooks.Open是否有问题(路径,0,false,5,“,”,false,Excel.XlPlatform.xlWindows,“,true,false,0,true,false,false)@Vin,这是正确的,如果是错误的,文件在第一次迭代中不会打开,问题是它没有正确关闭。您是否尝试添加此封送处理。ReleaseComObject(excelApp)@维姆,如果你认为我的答案有用,请把我们的答案投上一票,这就是说谢谢的方法@是的,如果我认为你的答案有用,我一定会这么做的!:)这甚至是我表达感谢的方式……)@维姆,如果你认为我的答案有用,请把我们的答案投上一票,这就是说谢谢的方法@是的,如果我认为你的答案有用,我一定会这么做的!:)这甚至是我表达感谢的方式……)