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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Excel导入到DataGridView后,我们可以通过以下方式来结束导入进程: 1. 取消导入:如果在导入过程中发现出现错误或需要取消导入,可以提供一个“取消”按钮,点击该按钮,可以调用DataGridView的CancelEdit()方法来取消正在进行的编辑操作,并退出当前的导入进程。 2. 强制结束:如果导入过程中出现了意外情况,例如程序异常或导入进程卡死,可以通过强制结束程序来终止导入进程。在Windows操作系统中,可以按下Ctrl + Alt + Delete组合键,选择任务管理器,找到相关的Excel进程并强制结束。 3. 添加导入进度监控:为了及了解导入进程的状态,可以在导入过程中添加一个进度条或状态指示器,显示当前导入的进度。当导入完成或需要提前结束导入,可以提供一个“完成”或“结束”按钮,点击该按钮,可以调用DataGridView的EndEdit()方法来结束编辑操作,并退出当前的导入进程。 4. 手动停止:在导入过程中,可以给用户提供一个手动停止的选项,当用户觉得导入已经完成或需要结束导入,可以点击该选项,然后调用DataGridView的EndEdit()方法来结束编辑操作,并退出当前的导入进程。 无论采用哪种方式,都应该同检查和处理导入过程中可能发生的异常,例如处理Excel文件不存在或格式错误的情况,以确保导入进程能够顺利结束,且数据能够正确地显示在DataGridView中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值