上善若静水

while(effort=true){success++;}

   :: 首页 :: 联系 :: 聚合  :: 管理
  9 Posts :: 10 Stories :: 11 Comments :: 0 Trackbacks

留言簿(1)

搜索

  •  

积分与排名

  • 积分 - 41860
  • 排名 - 515

最新随笔

最新评论

阅读排行榜

评论排行榜

实现:从SQLite导出一个表的数据到Excelxls文件中

环境: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进程就可以自动关闭了。

posted on 2009-07-21 09:41 上善若静水 阅读(2865) 评论(0)  编辑 收藏 引用 所属分类: 知识点滴

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理