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