MFC读取Excel例子2(OLE/COM)

来源:互联网 发布:泛海三江300主机编程 编辑:程序博客网 时间:2024/06/05 18:52
原文链接:http://blog.sina.com.cn/s/blog_71265dc90101b3wj.html
1.       首先要将excel类添加到工程中。
在ClassWizard中,【AddClass】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),添加必要的几个类:
// 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[i].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进程会自动结束。