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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 硅谷科技公司ceo_硅谷 码农转行

    硅谷科技公司ceo_硅谷 码农转行一位普通的华人程序员,是如何在美国赤手拼搏二十载,成为全美最佳雇主,为三分之一的世界500强企业提供视频会议服务。

    2022年10月11日
  • 控件anchor和dock属性_控件的常用属性

    控件anchor和dock属性_控件的常用属性在设计窗体时,这两个属性特别有用,如果用户认为改变窗口的大小并不容易,应确保窗口看起来显示的不是那么乱,并编写很多代码来实现这个效果,许多程序解决这个问题都是禁止给窗口重新设置大小这显然是解决问题的最简单的方法,但不是最好的方法,因此引入了Anchor和Dock属性。1、Anchor属性用于指定在用户重新设置窗口的大小时控件应该如何响应,可以指定如果控件重新设置了大小,就根据控件的边界去锁

  • Spring的两种动态代理Jdk与Cglib

    Spring的两种动态代理Jdk与CglibSpring的两种动态代理Jdk与Cglib

  • laravel微信自定义分享

    laravel微信自定义分享

    2021年10月28日
  • Android面试题之Activity篇

    Android面试题之Activity篇Activity篇目录前言一、Activity1、什么是Activity?2、请描述一下Activity生命周期3、请描述一下Activity的四个状态4、两个Activity之间传递数据,除了intent,广播接收者,contentprovider还有啥?5、Android中的Context,Activity,Appliction有什么区别?6、Context是什么?7、如何保存Activity的状态?8、横竖屏切换时Activity的生命周期9、两个Activity

  • 关于安装busybox问题

    关于安装busybox问题我的手机是小米5安装busybox1.首先要手机要root2.然后下载busybox安装器(这个容易找)3.解锁system分区(可以下载syslock,这软件可以解锁system文件)点击下载syslock如果不下载system,会安装失败;4.解锁重启后就可以安装了…

发表回复

您的电子邮箱地址不会被公开。

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