• C++读取Excel 精华


    <pre name="code" class="cpp">Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法。具体步骤如下:
    1.首先要将excel类添加到工程中。
    
    在ClassWizard中,【Add Class】,在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进程会自动结束。
    
    
    
    


    
       
    
    
  • 相关阅读:
    linux安装maven
    Jenkins 改成中文语言显示
    appium怎么按下系统按键?如按下返回键、home键等等
    Jenkins+TestNG+gitlab+maven持续集成
    问题一:使用AndroidDriver而非原来的AppiumDriver的原因
    appium教程
    问题二:appium 搞定权限弹框的一个小办法
    问题三:Appium 的 UIAutomator2 模式下使用 sendKeys 出现错误
    TestNG执行顺序控制
    idea Mac 快捷键
  • 原文地址:https://www.cnblogs.com/zztong/p/6695277.html
Copyright © 2020-2023  润新知