如何释放 Excel 对象
How to release an Excel Object
在我下面的代码中,我有一个注释掉的 foreach 循环,除了它不会释放 excel 对象之外,它还可以工作,因为背景枚举。所以我试图将它转换为 for 循环,但直到此时我已经避免了 'for' 循环并且我似乎无法让我的工作。我只是指出我知道它坏了。
我确实注释掉了损坏的 'for' 循环,它运行并按预期工作,除了我无法释放 excel 对象...
我的问题是,我尝试了很多不同的例子,但我无法从我的任务管理器中释放 excel 对象,它在后台保持打开状态。
- 我使用“一点”规则
- 我正在使用 try/final
- 我尝试了很多不同的Marshal.ReleaseComOjbect(obj),示例来自网络
- 我正在使用 'for loop'(不是 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();
不看评论的小伙伴'such as myself'
我有一个 EndOfRow() 函数,我没有做任何清理来释放对象。我创建这个函数的时候并不知道释放对象,我忘记了。在一个简单的疏忽上花费了很多时间。
遗漏 Quit() 也是我多次尝试解决我的问题时的疏忽,但这不是主要问题,EndOfRow() 是...
所以我学到的是在使用完后立即释放对象 excel。
谢谢特里
在我下面的代码中,我有一个注释掉的 foreach 循环,除了它不会释放 excel 对象之外,它还可以工作,因为背景枚举。所以我试图将它转换为 for 循环,但直到此时我已经避免了 'for' 循环并且我似乎无法让我的工作。我只是指出我知道它坏了。
我确实注释掉了损坏的 'for' 循环,它运行并按预期工作,除了我无法释放 excel 对象... 我的问题是,我尝试了很多不同的例子,但我无法从我的任务管理器中释放 excel 对象,它在后台保持打开状态。
- 我使用“一点”规则
- 我正在使用 try/final
- 我尝试了很多不同的Marshal.ReleaseComOjbect(obj),示例来自网络
- 我正在使用 'for loop'(不是 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();
不看评论的小伙伴'such as myself'
我有一个 EndOfRow() 函数,我没有做任何清理来释放对象。我创建这个函数的时候并不知道释放对象,我忘记了。在一个简单的疏忽上花费了很多时间。
遗漏 Quit() 也是我多次尝试解决我的问题时的疏忽,但这不是主要问题,EndOfRow() 是...
所以我学到的是在使用完后立即释放对象 excel。
谢谢特里