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)


相关推荐

  • 有很多种方法来解决八数码

    有很多种方法来解决八数码

    2021年12月31日
  • 手机兼容性测试_浏览器兼容性测试工具

    手机兼容性测试_浏览器兼容性测试工具AndroidApp兼容性测试,是一个比较重要的App评价内容说到测试阶段,兼容性测试主要是对App在各类机型上的兼容、适配等情况进行测试。搞清楚这一阶段的测试重点后,因此,AndroidApp在进行兼容性测试前,一定要做好其前序测试内容,否则兼容性测试效果将会较差。1.机型配置问题Android兼容测试一定要做到宽范围覆盖,如果做不到这个,那么就违背了兼容性测试的目标——测试App在各类机型、系统上的运行是否兼容、适配。因此,兼容性测试必须要在各个机型、系统上对App进行运行、测.

    2022年10月26日
  • mysql子查询和连接查询(大数据联合计算)

    大圣网络2017-01-3109:19连接查询连接查询:将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表.连接查询:join,使用方式:左表join右表;左表:在join关键字左边的表;右表:在join关键字右边的表连接查询分类:SQL中将连接查询分成

  • IMG镜像写盘工具physdiskwrite,用于MikroTik RouterOS的安装(Windows)

    IMG镜像写盘工具physdiskwrite,用于MikroTik RouterOS的安装(Windows)常用img的备份:1、linux下使用dd,Windows下使用WinImage2、或者还有很多,比如再生龙等等。img还原:1、Win32DiskImager2、physdiskwritephysdiskwrite的简单使用:physdiskwrite.exe-uusb.img出现如下提示:千万不要选错了盘。软件参数:…

    2022年10月29日
  • Mysql慢查询_mysql并发查询慢

    Mysql慢查询_mysql并发查询慢慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数…

  • hadoop生态圈各个组件简介

    hadoop生态圈各个组件简介1,HDFS(hadoop分布式文件系统)是hadoop体系中数据存储管理的基础。他是一个高度容错的系统,能检测和应对硬件故障。client:切分文件,访问HDFS,与那么弄得交互,获取文件位置信息,与DataNode交互,读取和写入数据。namenode:master节点,在hadoop1.x中只有一个,管理HDFS的名称空间和数据块映射信息,配置副本…

发表回复

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

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