码迷,mamicode.com
首页 > 其他好文 > 详细

MFC 操作excel 读写 感悟

时间:2014-06-17 15:07:47      阅读:681      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   ext   color   

       在项目实现中,要操作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进程会自动结束。

 

 

  

 

      

 

 

 

MFC 操作excel 读写 感悟,布布扣,bubuko.com

MFC 操作excel 读写 感悟

标签:style   class   blog   code   ext   color   

原文地址:http://www.cnblogs.com/huanziaixiaojiang/p/3792378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!