首页 > 代码库 > MFC 操作excel 读写 感悟
MFC 操作excel 读写 感悟
在项目实现中,要操作excel 对表格进行读写,或者是将listcontrol控件里面的内容导入到表格中,为此在网上找了很多代码作为参考,但是都没有达到自己想要的效果!
在此,将自己在项目开发中遇到的问题和解决方法一一列出,希望能帮到其他人。
问题1
出现range等类的重定义,报错100多项
出错原因
主要是对于excel类库的多次添加导致,可以将类库删除后,重新添加。注意:在添加类中,应该添加自己需要的类,最好不要将类全部添加,否则程序运行会很慢。
同时,对于excel类库中类的操作,要遵循一定的顺序!如下:
Excel的层次结构:
Application
Workbooks
Workbook
......
Worksheets
Worksheet
......
Range
Font
Borders
......
.......
问题2:
程序针对03excel导入成功,但是针对07excel导入会出错,但是测试发现数据已经全部导入到数据库中
问题原因猜测:
可能是在做类库导入时,导入的是03类库,03不能向上兼容07(在没有安装插件包)。但是07能向下兼容03版本
问题解决思路:
直接针对高版本的office开发,也许会兼容低版本的office。
(结果,等实验完成后再做出结论)
下面是相应代码:
(1) 打开对应的文件
CFileDialog bjdrdlg(TRUE,_T("XLS"),_T("*.xls"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Xls文件(*.xls)|*.xls"); if (bjdrdlg.DoModal()==IDOK) { m_path=bjdrdlg.GetPathName(); UpdateData(false); }
(2) 创建服务
1 CString strFilePath=m_path; 2 _Application m_oExcelApp; // Excel程序 3 _Worksheet m_oWorkSheet; // 工作表 4 _Workbook m_oWorkBook; // 工作簿 5 Workbooks m_oWorkBooks; // 工作簿集合 6 Worksheets m_oWorkSheets; // 工作表集合 7 Range m_oCurrRange; // 使用区域 8 9 10 if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) )11 {12 ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR);13 exit(1);14 }15 16 //设置为显示17 m_oExcelApp.SetVisible(FALSE);18 m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。19 20 LPDISPATCH lpDisp = NULL;21 COleVariant covTrue((short)TRUE);22 COleVariant covFalse((short)FALSE);23 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 24 Range oCurCell;25 26 // 打开文件27 lpDisp = m_oWorkBooks.Open( strFilePath,28 covOptional, covOptional, covOptional, covOptional, covOptional,29 covOptional, covOptional, covOptional, covOptional, covOptional,30 covOptional, covOptional,covOptional, covOptional);31 // 获得活动的WorkBook( 工作簿 )32 m_oWorkBook.AttachDispatch( lpDisp, TRUE );33 // 获得活动的WorkSheet( 工作表 )34 m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );35 // 获得使用的区域Range( 区域 )36 m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );37 38 // 获得使用的行数39 int lgUsedRowNum = 0;40 m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );41 lgUsedRowNum = m_oCurrRange.GetCount();42 // 获得使用的列数43 int lgUsedColumnNum = 0;44 m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );45 lgUsedColumnNum = m_oCurrRange.GetCount();46 // 读取Sheet的名称47 CString strSheetName = m_oWorkSheet.GetName();48 49 //得到全部Cells,此时,CurrRange是cells的集合50 m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );
(3)遍历表格,获取字段信息
oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)1) ).pdispVal, TRUE ); VARIANT area_temp = oCurCell.GetText(); str_area= (LPCTSTR)(_bstr_t)area_temp;
(4)数据库操作
(5) 最后关闭服务,这很关键,如果没有的话,excel进程会一直存在服务中,导致下次程序会出现异常
1 m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), covOptional ); 2 m_oWorkBooks.Close(); 3 // 释放 4 m_oCurrRange.ReleaseDispatch(); 5 m_oWorkSheet.ReleaseDispatch(); 6 m_oWorkSheets.ReleaseDispatch(); 7 m_oWorkBook.ReleaseDispatch(); 8 m_oWorkBooks.ReleaseDispatch(); 9 m_oExcelApp.ReleaseDispatch();10 m_oExcelApp.Quit(); // 这条语句是推出Excel程序,任务管理器中的EXCEL进程会自动结束。