我目前正在尝试将.xls中的图表/图表作为图像发送电子邮件。
我可以让图表/图表发送电子邮件。
我的问题是,当我查看任务管理器时,有一个" EXCEL.EXE"我打电话给xlApp.quit()
任何帮助都将不胜感激。
这是我目前使用的代码。
Excel.Application xlApp;
Excel.Workbooks xlBooks;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.ChartObject xlChartObject;
Excel.Chart xlChart;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlBooks = xlApp.Workbooks;
xlWorkBook = xlBooks.Add(Properties.Settings.Default.FileToSend);
xlWorkSheet = xlWorkBook.Sheets[1];
xlWorkSheet.EnablePivotTable = true;
string filename = System.IO.Path.GetTempFileName();
xlChartObject = xlWorkSheet.ChartObjects(1);
xlChart = xlChartObject.Chart;
xlChart.Export(filename + ".gif");
xlWorkBook.Close(false, misValue, misValue);
xlBooks.Close();
xlApp.Application.Quit();
if (xlChart != null)
Marshal.ReleaseComObject(xlChart); xlChart = null;
if (xlChartObject != null)
Marshal.ReleaseComObject(xlChartObject); xlChartObject = null;
if (xlWorkSheet != null)
Marshal.ReleaseComObject(xlWorkSheet); xlWorkSheet = null;
if (xlWorkBook != null)
Marshal.ReleaseComObject(xlWorkBook); xlWorkBook = null;
if (xlBooks != null)
Marshal.ReleaseComObject(xlBooks); xlBooks = null;
if (xlApp != null)
Marshal.ReleaseComObject(xlApp); xlApp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
确定编辑了我的代码但仍然没有关闭excel。 但是当我退出程序时它确实会死掉。
由于
答案 0 :(得分:0)
您需要释放您使用的每个对象。
似乎xlApp.Workbooks
未被释放使用。
作为旁注,也可能是因为有异常,因此错过了清理代码。
使用try/catch/finally
尝试使用以下内容:
Excel.Application xlApp = null;
Excel.Workbook xlWorkBook = null;
Excel.Workbooks xlWorkBooks = null;
Excel.Worksheet xlWorkSheet = null;
object misValue = System.Reflection.Missing.Value;
try
{
xlApp = new Excel.Application();
xlWorkBooks = xlApp.Workbooks;
xlWorkBook = xlWorkBooks.Add(Properties.Settings.Default.FileToSend);
xlWorkSheet = xlWorkBook.Sheets[1];
xlWorkSheet.EnablePivotTable = true;
string filename = System.IO.Path.GetTempFileName();
xlWorkSheet.ChartObjects("Chart 1").Chart.Export(filename + ".gif");
xlWorkBook.Close(false, misValue, misValue);
xlApp.Quit();
}
catch(Exception ex)
{
// handle error...
}
finally
{
if (xlWorkSheet != null)
Marshal.ReleaseComObject(xlWorkSheet);
if (xlWorkBook != null)
Marshal.ReleaseComObject(xlWorkBook);
if (xlWorkBooks != null)
Marshal.ReleaseComObject(xlWorkBooks);
if (xlApp != null)
Marshal.ReleaseComObject(xlApp);
}
答案 1 :(得分:0)
尝试添加第二个gc.collect。
GC.Collect();
GC.WaitForPendingFinalizers(); //gc calls finalize on objects
GC.Collect(); //collect objects just finalized
mehow提到实现IDisposable。我也会推荐这个。
答案 2 :(得分:0)
耶终于来了!
搞定了。
我添加了
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
我正在使用EXCEL的功能。
private void runExcelWork()
{
//xlApp, xlBooks, xlWorksheet etc.. Is defined in this function
//Do your work with Excel here.
//Clean all excel objects here.
}
public void runExcel()
{
runExcelWork();
//call GC
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
//at this point EXCEL.EXE closes
}
感谢所有帮助我解决这个问题的人!
我希望其他人觉得这很有用。
答案 3 :(得分:-1)
您是否尝试过以下方面的内容:
xlWorkBook.Close();
xlApp.Application.Quit(false);
xlApp = null;
这应该清理剩余的excel.exe
进程
您可以尝试直接杀死该进程。 (Processname可以是大写字母)
try
{
foreach (var process in Process.GetProcessesByName("excel"))
{
process.Kill();
}
}