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


相关推荐

  • JavaSE目录

    JavaSE目录跳转到总目录01、版本一:视频教程笔记这个版本是我跟着视频教程做的笔记教程来源:java基础到高级_零基础自学Java–尚硅谷–宋红康教程视频地址:https://www.bilibili.com/video/BV1ny4y1Y7CW名称笔记地址一:Java语言概述二:变量、标识符、保留字、变量三:运算符四:程序流程控制五:数组六:面向对象(上)七:面向对象(下)八:面向对象(中)九:异常十:多线程

    2022年5月25日
    42
  • 如何做文本分析_大数据文本行去重

    如何做文本分析_大数据文本行去重阅读目录1.SimHash与传统hash函数的区别2.SimHash算法思想3.SimHash流程实现4.SimHash签名距离计算5.SimHash存储和索引6.SimHash存储和索引7.参考内容  在之前的两篇博文分别介绍了常用的hash方法([DataStructure&amp;Algorithm]Hash那点事儿)以及局部敏感hash算法([Algorithm]局…

    2022年10月1日
    0
  • ZOJ问题(坑死了)「建议收藏」

    ZOJ问题(坑死了)「建议收藏」ZOJ问题TimeLimit:2000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission

    2022年7月4日
    26
  • &lt;LeetCode OJ&gt; 337. House Robber III

    &lt;LeetCode OJ&gt; 337. House Robber III

    2022年3月5日
    43
  • Android ListView 的简单用法

    Android ListView 的简单用法参考API和《第一行代码》-ListViewisaviewgroupthatdisplaysalistofscrollableitems.ThelistitemsareautomaticallyinsertedtothelistusinganAdapterthatpullscontentfromasourcesuchasan…

    2022年7月22日
    11
  • ext.apply()_函数evaluate的应用

    ext.apply()_函数evaluate的应用转载网址:http://www.cnblogs.com/yin-jingyu/archive/2011/07/30/2122176.htmlapply的用法:    Ext中apply及applyIf方法的应用apply及applyIf方法都是用于实现把一个对象中的属性应用于另外一个对象中,相当于属性拷贝。不同的是apply将会覆盖目标对象中的属性,而apply

    2022年7月28日
    2

发表回复

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

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