如何打开、读取和关闭 excel 互操作进程 (C#)

How to open, read and close excel interop processes (C#)

我必须编写一个程序来读取 excel xlsx 文件并将数据存储到数据库中。这是我实际的简单代码,我什至没有从 excel 文件中获取值,但我无法终止进程。我在谷歌上搜索了很多,也尝试了很多东西,但 excel 进程仍然存在。

public void readFile(path)
        {
            try
            {
                Microsoft.Office.Interop.Excel.Application xlApp = null;
                Microsoft.Office.Interop.Excel.Workbooks workbooks = null;
                Microsoft.Office.Interop.Excel.Workbook xlWorkbook = null;
                Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = null;
                Microsoft.Office.Interop.Excel.Range xlRange = null;

                xlApp = new Microsoft.Office.Interop.Excel.Application();
                workbooks = xlApp.Workbooks;
                xlWorkbook = workbooks.Open(path);
                xlWorksheet = xlWorkbook.Sheets[1];
                xlRange = xlWorksheet.UsedRange;

                //------Here is where I will read the data

                xlWorkbook.Close();
                workbooks.Close();
                xlApp.Quit();

                Marshal.FinalReleaseComObject(xlRange);
                Marshal.FinalReleaseComObject(xlWorksheet);
                Marshal.FinalReleaseComObject(xlWorkbook);
                Marshal.FinalReleaseComObject(workbooks);
                Marshal.FinalReleaseComObject(xlApp);

                xlRange = null;
                xlWorksheet = null;
                xlWorkbook = null;
                workbooks = null;
                xlApp = null;
            }
            catch (Exception e)
            {

            }
        }

并且该进程保持活动状态。我希望你能帮助我。

您需要将对象放入 using 块中,或者将结束语句放入 finally 中。

只要您的应用程序抛出异常,它就会使互操作保持打开状态。您应该做的是将关闭代码放在 finally 块中,这意味着代码将始终为 运行。像这样:

    public void readFile(string path)
    {
        Microsoft.Office.Interop.Excel.Application xlApp = null;
        Microsoft.Office.Interop.Excel.Workbooks workbooks = null;
        Microsoft.Office.Interop.Excel.Workbook xlWorkbook = null;
        Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = null;
        Microsoft.Office.Interop.Excel.Range xlRange = null;

        try
        {


            xlApp = new Microsoft.Office.Interop.Excel.Application();
            workbooks = xlApp.Workbooks;
            xlWorkbook = workbooks.Open(path);
            xlWorksheet = xlWorkbook.Sheets[1];
            xlRange = xlWorksheet.UsedRange;

            //------Here is where I will read the data




        }
        catch (Exception e)
        {

        }
        finally
        {
            xlWorkbook?.Close();
            workbooks?.Close();
            xlApp?.Quit();

            Marshal.FinalReleaseComObject(xlRange);
            Marshal.FinalReleaseComObject(xlWorksheet);
            Marshal.FinalReleaseComObject(xlWorkbook);
            Marshal.FinalReleaseComObject(workbooks);
            Marshal.FinalReleaseComObject(xlApp);                

            xlRange = null;
            xlWorksheet = null;
            xlWorkbook = null;
            workbooks = null;
            xlApp = null;
        }
    }

另一种选择是不要搞砸互操作并使用另一个库,例如 EPPlus(在 NuGet 上可用)来处理 excel 文件的读取,这些文件将在程序关闭时关闭。

我已经尝试了很多东西...下面的代码似乎有效。

public void readFile(path)
            {
                try
                {
                    Microsoft.Office.Interop.Excel.Application xlApp = null;
                Microsoft.Office.Interop.Excel.Workbooks workbooks = null;
                Microsoft.Office.Interop.Excel.Workbook xlWorkbook = null;
                Microsoft.Office.Interop.Excel.Sheets xlsheets = null;
                Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = null;
                Microsoft.Office.Interop.Excel.Range xlRange = null;

                xlApp = new Microsoft.Office.Interop.Excel.Application();
                workbooks = xlApp.Workbooks;
                xlWorkbook = workbooks.Open(path);
                xlsheets = xlWorkbook.Sheets;
                xlWorksheet = xlsheets[1];
                xlRange = xlWorksheet.UsedRange;

                //--------------------------------------------------------------------

                xlWorkbook.Close();
                workbooks.Close();
                xlApp.Quit();

                Marshal.FinalReleaseComObject(xlRangeColumns);
                Marshal.FinalReleaseComObject(xlRangeRows);
                Marshal.FinalReleaseComObject(xlRange);
                Marshal.FinalReleaseComObject(xlWorksheet);
                Marshal.FinalReleaseComObject(xlsheets);
                Marshal.FinalReleaseComObject(xlWorkbook);
                Marshal.FinalReleaseComObject(workbooks);
                Marshal.FinalReleaseComObject(xlApp);

                xlRangeColumns = null;
                xlRangeRows = null;
                xlRange = null;
                xlWorksheet = null;
                xlsheets = null;
                xlWorkbook = null;
                workbooks = null;
                xlApp = null;
                }
                catch (Exception e)
                {

                }
            }

差异很小。一个月前我会告诉你这两个代码是一样的。谁能告诉我为什么这段代码有效,而第一个代码无效?

尝试将它放在代码的末尾,它会杀死你的 excel

foreach (var process in Process.GetProcessesByName("myExcelFilename"))
{
    process.Kill();
}