各位大侠:烦请帮忙:
我需要将excel文件里面的内容读出来然后导出到别的一个自定义的数据库中,但是操作完成以后,进程中总有一个excel的进程,虽然已经不占用CPU了,但是占用的内存不会自己释放,而且,因为程序使用了excel,程序本身的内存也不断的增大,虽然程序退出以后,这部分内存可以释放,但是如果用户连续操作,内存占用将会非常大,况且,那个讨厌的excel进程还在。大致代码如下:
我需要将excel文件里面的内容读出来然后导出到别的一个自定义的数据库中,但是操作完成以后,进程中总有一个excel的进程,虽然已经不占用CPU了,但是占用的内存不会自己释放,而且,因为程序使用了excel,程序本身的内存也不断的增大,虽然程序退出以后,这部分内存可以释放,但是如果用户连续操作,内存占用将会非常大,况且,那个讨厌的excel进程还在。大致代码如下:
_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进程的办法,我想彻底解决好这个问题,肯定各位大侠帮忙,谢谢,定高分重谢
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
//退出程序
Excelapp.Quit();//将此语句放置于实例资源释放前
Excelapp.ReleaseDispatch();
app.Quit();// 退出
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
UpdateData(FALSE);楼主准备结贴把