天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 7|回复: 0

VC操作EXCEL

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    VC提供了操作EXCEL的COM。这个接口是统一的。安装了EXCEL就可以通过OFFICE自带的接口使用

    先要了解EXCEL中的几个概念:BOOK、SHEET、CELL

    1.        首先要将excel类添加到工程中。
    在ClassWizard中,【Add Class】,在Excel的安装目录找到Excel.exe(Microsoft2003,2007都是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[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进程会自动结束。

     

     

     

     

    VC操作EXCEL
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:18 , Processed in 0.066420 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表