C# 使用工作簿.cells时Excel进程保持活动状态

C# 使用工作簿.cells时Excel进程保持活动状态,c#,excel,excel-interop,C#,Excel,Excel Interop,在现有excel文件的单元格中写入内容后,后台的excel进程没有关闭。如果我用sheet.Cells[1,1]=2注释掉该部分,那么excel进程将像预期的那样消失 请提前向Thx寻求帮助 这是我的密码: Excel.Application exelApp = new Excel.Application(); var workbooks = exelApp.Workbooks; Excel.Work

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

请提前向Thx寻求帮助

这是我的密码:

                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);

有些人认为这篇文章是一个重复的问题,与此相反:我不得不说,这并不是因为所有对象都已正确发布,而且源代码中没有使用“双点”。建议的垃圾收集器调用也不能解决问题

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


此外(尽管OP没有要求),不要在Excel的单元格之间循环。为行中的单元格或列中的单元格准备对象数组上的数据。对网格使用数组数组。然后使用Range对象设置值。

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

  Excel.Worksheet worksheet = (Excel.Worksheet)worksheets.get_Item("Einzelliste");
只是一个猜测,因为它并不完全遵循链接中的规则,但我想知道演员是否对COM对象做了一些有趣的事情

链接的关键部分是:

你的问题是线路

将wkBook设置为工作簿=xlApp.Workbooks.Open(“C:\test.xls

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

将wkBook设置为工作簿将tmp设置为工作簿tmp=xlApp.WorkBooks wkBook=tmp.Open(“C:\test.xls

tmp变量有一个com ref,在其 收集的garabage。你应该使用的规则是永远不要使用2个点 始终创建一个tmp,并在 tmps


当然,您的代码没有完全相同的内容,但我想知道演员阵容是否会在幕后引起一些奇怪的行为。

可能重复
//工作表.Cells[1,1]=2;
如果将其更改为
//工作表.Cells[1,1]会怎么样.Value=2;
@Michal:我已经读过这篇文章了,但它没有包含我的问题。@MethodMan:没有关于Value的定义。我还注意到你没有激活工作表。这可能是需要的,也可能不是需要的。。问题,当你一步一步地浏览代码时,当你跨过这一行时会发生什么>工作表.Cells[1,1]=2;当您取消注释它时..?它是否会引发错误或只是挂断..当您使用快速手表检查
工作表.Cells[1,1];
OP在
ReleaseObject
method@MethodMan,存在对单元格的隐藏引用[1,1]尚未发布。我认为存在索引问题,但我不知道这是为什么我在调试时等待OP响应数据是什么,并使用
QuickWatch
验证
单元格[1,1]
中的数据(如果有)。