VS2015:在MFC下读写Excel文件
前言
visual studio 2015下使用MFC实现可视化编程,并对Excel文件进行读写操作开发环境:Visual Studio 2015、Office2016(版本可以随意)
一、创建MFC项目
创建MFC测试demo,这里我直接创建一个基于对话框的MFC应用程序
(注意:这里选择基于对话框,选择之后直接点击完成)
创建完之后,直接运行一下,看项目是否正常!!!
二、引入Excel资源类
在工程上进入:项目→类向导
选中添加类的第二项:类型库中的MFC类
只要你安装了office,你就能找到如下的文件,根据你装的64或者是x86位,分别在Program Files或者Program Files(x86)中就可以找到相对应的Microsoft Office程序目录,然后在找到其子文件夹,就可以找到EXCEL.EXE,添加之后就会出现如下的接口
导入资源之后然后再引入这些接口,因此选择接口然后点击单箭头>:_Application、_Workbook、_Worksheet、_Font、_Range、_Workbooks、_Worksheets。如下图所示:
导入之后会出现如下.h文件
在创建项目的头文件下加入Excel类的头文件:
#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
运行程序会报错,错误如下所示:
进入刚刚添加的.h文件中,分别注释它们如下代码:
//#import "C:\\Program Files\\Microsoft Office\\Office16\\EXCEL.EXE" no_namespace
然后再运行项目,出现如下错误:
进入CRange.h文件中
将DialogBox改为_DialogBox
运行项目成功,至此环境配置成功!!!
三、实现Excel读取
在dialog界面里面加入一个响应按钮:
添加如下代码:
//打开指定Excel文件,如果不存在就创建
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径
CString strExcelFile = (TCHAR*)path;
CString strdevName = _T("\\data.xlsx"); //xls也行
strExcelFile += strdevName;
CApplication App;//创建应用实例
CWorkbooks Books;//工作簿,多个Excel文件
CWorkbook Book;//单个工作簿
CWorksheets sheets;//多个sheets页面
CWorksheet sheet;//单个sheet页面
CRange range;//操作单元格
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult; //COleVariant类是对VARIANT结构的封装
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!App.CreateDispatch(_T("Excel.Application"), NULL))
{
AfxMessageBox(_T("无法启动Excel服务器!"));
return;
}
Books.AttachDispatch(App.get_Workbooks());
lpDisp = Books.Open(strExcelFile, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional);
//得到Workbook
Book.AttachDispatch(lpDisp);
//得到Worksheets
sheets.AttachDispatch(Book.get_Worksheets());
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp = Book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//获取行列号
range = sheet.get_UsedRange();
range = range.get_Rows();
long rows = range.get_Count();
range = range.get_Columns();
long columns = range.get_Count();
for (long i = 1; i < columns + 1; i++)
{
for (long j = 1; j < rows + 1; j++)
{
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant(j), COleVariant((long)i)).pdispVal); //第一变量是行,第二个变量是列,即第i行第j列
vResult = range.get_Value2();
CString str;
if (vResult.vt == VT_BSTR) //字符串
{
str = vResult.bstrVal;
MessageBox(str);
}
else if (vResult.vt == VT_R8) //8字节的数字
{
str.Format(_T("%f"), vResult.dblVal);
MessageBox(str);
}
}
}
Books.Close();
App.Quit();
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
Book.ReleaseDispatch();
Books.ReleaseDispatch();
App.ReleaseDispatch();
总结
利用c++对Excel文件进行读取操作。