MFC 与Excel文件的交互操作

假日快要结束了,带着沉重的心情写下之前关于MFC与Excel文件交互的总结。由于VS的版本不同可能在操作上有些差异,所以在此指明下本篇文章的工程环境为VS2013,也建议大家用最新的。

说到程序对于Excel的操作,应该不能算是什么新需求了,方法也有好几种,诸如利用office提供的接口、开源代码之类的。本文在查了一些资料之后选择了实现起来较为反便的一种。其实现的方法基本上完全照抄的这篇文章的,如果看本篇不大明白的可以去看看。

参考的文章说,“踏破铁鞋无觅处,得来费死了工夫”,然而进过了博主的努力,后人需要做的也就是看一看,抄一抄就完事了,开源的力量伟大至极,本篇将发扬博主的精神,在整理内容的同时,写出一个Demo工程提供下载,如果懒得做这些工作的人只需要下载了这个工程就可以直接用起来了(亲测可以),工程在最后面给出。

原文地址

下面开始主要内容

第一步:创建一个空的MFC对话框工程

第二步:下拉VS菜单栏的“项目”项,选择添加类。在弹出对话框中选中“TypeLib中的MFC类”,点击添加,弹出“从类型库添加类向导”对话框。

第三步:弹出的对话框如下图,“从以下来源添加类”中有两个选项,如果选择的是“注册表”,在“可用的类型库”中选择“Microsoft Excel
15.0 Object Library<1.8>”(Office版本不同可能有些许差异,这个是Office2013)。如果选择的是“文件”,则"位置"选择Office安装路径下的EXCEL.EXE,本人32位Office的默认安装,路径为“C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE”。上面两个选项达到的效果是一样的,只是路径不同而已,做完效果如下:

第四步:选中“接口”中的“_Application”,“_WorkSheet”,“_WorkBook”,“WorkSheets”,“WorkBooks”,“Range”这几项,放到右边去,点击完成,如下图:

第五步:做完第四步后,工程中会多出几个导入类的头文件“CApplication.h”,“CWorkSheet.h”,“CWorkBook.h”,“CWorkSheets.h”,“CWorkBooks.h”,“CRange.h”,将每一个头文件里面的都有的第一句代码“#import
"C:\\Program Files (x86)\\Microsoft Office\\Office15\\EXCEL.EXE" no_namespace”(路径可能不同)都注释掉。如下图:

第六步:既然有头文件,自然就要包含这些头文件啦,在需要调用的文件头写入如下代码:

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

第七步:这个时候按理说环境已经是搭建好了,但是点击编译还是会报出语法错误,幸好前文提到的博客也给出了解决方法,定位到"CRange,h",将

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

中的DialogBox改为_DialogBox,现在编译就没有问题了,接下来调用就可以了,调用代码如下:

CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!app.CreateDispatch(L"Excel.Application"))
{
	AfxMessageBox(L"无法启动Excel服务器!");
	return;
}
books.AttachDispatch(app.get_Workbooks());
CString path = L"demo.xlsx";//文件路径

TCHAR szPath[MAX_PATH];//获得当前执行路径
GetModuleFileName(NULL, szPath, MAX_PATH);
CString PathName(szPath);
PathName=PathName.Left(PathName.ReverseFind(_T('\\')) + 1);

lpDisp = books.Open(PathName+path, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);

book.AttachDispatch(lpDisp);//得到Workbook
sheets.AttachDispatch(book.get_Worksheets());//得到Worksheets  

lpDisp = book.get_ActiveSheet();//得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
sheet.AttachDispatch(lpDisp);

//读取第rows行、第cols列单元格的值
/*如果遍历则反复执行这段代码并判断界限*/
int rows = 1, cols = 2;
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)rows), COleVariant((long)cols)).pdispVal);
vResult = range.get_Value2();
CString data;
if (vResult.vt == VT_BSTR)//字符串
{
	data = vResult.bstrVal;
}
else if (vResult.vt == VT_R8)//8字节的数字
{
	data.Format(L"%.0f", vResult.dblVal);
}
else if(vResult.vt==VT_EMPTY)//单元格空的
{
	data = "";
}
MessageBox(data);
/*如果遍历则反复执行这段代码并判断界限*/

//释放对象
books.Close();
app.Quit();// 退出
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();

OK,到此便实现了Excel数据的读取,至于创建和写入也差不多,以后有用到再添加上来。

工程下载(VS2013)

时间: 2024-10-11 07:16:44

MFC 与Excel文件的交互操作的相关文章

用Python对excel文件的简单操作

#-*-coding:utf8-*- import xlrd #代开excel文件读取数据 data = xlrd.open_workbook("C:\\Users\\hyl\\Desktop\\1.xls") #通过索引顺序获取一个工作表 table = data.sheet_by_index(0) #获取整行的值(数组) table.row_values(i) #获取行数 nrows = table.nrows for i in range(nrows): print table.

通过python对excel文件的读写操作

通过xlwt对excel执行写操作 需要安装并导入xlwt模块 1 def set_style(name, height, bold=False): #一个name参数,一个高度参数,默认不加粗 2 style = xlwt.XFStyle() # 初始化样式 3 font = xlwt.Font() # 为样式创建字体 4 font.name = name # 'Times New Roman' 5 font.bold = bold #加粗 6 font.color_index = 4 #颜色

HDFS文件与本地文件的交互操作

1.在HDFS中创建一个新的文件夹,用于保存weblog_entries.txt hadoop fs -mkdir /data/weblogs 2.将weblog_entries.txt文件从本地文件系统复制到HDFS刚创建的新文件夹下 cd /home/data hadoop fs -copyFromLocal weblog_entries.txt /data/weblogs 3.列出HDFS上weblog_entries.txt文件的信息: hadoop fs –ls /data/weblo

python对excel文件的读写操作

import xlrd,xlwt data = xlrd.open_workbook('a.xlsx') #读 table = data.sheets()[0] data_list = [] data_list.extend(table.row_values(0)) for item in data_list: print item ################# # 写 data = xlwt.Workbook() table = data.add_sheet('b') table.wri

C#操作Excel文件(转)

实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模版 4.多DataTable导入到同一Excel文件 对于第四项功能,常见的用途为:最后一行显示的是百分比,为字符型,而这列其它类型为数据型,如果放在同一个DataTable中,显然不合适.此操作类可实现 5.将Excel文件导入到数据库表中 可以指定每个字段的数据类型 此帮助类的代码量不算少,但注释比较详细

Java文件操作系列[2]——使用JXL操作Excel文件

由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别是:JXL较为轻量级,如果是对Excel文件的简单操作,建议使用JXL:POI的功能相当强大,但同时处理问题也相当的繁琐. 1.准备工作 [必需]下载JXL的jar包:jxl.jar [非必需]JXL API  (提取密码:zgqj) 2.一些必要的说明 主要是对Excel结构的说明: Excel后

C# Excel文件导入操作

Excel文件导出的操作我们经常用到,但是讲一个Excel文档导入并显示到界面还是第一次用到. 下面简单介绍下在C#下如何进行Excel文件的导入操作. 首先添加两个引用 using System.IO; using System.Data.OleDb; 添加控件openFileDialog 然后我们需要配置Excel的OleDb连接字符串 <span style="font-size:14px;">public const string OledbConnString =

java无依赖读取Excel文件

说到Java读取Excel文件,用得多的当然是POI或jxls,但今天在看一本书的时候.当中提到使用JdbcOdbcDriver这个驱动类在不依赖第三方库的情况下也能够完毕对Excel文件的读取操作,网上搜了一下原因然后自己写了个样例跑通了,在此记录一下. Java读取数据库大家都非常熟悉,须要一个数据源与对应的驱动.开发人员通过JDBC操作驱动.驱动再去操作数据库.那么Java读取Excel文件也是类似的.在Windows系统中,能够将一个Excel文件注冊为一个ODBC数据源,注冊过程为:

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解