导入Excel时,Excel进程excel.exe不能自动结束的问题

本文介绍了一种解决使用COM接口导出Excel时进程无法自动关闭的问题。通过正确释放资源和对象引用,确保了Excel进程在导出完成后能够正常退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:实现导出到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

导入Excel时,Excel进程excel.exe不能自动结束的问题 - kogu - kogu的博客exlsheet = exlSheets.Add(vOptional, vOptional, COleVariant(long(5)), vOptional);
导入Excel时,Excel进程excel.exe不能自动结束的问题 - kogu - kogu的博客    exlsheet.ReleaseDispatch();
导入Excel时,Excel进程excel.exe不能自动结束的问题 - kogu - kogu的博客

进行如上操作后

发现执行完此函数后,Excel.exe进程就可以自动关闭了。

来源:http://www.cppblog.com/cctoqh/articles/90692.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值