VC6.0实现读取Excel数据的方法

 更新时间:2014年07月25日 16:01:57   投稿:shichen2014  
这篇文章主要介绍了VC6.0实现读取Excel数据的方法,非常实用的功能,需要的朋友可以参考下

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进程会自动结束。

补充:本文所述程序实例完整源码点此下载

相关文章

  • C++使用jsoncpp解析json的方法示例

    C++使用jsoncpp解析json的方法示例

    这篇文章主要介绍了C++使用jsoncpp解析json的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Qt实现文本编辑器(一)

    Qt实现文本编辑器(一)

    在Qt中QMainWindow是一个为用户提供主窗口程序的类,包含了:菜单栏、工具栏、锚接部件、状态栏以及一个中部件。本文将利用QMainWindow制作一个文本编辑器,感兴趣的可以试一试
    2022-01-01
  • C语言中经socket接收数据的相关函数详解

    C语言中经socket接收数据的相关函数详解

    这篇文章主要介绍了C语言中经socket接收数据的相关函数详解,分别为recv()函数和recvfrom()函数以及recvmsg()函数的使用,需要的朋友可以参考下
    2015-09-09
  • 最长公共子字符串的使用分析

    最长公共子字符串的使用分析

    本篇文章是对最长公共子字符串的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++11线程、互斥量以及条件变量示例详解

    C++11线程、互斥量以及条件变量示例详解

    这篇文章主要介绍了C++11线程、互斥量以及条件变量,C++11增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写多线程程序的可移植性得到了很大的提高,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • C语言实现简易通讯录完整流程

    C语言实现简易通讯录完整流程

    这篇文章主要为大家介绍了C语言实现简易通讯录的完整流程,每个环节都有完整代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • 使用C语言实现扫雷小游戏

    使用C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了使用C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++实现旋转数组的二分查找

    C++实现旋转数组的二分查找

    这篇文章主要介绍了C++实现旋转数组的二分查找方法,涉及数组的操作,有值得借鉴的技巧,需要的朋友可以参考下
    2014-09-09
  • Qt实现电子时钟的示例代码

    Qt实现电子时钟的示例代码

    这篇文章主要为大家详细介绍了如何利用Qt实现显示与桌面上并可以随意拖拽至桌面任意位置的电子时钟案例,感兴趣的小伙伴可以尝试一下
    2022-06-06
  • C++11 condition_variable条件变量的用法说明

    C++11 condition_variable条件变量的用法说明

    这篇文章主要介绍了C++11 condition_variable条件变量的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论