关闭Excel工作簿

gri*_*egs 4 c# excel-interop

我有一些代码打开xls工作簿;

Excel.Workbooks workBooks;
workBooks = excelApp.Workbooks;
workbook = workBooks.Open(sourceFilePath + sourceFileName + ".xls");
Run Code Online (Sandbox Code Playgroud)

然后我得到工作表;

worksheets = workbook.Worksheets;
worksheet = worksheets.get_Item("Standard");
Run Code Online (Sandbox Code Playgroud)

然后我将文件保存为csv;

worksheet.SaveAs(sourceFilePath + sourceFileName + ".csv", Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
Run Code Online (Sandbox Code Playgroud)

然后我尝试关闭工作簿;

Marshal.FinalReleaseComObject(worksheet);
Marshal.FinalReleaseComObject(worksheets);
workbook.Close();
Marshal.FinalReleaseComObject(workbook);
Run Code Online (Sandbox Code Playgroud)

但是,每次进入line workbook.Close()时,系统都会停止.

如果我不执行SaveAs,那么工作簿就会关闭.

如何关闭工作簿?

编辑

查看任务管理器向我显示Excel.exe仍在运行.关闭它会在我的代码中产生错误.

编辑2

我已经看过引用的SO帖子,但它没有解决问题.

Her*_*les 8

这是解决方案

第一: using EXCEL = Microsoft.Office.Interop.Excel;

然后,path是你的excel所在的位置.

        EXCEL.Application excel = new EXCEL.Application();
        try
        {
            EXCEL.Workbook book = excel.Application.Workbooks.Open(path);
            EXCEL.Worksheet sheet = book.Worksheets[1];
            // yout operation

        }
        catch (Exception ex) { MessageBox.Show("readExcel:" + ex.Message); }
        finally
        {
            KillExcel(excel);
            System.Threading.Thread.Sleep(100);
        }



    [DllImport("User32.dll")]
    public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
    private static void KillExcel(EXCEL.Application theApp)
    {
        int id = 0;
        IntPtr intptr = new IntPtr(theApp.Hwnd);
        System.Diagnostics.Process p = null;
        try
        {
            GetWindowThreadProcessId(intptr, out id);
            p = System.Diagnostics.Process.GetProcessById(id);
            if (p != null)
            {
                p.Kill();
                p.Dispose();
            }
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show("KillExcel:" + ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)


See*_*ain 5

为什么不合并2。这将解决保存完成之前关闭的所有问题。该Close方法中有一个选项可以保存文件。

workbook.Close(true, fileName, Missing.Value);
Run Code Online (Sandbox Code Playgroud)

同样,如果文件保存正确,而您的问题纯粹是因为excel.exe进程仍在运行,则可能是因为您没有关闭并释放所需的一切。我以前有过这个,并制定了一个更完整的关机程序。我关闭Excel文件的代码是:

        book.Close(true, fileName, Missing.Value); //close and save individual book
        allBooks.Close(); //close all books
        excel.Quit();
        Marshal.ReleaseComObject(allCells); //any used range objects
        Marshal.ReleaseComObject(sheet);
        Marshal.ReleaseComObject(sheets);
        Marshal.ReleaseComObject(book);
        Marshal.ReleaseComObject(allBooks);
        Marshal.ReleaseComObject(excel);
Run Code Online (Sandbox Code Playgroud)

这对我来说是100%的时间。