vc对Excel

现在对Excel的操作越来越流行,可能还有对表格的格式进行修改等复杂的操作,这里只说明读取Excel文件的方法(这里以2003为例)。
 
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进程会自动结束。

首先,我们要明白的是,VC是通过ODBC来访问Excel表格的,也就是说,VC将Excel表格,当作数据库来处理。当然了,也可以通过读以tab键隔开的文件来处理这样的文件,但是,我还是更加愿意用读取数据库的方式来访问Excel表格。
第二,既然是数据库,那么,就需要建立一个与该库对应的dsn,这个,而且,在建立dsn之前,首先要确定,已经安装了Excel的驱动。
第三,要访问数据库中的表格,就要先打开该表格,如此,就需要一个与之对应的RecordSet。如此,有如下代码:
void CRWExcel::ReadFromExcel() 
{
      CDatabase database;
      CString sSql;
      CString sItem1, sItem2;
      CString sDriver;
      CString sDsn;
      CString sFile = "Demo.xls";// 将被读取的Excel文件名
                                     
    // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
      sDriver = GetExcelDriver();
      if (sDriver.IsEmpty())
      {
          // 没有发现Excel驱动
          AfxMessageBox("没有安装Excel驱动!");
          return;
      }
      // 创建进行存取的字符串
      sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);

      TRY
      {
// 打开数据库,建立与这个Excel对应的Database
          database.Open(NULL, false, false, sDsn);
          CRecordset recset(&database);
// 设置读取的查询语句.demo.xls并非文件名,需要在excel中进行//设置,具体文章最后有讲
          sSql = "SELECT Age, Name FROM DEMO.XLS";
      // 执行查询语句,打开表格
          recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
          // 获取查询结果
          while (!recset.IsEOF())
          {
              //读取Excel内部数值
              recset.GetFieldValue("Name ", sItem1);
              recset.GetFieldValue("Age", sItem2);
              // 移到下一行
              recset.MoveNext();
          }
          // 关闭数据库
          database.Close();
      }
      CATCH(CDBException, e)
      {
          // 数据库操作产生异常时...
          AfxMessageBox("数据库错误: " + e->m_strError);
      }
      END_CATCH;
}
需要注意的是,我们对我们的Excel表格需要进行一些处理,需要先选定我们要读取的数据,之后,选择插入>>名字>>之后,在输入框中输入我们在select语句中用到的表名。第二,需要设置列名,为我们选定部分的最前面的一行的数据。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值