使用 Excel COM 创建后关闭 Excel 进程
Closing Excel process after creating using Excel COM
下面的代码创建了一个损坏的 file/read-only excel csv 文件,因此我无法打开该文件以在其中写入数据。我需要从 csv file
中读取数据,然后将其保存到 excel 文件中以绘制图表。我可以知道代码有什么问题吗?因为每次我想删除生成的文件时,即使我关闭了它,它仍然在 运行 中。每次都得去任务管理器强行关闭进程然后才能删除文件
我几乎尝试了此 link 中提供的所有解决方案,但没有解决我的问题。我想尝试 using
,但我不知道我必须做出哪些改变,所以这是我迄今为止唯一没有尝试过的东西。
Excel.WorkBook xlWorkBook;
...
public void createXMLFile()
{
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("Excel is not properly installed!!");
return;
}
object misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "Stroke";
xlWorkSheet.Cells[1, 2] = "Force";
xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, AccessMode: Excel.XlSaveAsAccessMode.xlExclusive);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
MessageBox.Show("Excel file created , you can find the file
D:\Work\ExtractData\DataCharts");
}
试试这个方法…
Microsoft.Office.Interop.Excel.Application xlApp = null;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook = null;
try {
// code that works with excel…
}
catch (Exception ex) {
MessageBox.Show("Excel Error " + ex.Message);
}
finally {
if (xlWorkBook != null) {
xlWorkBook.Close();
Marshal.ReleaseComObject(xlWorkBook);
}
if (xlApp != null) {
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
}
//GC.Collect();
}
编辑……根据 OP 评论……
我猜您可能误解了任务管理器发布的内容。对于初学者,.NET 使用垃圾收集器来管理其未使用的内存。如果你想“立即”摆脱任务管理器中似乎挥之不去的 Excel 的乘法实例,可以直接调用 .NET 垃圾收集器,例如......
GC.Collect();
但是……我不推荐这个。
如果您退出应用程序,那么所有实例都将被释放。如果应用程序继续 运行,那么通常至少会保留一个 Excel 实例。但是,当应用程序正在 运行ning 时...如果应用程序已经有足够的内存,垃圾收集器通常不会从应用程序释放此内存,这是有道理的。
因此,即使它仍然出现在任务管理器中,但如果到了紧要关头并且某些东西需要内存,它就会释放它。这里就是这种情况。当然可能有很多 Excel 运行ning 的实例......如果你 运行 代码多次而不退出应用程序...... Excel 应用程序将“最终”被释放。在我的测试中,通常在大约 10-20 个应用程序 运行ning 之后,它们都会全部发布,并且会下降到一两个 Excel 实例。然后它会再次生长。这是垃圾收集器的工作。
调用上面垃圾收集器的 Collect
代码将根据需要“立即”释放应用程序,但是,我要说的是要小心。不建议您这样做。所以,我说在这里选择你自己的毒药。
下面的代码创建了一个损坏的 file/read-only excel csv 文件,因此我无法打开该文件以在其中写入数据。我需要从 csv file
中读取数据,然后将其保存到 excel 文件中以绘制图表。我可以知道代码有什么问题吗?因为每次我想删除生成的文件时,即使我关闭了它,它仍然在 运行 中。每次都得去任务管理器强行关闭进程然后才能删除文件
我几乎尝试了此 link 中提供的所有解决方案,但没有解决我的问题。我想尝试 using
,但我不知道我必须做出哪些改变,所以这是我迄今为止唯一没有尝试过的东西。
Excel.WorkBook xlWorkBook;
...
public void createXMLFile()
{
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("Excel is not properly installed!!");
return;
}
object misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "Stroke";
xlWorkSheet.Cells[1, 2] = "Force";
xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, AccessMode: Excel.XlSaveAsAccessMode.xlExclusive);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
MessageBox.Show("Excel file created , you can find the file
D:\Work\ExtractData\DataCharts");
}
试试这个方法…
Microsoft.Office.Interop.Excel.Application xlApp = null;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook = null;
try {
// code that works with excel…
}
catch (Exception ex) {
MessageBox.Show("Excel Error " + ex.Message);
}
finally {
if (xlWorkBook != null) {
xlWorkBook.Close();
Marshal.ReleaseComObject(xlWorkBook);
}
if (xlApp != null) {
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
}
//GC.Collect();
}
编辑……根据 OP 评论……
我猜您可能误解了任务管理器发布的内容。对于初学者,.NET 使用垃圾收集器来管理其未使用的内存。如果你想“立即”摆脱任务管理器中似乎挥之不去的 Excel 的乘法实例,可以直接调用 .NET 垃圾收集器,例如......
GC.Collect();
但是……我不推荐这个。
如果您退出应用程序,那么所有实例都将被释放。如果应用程序继续 运行,那么通常至少会保留一个 Excel 实例。但是,当应用程序正在 运行ning 时...如果应用程序已经有足够的内存,垃圾收集器通常不会从应用程序释放此内存,这是有道理的。
因此,即使它仍然出现在任务管理器中,但如果到了紧要关头并且某些东西需要内存,它就会释放它。这里就是这种情况。当然可能有很多 Excel 运行ning 的实例......如果你 运行 代码多次而不退出应用程序...... Excel 应用程序将“最终”被释放。在我的测试中,通常在大约 10-20 个应用程序 运行ning 之后,它们都会全部发布,并且会下降到一两个 Excel 实例。然后它会再次生长。这是垃圾收集器的工作。
调用上面垃圾收集器的 Collect
代码将根据需要“立即”释放应用程序,但是,我要说的是要小心。不建议您这样做。所以,我说在这里选择你自己的毒药。