首页 > 代码库 > 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进程会自动结束。