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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一个低级的ORA-01017错误

    一个低级的ORA-01017错误事件缘由:使用sys账户创建了一个数据清理的存储过程,再创建一个Oraclejob定时运行这个存储过程,用于做表数据的清理。第二天看表数据未删除,说明job执行有错,打算使用sys账号登录查看job运行情况,反复输入sys账户信息,总提示ORA-01017,1.尝试改sys用户密码,重试报错依旧。2.使用sys登录GC,报错相同。使用普通用户登录正常。3.数据库服务器上使用sq

    2022年6月1日
    35
  • 计算机等级二级java试题(计算机考试选择题知识点)

    第一章数据结构与算法【考点1】算法的基本概念1、算法:是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。2、算法的基本特征:1)确定性,算法中每一步骤都必须有明确定义,不允许有多义性;2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止;3)可行性,算法原则上能够精确地执行;4)拥有足够的情报。3、算法的组成…

    2022年4月13日
    49
  • CentOS7 添加FTP用户并设置权限

    CentOS7 添加FTP用户并设置权限

    2021年10月19日
    41
  • vue中解决跨域问题_js跨域解决方案

    vue中解决跨域问题_js跨域解决方案如果你是一个Web前端工程师,那么跨域这个问题肯定是绕不开的!1.创建vue.config.js设置devServer属性module.exports={devServer:{//webpack-dev-server配置host:’localhost’,port:8080,//配置本项目运行端口proxy:{…

    2022年9月17日
    0
  • Objective-C的对象模型和runtime机制「建议收藏」

    Objective-C的对象模型和runtime机制

    2022年2月5日
    42
  • 周末日记

    周末日记书上说人要长大三次第一次是在发现自己不是世界中心的时候第二次是在发现即使再怎么努力终究还是有些事令人无能为力的时候第三次是在明知道有些事可能会无能为力但还是会尽力争取的时候

    2022年6月4日
    38

发表回复

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

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