分享

用VC读Excel里面的数据

 梦醉千秋 2012-08-02

用VC读Excel里面的数据

来源: 张照亮的日志

今天帮同学读Excel里面的数据,找了好久的资料,然后自己调试,把找的最好的方法贴出来,万一以后谁用到呢!!呵呵

1.        首先要将excel类添加到工程中。
   ( 在基于对话框工程创建过程中,在step 2 of 4中选中Automation)
在ClassWizard中,选中Automation,然后在【Add Class】选择From a type library,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),选中Excel.exe,添加下面必要的几个类:
// Excel应用对象
_Application    m_oExcelApp//(对象名);              // Excel程序
_Worksheet            m_oWorkSheet;     // 工作表
_Workbook            m_oWorkBook;      // 工作簿
Workbooks            m_oWorkBooks;    // 工作簿集合
Worksheets            m_oWorkSheets;    // 工作表集合
Range                   m_oCurrRange;      // 使用区域
添加到工程中的文件是excel.h和excel.cpp。
2.        初始化Com库
if (CoInitialize(NULL)!=0)
{
        AfxMessageBox("初始化COM支持库失败!");
        exit(1);
}
3.        读取文件中的数据
       if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) )
       {
              ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR);
              exit(1);
       }
      
       //设置为显示
       m_oExcelApp.SetVisible(FALSE);
       m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。
      
       LPDISPATCH lpDisp = NULL;
       COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
       Range            oCurCell;

       // 打开文件
       lpDisp = m_oWorkBooks.Open( strFilePath,
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing) );
       // 获得活动的WorkBook( 工作簿 )
       m_oWorkBook.AttachDispatch( lpDisp, TRUE );
       // 获得活动的WorkSheet( 工作表 )
       m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
       // 获得使用的区域Range( 区域 )
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );

       // 获得使用的行数
       long lgUsedRowNum = 0;
       m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
       lgUsedRowNum = m_oCurrRange.GetCount();
       // 获得使用的列数
       long lgUsedColumnNum = 0;
       m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
       lgUsedColumnNum = m_oCurrRange.GetCount();
       // 读取Sheet的名称
       CString strSheetName = m_oWorkSheet.GetName();

       //得到全部Cells,此时,CurrRange是cells的集合
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

       // 遍历整个Excel表格
       CStringArray* arrayStr;
       arrayStr = new CStringArray[lgUsedRowNum];
       for ( int i = 0; i < lgUsedRowNum; )
       {
              for ( int j = 1; j <= lgUsedColumnNum; )
              {
                     oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
                     VARIANT varItemName = oCurCell.GetText();
                     CString strItemName;
                     strItemName = varItemName.bstrVal;
//                  AfxMessageBox( strItemName );
                     // 判断是否是合并的单元格
                     VARIANT varMerge = oCurCell.GetMergeCells();
                     if ( varMerge.boolVal == -1 )
                     {
//                         AfxMessageBox( _T( "是合并的单元格!" ) );
                     }
                     else if ( varMerge.boolVal == 0 )
                     {
//                         AfxMessageBox( _T( "不是合并的单元格!" ) );
                     }

                     arrayStr.Add( strItemName );
                     j++;
              }
              i++;
       }
      
       // 更新列表控件数据
       m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
       m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );

       // 释放二维数组
       delete[] arrayStr;

       // 关闭
       m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), covOptional );
       m_oWorkBooks.Close();
       // 释放
       m_oCurrRange.ReleaseDispatch();
       m_oWorkSheet.ReleaseDispatch();
       m_oWorkSheets.ReleaseDispatch();
       m_oWorkBook.ReleaseDispatch();
       m_oWorkBooks.ReleaseDispatch();
       m_oExcelApp.ReleaseDispatch();
       m_oExcelApp.Quit();    // 这条语句是推出Excel程序,任务管理器中的EXCEL进程会自动结束。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多