MFC 读取EXCEL中数据[通俗易懂]

MFC 读取EXCEL中数据[通俗易懂]MFC读取Excel例子(2013-01-1200:04:24)转载▼标签:365mfcit分类:MFC-office操作1.       首先要将excel类添加到工程中。在ClassWizard中,【AddClass】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel

大家好,又见面了,我是你们的朋友全栈君。

MFC读取Excel例子

(2013-01-12 00:04:24)

标签:

365

mfc

it

分类: MFC-office操作
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进程会自动结束。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148367.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql executenonquery_ExecuteNonQuery()返回值注意点

    mysql executenonquery_ExecuteNonQuery()返回值注意点查询某个表中是否有数据的时候,我用了ExecuteNonQuery(),并通过判断值是否大于0来判断数据的存在与否。结果与我所设想的很不一致,调试时才发现,其执行后返回的结果是-1,对此我很是不理解,回头查了下资料,如下显示:SqlCommand.ExecuteNonQuery方法对连接执行Transact-SQL语句并返回受影响的行数。备注:可以使用ExecuteNonQuery来…

    2022年9月12日
  • vector>初始化_电脑初始化出现问题

    vector>初始化_电脑初始化出现问题1、默认初始化,vector为空,size为0,未开辟空间,可通过push_back()添加元素。vector&lt;int&gt;v;v.push_back(10);2、默认初始化,指定vector大小,元素初始值默认为0,元素增多时,同样可以通过push_back()来改变vector大小以增加元素。vector&lt;int&gt;v(5)3、指定初始化元素值为2…

    2022年9月18日
  • RxJava 操作符flatmap

    RxJava 操作符flatmap有如下场景:在前段调用后端的API时,经常会出现回调嵌套的情况。假设我们有两个API,queryA和queryB.并且queryB的运行依赖于queryA的结果。那么我们的程序在一般的情况下可能是这个样子。想象有如下的代码:是不是感觉非常不舒服?假如嵌套的API再多几层,那么这将是个灾难。一个人开发的时候可能不觉得有什么问题,但是可以想象做codereview或者新入项目组的同事

    2022年6月4日
  • windows 多线程_关于多线程的技术分享

    windows 多线程_关于多线程的技术分享本文内容较为详细,关于更简短的一篇介绍,请看这里:https://blog.csdn.net/weixin_45525272/article/details/105057120多线程同步技术在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进…

    2022年8月18日
  • BGP与Anycast

    BGP与AnycastBGP属于一项技术,一般应用于IDC多线机房,也就是把接入到机房的多条线路融合为一体。实现多线单IP。因为最早的多线机房都是双线双IP,现在很多双线机房开始利用该技术,让用户使用IP的时候操作更简单些Anycast技术具有以下优势:一、不同客户端将访问不同目的主机,此过程对客户端透明,从而实现了目的主机的负载均衡;二、当任意目的主机接入的网络出现故障,导致该目的主机不可达…

    2022年5月24日
  • PyCharm安装配置谷歌浏览器驱动[通俗易懂]

    PyCharm安装配置谷歌浏览器驱动[通俗易懂]PyCharm配置安装Chorme驱动下载驱动查看Chorme的版本这是我的谷歌浏览器版本去网站下载对应的驱动软件下载后进入下载的目录,解压然后把这个文件放入Python的Scripts文件夹(首先你的Python环境变量已经配置过)驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.html安装驱动进入设置,按照步骤点击安装selenium包然后会出现安装进程,添加完成之后开始测试驱动测试驱动创建一个Pyth

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号