实现:从SQLite导出一个表的数据到Excel的xls文件中
环境:VC6.0 Sp6 ,XP SP2
问题:实现导出到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;
}
开始时不知道是哪条语句有问题,但确定的是哪个对象没有完全的释放。然后就一条一条语句的执行(注释掉其他语句,每个对象有其释放语句),看在执行哪个语句时excel进程没有结束,发现问题出现在
exlSheets.Add(vOptional, vOptional, COleVariant(long(5)), vOptional);
这条语句。
出现excel.exe的进程不能通过
exlApp.Quit();
exlApp.ReleaseDispatch();
关闭的原因,是因为添加sheets没有完全被释放,通过
for(j = 0; j < exlSheets.GetCount(); ++j)
{
exlSheet = exlSheets.GetItem(COleVariant((long)(j+1)));
exlSheet.ReleaseDispatch();
}
释放所有的sheets,另一个就是获得add函数的返回值,释放返回sheet
exlsheet = exlSheets.Add(vOptional, vOptional, COleVariant(long(5)), vOptional);
exlsheet.ReleaseDispatch();
进行如上操作后
发现执行完此函数后,Excel.exe进程就可以自动关闭了。