前段时间写个工具需要从Excel文件中读取数据,Excel表格数据列数为确定值,行数不确定,从网上搜了些方法尝试,最终达到目的,总结如下:

1. 新建一个基于对话框的MFC应用程序

2. 添加Excel相关类

打开类向导,添加类下拉框选择类型库中的MFC类,来源选择注册表(不容易出错),可用的类型库选择"Microsoft Excel ..."(根据Excel的版本有所不同);接口选择:_Application,_WorkSheet,_WorkBook,Range,WorkSheets,WorkBooks;添加6个必要的类CApplication,CWorkbook,CWorksheet,CRange,CWorkbooks,CWorksheets

3. 添加完成后,找到相关头文件,注释或删除:

//#import "D:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace

在stdafx.h中添加:

#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"

4. 编译出现错误:

1>e:\vs2010_project\demo\mfcexcel\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足
1>e:\vs2010_project\demo\mfcexcel\crange.h(335): error C2059: 语法错误:“,”

解决方法:定位错误信息,在CRange类中将DialogBox()改为_DialogBox()

 VARIANT _DialogBox(){VARIANT result;InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);return result;}

5. 获取Excel文件路径全名(包括文件名)

添加一个打开文件按钮和显示路径的编辑框,按钮单击消息处理函数:

void COfflineDlg::OnBnClickedButtonOpenfile()
{// TODO: 在此添加控件通知处理程序代码CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,  _T("EXCEL文件(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());  if(file.DoModal()==IDOK)  {  strPath=file.GetPathName();  GetDlgItem(IDC_EDIT_FilePath)->SetWindowText(strPath);}
}

strPath为CString类型的对话框成员变量,用于存储路径

6. 读取Excel中数据

添加一个读取数据按钮,按钮单击消息处理函数:

void COfflineDlg::OnBnClickedButtonReaddata()
{// TODO: 在此添加控件通知处理程序代码if("" == strPath){theApp.ShowInfo(_T("请先选择文件"));return;}GetDlgItem(IDC_BUTTON_ReadData)->EnableWindow(FALSE);theApp.ShowInfo(_T("读取数据..."));CApplication app;    //Excel程序CWorkbooks books;  //工作簿集合CWorkbook book;      //工作簿CWorksheets sheets;    //工作表集合 CWorksheet sheet;   //工作表CRange range;      //使用区域COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  if (!app.CreateDispatch(_T("Excel.Application")))  {  MessageBox(_T("Error!Creat Excel Application Server Fail!"));  exit(1);  }  books.AttachDispatch(app.get_Workbooks(),true); book.AttachDispatch(books.Add(_variant_t(strPath)));//获取选择的Excel文件sheets.AttachDispatch(book.get_Worksheets(),true);//获取文件中的所有sheetsheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1")),true);//获取sheet1区域vstrCycleSets.clear();vstrCmdSeque.clear();vstrSendData.clear();vstrExpectData.clear();vstrTimeout.clear();vstrCheck.clear();vstrCycleCnt.clear();CString str;bool bExit = false;for(int irow=2;!bExit;irow++){for(int icolumn=1;icolumn<8;icolumn++){range.AttachDispatch(sheet.get_Cells(),true);//获取sheet1所有的单元格,重置当前区域为A1range.AttachDispatch(range.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal);//获取单元格switch(icolumn){case 1: str = range.get_Value2(); if(str.IsEmpty()){bExit = true; break;}vstrCycleSets.push_back(str); break;case 2: str = range.get_Value2();vstrCmdSeque.push_back(str);break;case 3: str = range.get_Value2();str.Replace(" ", "");vstrSendData.push_back(str);break;case 4: str = range.get_Value2();str.Replace(" ", "");vstrExpectData.push_back(str);break;case 5: str = range.get_Value2();vstrTimeout.push_back(str);break;case 6: str = range.get_Value2();vstrCheck.push_back(str);break;case 7: str = range.get_Value2();vstrCycleCnt.push_back(str);break;default: ;}if(bExit){break;}}}range.ReleaseDispatch();//释放对象sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();  books.ReleaseDispatch();    app.ReleaseDispatch(); app.Quit();//退出Excel程序if(!vstrCycleSets.empty()){theApp.ShowInfo(_T("读取数据成功"));}else{theApp.ShowInfo(_T("读取数据失败"));}GetDlgItem(IDC_BUTTON_ReadData)->EnableWindow(TRUE);
}

我读取的Excel表格数据列数固定为7,数据不确定所以行数不确定,第一行为表头,所以从第二行A2单元格开始读,通过Ai是否为空来判断数据是否读完。采用容器来保存数据对象比较方便,容器定义为对话框成员变量:

 //存储Excel读取的数据vector<CString> vstrCycleSets;vector<CString> vstrCmdSeque;vector<CString> vstrSendData;vector<CString> vstrExpectData;vector<CString> vstrTimeout;vector<CString> vstrCheck;vector<CString> vstrCycleCnt;

至此,就完成了从Excel中读取数据。

我们都是站在巨人的肩膀上,参考资料:

http://blog.csdn.net/u013507368/article/details/42143913

http://blog.csdn.net/jason___bourne/article/details/39643419

http://blog.csdn.net/fkzh2651/article/details/12185611

http://blog.csdn.net/tc297520702/article/details/20745457

http://blog.csdn.net/wangzhiyang925/article/details/37572695

VS2010 MFC读取Excel文件中数据相关推荐

  1. [转]VS2010+MFC解析Excel文件中数据

    本文转自:http://www.vcfans.com/2010/08/vs2010-mfc-excel-file-in-the-data-analysis.html 前两天折腾一个小功能,需求是解析E ...

  2. python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

    在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...

  3. Python读取excel文件中的数据,绘制折线图、散点图

    https://www.cnblogs.com/liulinghua90/p/9935642.html https://blog.csdn.net/qq_32458499/article/detail ...

  4. MFC读取Excel文件+数据处理+写入Excel

    在日常编程的过程中,我们经常会遇到需要读写文件的操作,当然,最好的选择是数据库来进行读写,但是由于数据库使用环境的要求(比如某些数据库要求必须安装数据库软件后才能使用),同时,要进行数据库操作需要对S ...

  5. python读取excelsheet-python实现读取excel文件中所有sheet操作示例

    本文实例讲述了python实现读取excel文件中所有sheet操作.分享给大家供大家参考,具体如下: 表格是这样的 实现把此文件所有sheet中 标识为1 的行,取出来,存入一个字典.所有行组成一个 ...

  6. python打开excel的函数-Python读取excel文件中带公式的值的实现

    在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候,返回值为空 import os import xlrd from xlutils.copy ...

  7. python公式_Python读取excel文件中带公式的值的实现

    在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候,返回值为空 import os import xlrd from xlutils.copy ...

  8. python 读excel中的sheet_python读取excel文件中所有sheet表格

    sales: store: """ (1)用load_workbook函数打开excel文件,返回一个工作簿对象 (2)用工作簿对象获取所有的sheet (3)第一个fo ...

  9. matlab excel操作,Matlab读取excel文件里数据的操作流程

    亲们入手Matlab软件过程里会读取excel文件里数据吗?下面小编就提供了Matlab读取excel文件里数据的操作流程,有需要的朋友一起来看看吧. 读取sheet1中的所有数据 以03版excel ...

最新文章

  1. 机器学习领域最全综述列表!
  2. 2004年c语言试题2,C语言试题(2004~2005第2学期)A重修
  3. 济南学习 Day2 T2 am
  4. VUE+SpringBoot+JWT实现token验证,SSO单点登录
  5. E. Turn Off The TV Educational Codeforces Round 29
  6. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件
  7. python虚拟开发环境搭建(virtualenv和virtualenvwrapper)
  8. Spark学习之第一个程序打包、提交任务到集群
  9. pdf文档怎么删除内容页面
  10. c语言一个字符串怎么做除法,c语言实数除法怎样保留小数部分
  11. 如何向github上传代码
  12. import math java_java 中 Math类
  13. 上海商报:超级表格创始人叫板Excel
  14. 解决 Redis Desktop Manager 黑屏问题
  15. saiku 2.6 源码整合(无maven情况下)
  16. 灵机一栋团队alpha冲刺 Ⅱ
  17. SAP中实现所见即所得的打印功能操作方法
  18. 年薪35w带12人团队,内推阿里被拒了。。。
  19. 短信验证码登录流程思路及详细步骤
  20. 博客推广及搜索引擎优化

热门文章

  1. CSS高级技巧及规范
  2. vue h5地图选点
  3. python用turtle库写六角形
  4. 栈中的“先进后出,后进先出”是什么意思?
  5. 电话销售通过哪些方面可以抓住客户心理变化
  6. C语言快速排序 qsort()
  7. Zotero + Zotfile + NutSync 简直文献管理神器
  8. 2019年了,我似乎长进不大,小斧子还得卖力砍啊
  9. javascript教程系列-4.函数
  10. fiddler--抓包--之数据分析和查看(inspectors)