MFC 与Excel文件的交互操作
假日快要结束了。带着沉重的心情写下之前关于MFC与Excel文件交互的总结。
因为VS的版本号不同可能在操作上有些差异。所以在此指明下本篇文章的project环境为VS2013,也建议大家用最新的。
说到程序对于Excel的操作,应该不能算是什么新需求了。方法也有好几种,诸如利用office提供的接口、开源码之类的。本文在查了一些资料之后选择了实现起来较为反便的一种。事实上现的方法基本上全然照抄的这篇文章的,假设看本篇不大明确的能够去看看。
參考的文章说。“踏破铁鞋无觅处。得来费死了工夫”。然而进过了博主的努力,后人须要做的也就是看一看,抄一抄就完事了。开源的力量伟大至极,本篇将发扬博主的精神。在整理内容的同一时候,写出一个Demoproject提供下载,假设懒得做这些工作的人仅仅须要下载了这个project就能够直接用起来了(亲測能够),project在最后面给出。
以下開始主要内容
第一步:创建一个空的MFC对话框project
第二步:下拉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”这几项。放到右边去,点击完毕。例如以下图:
第五步:做完第四步后,project中会多出几个导入类的头文件“CApplication.h”,“CWorkSheet.h”,“CWorkBook.h”,“CWorkSheets.h”,“CWorkBooks.h”,“CRange.h”。将每个头文件中面的都有的第一句代码“#import
"C:\\Program Files (x86)\\Microsoft Office\\Office15\\EXCEL.EXE" no_namespace”(路径可能不同)都凝视掉。
例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluaHVt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
第六步:既然有头文件,自然就要包括这些头文件啦,在须要调用的文件头写入例如以下代码:
#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"无法启动Excelserver!");
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数据的读取,至于创建和写入也几乎相同,以后实用到再加入上来。
project下载(VS2013)
MFC 与Excel文件的交互操作的更多相关文章
- Python Excel文件的读写操作(xlwt xlrd xlsxwriter)
转:https://www.cnblogs.com/ultimateWorld/p/8309197.html Python语法简洁清晰,作为工作中常用的开发语言还是很强大的(废话). python关于 ...
- Excel文件的导出操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 用Python对excel文件的简单操作
#-*-coding:utf8-*- import xlrd #代开excel文件读取数据 data = xlrd.open_workbook("C:\\Users\\hyl\\Deskto ...
- 使用openpyxl实现excel文件的读取操作
1.环境准备 python3环境.安装openpyxl模块 2.excel文件数据准备 3.为方便直接调用,本代码直接封装成类 from openpyxl import load_workbook c ...
- pandas对Excel文件的读写操作
1.将Excel数据读为dataframe 1.1 直接读取 df = pd.read_excel('data.xlsx') 1.2 根据sheet索引 xls = pd.ExcelFile('dat ...
- python对excel文件的读写操作
import xlrd,xlwt data = xlrd.open_workbook('a.xlsx') #读 table = data.sheets()[0] data_list = [] data ...
- 【C#】C#操作Excel文件(转)
实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...
- Python 操作 MS Excel 文件
利用 Python 对 Excel 文件进行操作需要使用第三方库: openpyxl,可执行 pip install openpyxl 进行安装 1. 导入 openpyxl 模块 导入 openpy ...
- Python【操作EXCEL文件】
#Python中,对EXCEL文件的读写操作需要安装.导入几个第三方模块#xlrd模块:只能读取EXCEL文件,不能进行写操作#xlwt模块:只能进行写操作,但是不能是覆盖写操作(也就是修改Excel ...
随机推荐
- IEnumerable ICollection IList
- Tomcatsession共享方案--memcached-session-manager
https://github.com/magro/memcached-session-manager/wiki/SerializationStrategies MSM的特性: a.支持t ...
- 修改织梦plus目录名
1.修改plus目录名 修改inlclude文件夹下common.inc.php 140行 //插件目录,这个目录是用于存放计数器.投票.评论等程序的必要动态程序 $cfg_plus_dir = $c ...
- size_t与size_type的使用
size_t 是为了方便系统之间的移植而定义的 在32位系统上 定义为 unsigned int在64位系统上 定义为 unsigned long 更准确地说法是 在 32位系统上是32位无符号整形在 ...
- FBX骨骼坐标系与模型坐标系的关系
采用assimp加载FBX文件.首先记录下ubuntu下assimp的编译安装. cd assimp_unzip_dir mkdir build cd build && cmake . ...
- CUDA 编程实例:计算点云法线
程序参考文章:http://blog.csdn.net/gamesdev/article/details/17535755 程序优化2 简介:CUDA ,MPI,Hadoop都是并行运算的工具.CU ...
- required输入框为必填项
required <input type="text" placeholder="cat photo URL" required>
- &:first-of-type含义
span { &:first-of-type { margin-right: 16px; } } &符号是scss和less里的语法,代表上一级选择器,实际编译成css就是 span: ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 学习笔记——ST表
作用: 给定一个数列 ai O(nlogn) 预处理 O(1) 查询区间最值 实现: 定义f(i,j) 为ai开始,包括ai的连续2^j个元素的最值 下面以最大值为例: f(i,j)表示max{ak} ...