问题:实现导出到Excel的时候,程序中会自动创建进程excel.exe,且此进程函数结束时不能自动结束,而是关闭整个应用程序后才能自动结束。
int
CDBToExcelDlg::ImportDataToExcel()
{
int i, j;
_Worksheet exlSheet;
Worksheets exlSheets;
_Workbook exlBook;
Workbooks exlBooks;
_Application exlApp;
// 用exlApp对象创建Excel进程
if ( ! exlApp.CreateDispatch( " Excel.Application " ,NULL))
{
AfxMessageBox( " 创建Excel服务失败! " );
return 0 ;
}
COleVariant vOptional( long (DISP_E_PARAMNOTFOUND), VT_ERROR);
exlBooks = exlApp.GetWorkbooks();
exlBook = exlBooks.Add(vOptional); // 加载EXCEL模板
exlSheets = exlBook.GetSheets(); // 加载Sheet页面
// 删除所有的sheet
for (j = 0 ; j < exlSheets.GetCount(); ++ j)
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.Delete();
}
CString msg;
msg.Format( " %d " , exlSheets.GetCount());
AfxMessageBox(msg);
exlsheet = exlSheets.Add(vOptional, vOptional, COleVariant( long ( 5 )), vOptional);
exlsheet.ReleaseDispatch();
msg.Format( " %d " , exlSheets.GetCount());
AfxMessageBox(msg);
// 删除所有的sheet
for (j = 0 ; j < exlSheets.GetCount(); ++ j)
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.ReleaseDispatch();
}
CString strExcelPath = m_strExcelPath;
strExcelPath.Replace( " \\\\ " , " \\ " );
// 保存excel文件
exlBook.SaveAs(COleVariant(strExcelPath), vOptional,
vOptional, vOptional, vOptional,
vOptional, ( long ) 0 , vOptional, vOptional,
vOptional, vOptional, vOptional);
exlSheets.ReleaseDispatch();
exlBook.Close(COleVariant( long ( 0 )), vOptional, vOptional);
exlBook.ReleaseDispatch();
exlBooks.Close();
exlBooks.ReleaseDispatch();
// 退出excel程序
exlApp.Quit();
exlApp.ReleaseDispatch();
return 1 ;
}
{
int i, j;
_Worksheet exlSheet;
Worksheets exlSheets;
_Workbook exlBook;
Workbooks exlBooks;
_Application exlApp;
// 用exlApp对象创建Excel进程
if ( ! exlApp.CreateDispatch( " Excel.Application " ,NULL))
{
AfxMessageBox( " 创建Excel服务失败! " );
return 0 ;
}
COleVariant vOptional( long (DISP_E_PARAMNOTFOUND), VT_ERROR);
exlBooks = exlApp.GetWorkbooks();
exlBook = exlBooks.Add(vOptional); // 加载EXCEL模板
exlSheets = exlBook.GetSheets(); // 加载Sheet页面
// 删除所有的sheet
for (j = 0 ; j < exlSheets.GetCount(); ++ j)
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.Delete();
}
CString msg;
msg.Format( " %d " , exlSheets.GetCount());
AfxMessageBox(msg);
exlsheet = exlSheets.Add(vOptional, vOptional, COleVariant( long ( 5 )), vOptional);
exlsheet.ReleaseDispatch();
msg.Format( " %d " , exlSheets.GetCount());
AfxMessageBox(msg);
// 删除所有的sheet
for (j = 0 ; j < exlSheets.GetCount(); ++ j)
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.ReleaseDispatch();
}
CString strExcelPath = m_strExcelPath;
strExcelPath.Replace( " \\\\ " , " \\ " );
// 保存excel文件
exlBook.SaveAs(COleVariant(strExcelPath), vOptional,
vOptional, vOptional, vOptional,
vOptional, ( long ) 0 , vOptional, vOptional,
vOptional, vOptional, vOptional);
exlSheets.ReleaseDispatch();
exlBook.Close(COleVariant( long ( 0 )), vOptional, vOptional);
exlBook.ReleaseDispatch();
exlBooks.Close();
exlBooks.ReleaseDispatch();
// 退出excel程序
exlApp.Quit();
exlApp.ReleaseDispatch();
return 1 ;
}
开始时不知道是哪条语句有问题,但确定的是哪个对象没有完全的释放。然后就一条一条语句的执行(注释掉其他语句,每个对象有其释放语句),看在执行哪个语句时excel进程没有结束,发现问题出现在
exlSheets.Add(vOptional, vOptional, COleVariant(
long
(
5
)), vOptional);
这条语句。
出现excel.exe的进程不能通过
exlApp.Quit();
exlApp.ReleaseDispatch();
exlApp.ReleaseDispatch();
关闭的原因,是因为添加sheets没有完全被释放,通过
for
(j
=
0
; j
<
exlSheets.GetCount();
++
j)
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.ReleaseDispatch();
}
{
exlSheet = exlSheets.GetItem(COleVariant(( long )(j + 1 )));
exlSheet.ReleaseDispatch();
}
释放所有的sheets,另一个就是获得add函数的返回值,释放返回sheet
exlsheet
=
exlSheets.Add(vOptional, vOptional, COleVariant(
long
(
5
)), vOptional);
exlsheet.ReleaseDispatch();
exlsheet.ReleaseDispatch();
进行如上操作后
发现执行完此函数后,Excel.exe进程就可以自动关闭了。
来源:http://www.cppblog.com/cctoqh/articles/90692.html