Excel Process不会以Excel-Introp结尾 [英] Excel Process will not terminate with Excel-Introp

查看:58
本文介绍了Excel Process不会以Excel-Introp结尾的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图将数据从Excel工作表导入到DataTable中.问题是,我完成操作后,Excel不会终止该过程.我不想使用System.Diagnostics通过进程名终止,因为该方法将终止所有excel实例,而不是由应用程序创建的实例.我知道这个问题是在这里多次发布的,但是似乎没有一种解决方案对我有用.我可能丢失了一些东西,看不到它.

I have been trying to import data from an excel sheet into a DataTable. The problem is that after i finish, excel would not terminate the process. I do not want to terminate by process name using System.Diagnostics as that approach would terminate all excel instances rather than the one that was created by the application. I know that this question was posted over here before multiple times, but none of the solutions seem to work for me. I am probably missing something and can not see it.

下面是我的代码:

    private void importToolStripMenuItem_Click(object sender, EventArgs e)
{
    openFileDialog1.Filter = "Excel WorkBooks (*.xlsx)|*.xlsx";
    openFileDialog1.FilterIndex = 1;
    openFileDialog1.Multiselect = false;


    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
            string empRange = "D4";
            string emptxid = "K4";

            object oMissing = System.Reflection.Missing.Value;
            string path = openFileDialog1.FileName;


            oExcel.Application xlApp;
            oExcel.Workbooks xlWorkBooks;
            oExcel.Workbook xlWorkBook;
            oExcel.Sheets xlSheets;
            oExcel.Worksheet xlWorkSheetDATA;
            oExcel.Worksheet xlWorkSheetEMP;
            oExcel.Range range;

            xlApp = new oExcel.Application();

            xlWorkBooks = xlApp.Workbooks;
            xlWorkBook = xlWorkBooks.Open(path);
            xlSheets = xlWorkBook.Worksheets;


            xlWorkSheetDATA = (oExcel.Worksheet)xlSheets.get_Item(DATASheetName);
            xlWorkSheetEMP = (oExcel.Worksheet)xlSheets.get_Item(EMPSheetName); 
            xlWorkSheetEMP.Activate(); 
            range = xlWorkSheetEMP.get_Range(empRange, empRange); 

            xlWorkSheetDATA.Activate();
            range = xlWorkSheetDATA.get_Range(emptxid, emptxid);

            xlApp.DisplayAlerts = false;


            xlWorkSheetDATA.Columns.ClearFormats();
            xlWorkSheetDATA.Rows.ClearFormats();

            int iTotalColumns = xlWorkSheetDATA.UsedRange.Columns.Count;
            int iTotalRows = xlWorkSheetDATA.UsedRange.Rows.Count;
            xlApp.Visible = true;

            DataTable dt = new DataTable();
            addColumns(iTotalColumns, dt);
            insertIntoDataTable(iTotalRows, dt, path);

            //clean-up
            System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
            range = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheetEMP);
            xlWorkSheetEMP = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheetDATA);
            xlWorkSheetDATA = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
            xlSheets = null;
            xlWorkBook.Close(false);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
            xlWorkBook = null;
            xlWorkBooks.Close();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBooks);
            xlWorkBooks = null;
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
            xlApp = null;

        }  
    }

推荐答案

编写一种方法来释放对象,例如本例

Write a method to release the objects such as this example

    private void ReleaseOfficeObject(object o)
    {
        Marshal.ReleaseComObject(o);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Marshal.FinalReleaseComObject(o);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
    }

然后称呼它

        ReleaseOfficeObject(range);
        ReleaseOfficeObject(xlWorkSheetDATA);
        ReleaseOfficeObject(xlSheets);
        xlWorkBook.Close(false);
        ReleaseOfficeObject(xlWorkBook);
        xlWorkBook = null;
        xlWorkBooks.Close();
        ReleaseOfficeObject(xlWorkBooks);
        xlWorkBooks = null;
        xlApp.Quit();
        ReleaseOfficeObject(xlApp);

这篇关于Excel Process不会以Excel-Introp结尾的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆