各位大侠:烦请帮忙:
    我需要将excel文件里面的内容读出来然后导出到别的一个自定义的数据库中,但是操作完成以后,进程中总有一个excel的进程,虽然已经不占用CPU了,但是占用的内存不会自己释放,而且,因为程序使用了excel,程序本身的内存也不断的增大,虽然程序退出以后,这部分内存可以释放,但是如果用户连续操作,内存占用将会非常大,况且,那个讨厌的excel进程还在。大致代码如下:

解决方案 »

  1.   

    对不起,刚才发帖没有发完整大致代码如下:
    _Application ExcelApp; 
    Workbooks wbsMyBooks; 
    _Workbook wbMyBook; 
    Worksheets wssMysheets; 
    _Worksheet wsMysheet;
    Range rgMyRge;
    //Range rgMyRgeTem; //创建Excel 2000服务器(启动Excel) 
    if (!ExcelApp.CreateDispatch("Excel.Application",NULL)) 

    AfxMessageBox("创建Excel服务失败!");  return ;

    ExcelApp.SetVisible(false); 
    //ExcelApp.SetUserControl(false);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      
    wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); 
    wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(m_strExcelPath)));
    //得到Worksheets 
    wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true); //CString strSheetTem;
    //CString strNameTem;
    //设置单元格的值 
    CString strTem;
    CString strValueTem;
    CString strValue; //利用for循环将实体要素名称(等同于sheet表名称)列出,一一选择sheet作为操作目标
    //注:实体要素名称中的括号等符号,中英文状态必须相同才可以
    for (int i =0;i<m_GddEntityArray.GetSize();i++)
    {
    //AfxMessageBox(m_GddEntityArray[i].strTableName);
    wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t(m_GddEntityArray[i].strTableName)),true);
    rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
    //打开了具体的某一标签页
    CString strInsertValue,strInsertValueTem; int n =4;
    while (n)
    {
    strInsertValue = "";
    //因为建立列表的时候有Entity_ID字段,但是读出来的数据里面没有该数据,所有全部默认为空
    strInsertValueTem = "''";
    strValue = "";
    for(int j=0;j<m_GddEntityArray[i].nAttributeNames;j++)
    {

    CString strItem;
    strItem = rgMyRge.GetItem(_variant_t((long)n),_variant_t((long)j+1));
    strValue.Format("'%s'",strItem); 
    strValueTem = rgMyRge.GetItem(_variant_t((long)n),_variant_t((long)1));
    if (strValueTem.IsEmpty())
    {
    //rgMyRge.ReleaseDispatch();
    //wsMysheet.ReleaseDispatch();
    goto BreakWhile;
    }
    //因为建立列表的时候有Entity_ID字段,但是读出来的数据里面没有该数据,所有全部默认为空
    strInsertValueTem += "," + strValue;   
    } //整个标签页的字段已经匹配完毕,准备插入语句
    //strSqlTem.Format("insert into UnitTable values('%s', '%s', '', '是');",
    strInsertValue.Format("INSERT INTO [%s] VALUES (%s);",m_GddEntityArray[i].strTableName,strInsertValueTem);
    //AfxMessageBox(strInsertValue);
    m_DBgcd.execDML(strInsertValue);
    n++;
    }
    BreakWhile:;
    //rgMyRge.ReleaseDispatch();
        }
    //释放对象 
    ExcelApp.Quit(); 
        
    rgMyRge.ReleaseDispatch();
    wsMysheet.ReleaseDispatch();
    wssMysheets.ReleaseDispatch(); 
    wbMyBook.ReleaseDispatch(); 
    wbsMyBooks.ReleaseDispatch(); 
    ExcelApp.ReleaseDispatch();我使用了的excel的变量都释放了,但是还会有excel进程在任务管理器中,而且占用内存不释放,如果去掉
    strItem = rgMyRge.GetItem(_variant_t((long)n),_variant_t((long)j+1);
    strValueTem = rgMyRge.GetItem(_variant_t((long)n),_variant_t((long)1));
    如果去掉这两句使用了rgMyRge.GetItem()的语句,就可以正常释放excel的内存,安全退出了,但是我又必须要获取单元格的内容,请问各位大侠,该怎么办呢?
    我也试过释放资源之前将文件保存,也不行,请不要说那种枚举进程然后杀掉excel进程的办法,我想彻底解决好这个问题,肯定各位大侠帮忙,谢谢,定高分重谢
      

  2.   

            rgMyRge.ReleaseDispatch();
    wsMysheet.ReleaseDispatch();
    wssMysheets.ReleaseDispatch();
    wbMyBook.ReleaseDispatch();
    wbsMyBooks.ReleaseDispatch();
    //退出程序
    Excelapp.Quit();//将此语句放置于实例资源释放前
    Excelapp.ReleaseDispatch();
      

  3.   

    books.Close();   
    app.Quit();// 退出   
    //释放对象     
    range.ReleaseDispatch();  
    sheet.ReleaseDispatch();  
    sheets.ReleaseDispatch();  
    book.ReleaseDispatch();  
    books.ReleaseDispatch();  
    app.ReleaseDispatch();  
    UpdateData(FALSE);楼主准备结贴把