如何解决如何释放Excel对象
在下面的代码中,我注释了一个foreach循环,该循环有效,但由于后台枚举而不会释放excel对象。因此,我试图将其转换为for循环,但是直到这一点为止,我都避免了“ for”循环,而且我似乎无法使我的工作正常。我只是指出我知道它已经坏了。
我确实注释掉了损坏的“ for”循环,该循环可以运行,并且所有工作都按预期进行,但是我无法释放excel对象... 我的问题是,我尝试了许多不同的示例,但无法从任务管理器中释放excel对象,并且该对象在后台仍然处于打开状态。
- 我使用“一个点”规则
- 我正在尝试/决赛
- 我尝试了许多不同的Marshal.ReleaseComOjbect(obj),网上的例子
- 我正在使用“ for循环”(不是foreach循环),因此没有隐藏的Enum对象
谢谢您的帮助和教育
我的代码:
public static List<ExcelObject> listofExcelObjects = new List<ExcelObject>();
public static void txtSearchBar_Changed(object sender,EventArgs e)
{
Excel.Application excel = null;
Excel.Workbooks workbooks = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet worksheet = null;
Excel.Range range = null;
try
{
excel = new Excel.Application();
workbooks = excel.Workbooks;
workbook = workbooks.Open(GlobalObject.filePath,Notify: false,ReadOnly: true);
sheets = workbook.Sheets;
for (int i = 1; i < sheets.Count; i++)
{
worksheet = sheets.Item[i];
if (worksheet.Visible == Excel.XlSheetVisibility.xlSheetVisible)
{
Form_MainForm.thisForm.cmbx_WorkSheet.Items.Add(sheets.Item[i].Name);
if (worksheet.Name == "UNIT FeedER")
{
Form_MainForm.thisForm.cmbx_WorkSheet.Text = worksheet.Name;
worksheet.Select();
Form_MainForm.thisForm.txtBox_StartingRow.Text = $"11";
Form_MainForm.thisForm.txtBox_EndingRow.Text = $"{_Events.EndOfRow()}";
range = worksheet.Range[$"A{Int32.Parse(Form_MainForm.thisForm.txtBox_StartingRow.Text)}",$"A{Int32.Parse(_Events.EndOfRow())}"];
for (int j = 1; j < range.Cells.Count; j++)
{
_Events.listofExcelObjects.Add(new ExcelObject() { FeederNumber = range.Cells.Item[j] });
}
//foreach (Excel.Range j in worksheet.Range[$"A{Form_MainForm.thisForm.txtBox_StartingRow.Text}",$"A{_Events.EndOfRow()}"].Cells)
//{
// _Events.listofExcelObjects.Add(new ExcelObject() { FeederNumber = j.Value });
//}
Form_MainForm.thisForm.Grd_DataGridView.DataSource = _Events.listofExcelObjects;
}
}
}
}
finally
{
releaSEObject(range);
releaSEObject(worksheet);
releaSEObject(sheets);
releaSEObject(workbook);
releaSEObject(workbooks);
releaSEObject(excel);
//Marshal.ReleaseComObject(range);
//Marshal.ReleaseComObject(worksheet);
//Marshal.ReleaseComObject(sheets);
//Marshal.ReleaseComObject(workbook);
//Marshal.ReleaseComObject(workbooks);
//Marshal.ReleaseComObject(excel);
}
}
private static void releaSEObject(object obj)
{
if (obj != null && Marshal.IsComObject(obj))
{
Marshal.ReleaseComObject(obj);
}
obj = null;
}
解决方法
您需要关闭Excel:
excel.Quit();
,
对于那些不阅读评论部分“例如我自己”的人
我有一个函数EndOfRow(),我没有做任何清理来释放对象的功能。创建此函数时,我不知道释放对象,却忘了它。一个简单的监督就花了很多时间。
在我解决许多问题的过程中,遗漏Quit()也是我的疏忽,但这并不是主要问题,EndOfRow()是...
所以我学到的是在使用excel完成后立即释放对象。
谢谢特里
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。