使用Workbook.Cells时,Excel进程仍然有效

时间:2015-03-11 15:25:51

标签: c# excel excel-interop

在现有excel文件的单元格中写入内容后,后台的Excel工艺没有关闭。如果我用workheet.Cells [1,1] = 2注释掉该部分,那么excel进程将像预期的那样消失。

提前帮忙。

这是我的代码:

                Excel.Application exelApp = new Excel.Application();
                var workbooks = exelApp.Workbooks;
                Excel.Workbook workbook = null;

                workbook = workbooks.Open(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


                var worksheets = workbook.Worksheets;
                Excel.Worksheet worksheet = (Excel.Worksheet)worksheets.get_Item("Einzelliste");

                //worksheet.Cells[1, 1] = 2;

                workbook.Close(true, Type.Missing, Type.Missing);
                workbooks.Close();
                exelApp.Quit();

                ReleaseObject(worksheet);                    
                ReleaseObject(worksheets);                                        
                ReleaseObject(workbook);                    
                ReleaseObject(workbooks);                                       
                ReleaseObject(exelApp);

                worksheet = null;
                worksheets = null;
                workbook = null;
                workbooks = null;
                exelApp = null;

    private static void ReleaseObject(object theObject)
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(theObject);
    }

编辑:根据Mark的建议:

                var range =worksheet.get_Range("A1");
                range.Value = 1; ReleaseObject(range);

与这篇帖子是一个重复的问题的一些建议相矛盾:我不得不说这不是因为所有对象都被正确发布而且源代码中没有使用“双点”。垃圾收集器的建议调用也没有解决问题。

2 个答案:

答案 0 :(得分:0)

尝试使用Range对象在操作之前访问单元格或单元格。然后确保释放引用该范围的COM对象。您还需要安排调用,以便在使用后立即释放COM对象。尝试也保存Excel文档中的更改,Excel可能没有关闭,因为它正在等待用户响应来保存文件。

此外(尽管OP不要求),永远不要遍历Excel的单元格。在一行对象上准备数据,以获取行中的单元格或列中的单元格。使用数组数组作为网格。然后使用Range对象设置值。

答案 1 :(得分:0)

根据this链接中提供的信息,我认为问题的原因可能在以下代码行中。

  Excel.Worksheet worksheet = (Excel.Worksheet)worksheets.get_Item("Einzelliste");

只是一个猜测,因为它不完全遵循链接中的规则,但我想知道演员是否对COM对象做了一些有趣的事情。

链接的关键部分是:

  

你的问题就在于此。

     

Dim wkBook As Workbook = xlApp.Workbooks.Open(“C:\ test.xls

     

因为.net需要包装来调用com对象,它真的变成了

     

Dim wkBook As Workbook dim tmp as WorkBooks tmp = xlApp.Workbooks   wkBook = tmp.Open(“C:\ test.xls

     

tmp变量有一个com ref,直到它才会被释放   收集了garabage。你应该使用的规则永远不会使用2点   com对象。总是创建一个tmp,并调用ReleaseComObject()   TMPS。

当然,你的代码没有完全相同的东西,但我想知道演员是否会在幕后造成一些奇怪的行为。