MFC vs2012 Office2013 读写excel文件

近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果。。。废话少说,过程如下:

笔者环境:win7 64+VS2012+Office2013+MFC。

说明:读写excel文件,通常包括1.ODBC数据库实现;2.通过解析Excel表格文件;3.通过OLE/COM的几种实现方法。本文主要研究通过OLE/COM实现对Excel表格的操作。

步骤:

1.新建MFC对话框。注意勾选自动化,否则后面加入不了需要的库,导致启动服务失败等错误。有的博客说需要加入

1 if (!AfxOleInit())
2 {
3     AfxMessageBox(IDP_OLE_INIT_FAILED);
4     return FALSE;
5 }

笔者实验发现加不加入都没有问题,如果后面有人有问题可以加入。

2.向项目工程中添加基本的7个类(Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过   接口来对Excel的操作),由于本文只关心对Excel表格中的数据的读取,主要关注7个接_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range、Font。

VS2012导入OLE/COM组件的接口的步骤为:项目->类向导->添加类->类型库中的MFC类,先选择要导入的组件所在的路径,即Excel.exe所在的路      径,然后再选择要导入的Excel类型库中的接口。组件路径一般为C:\Program Files\Microsoft Office\Office15\EXCEL.exe;格式类似。

3. 导入之后需要“#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace”注释掉,然后添加头文                 件:#include <afxdisp.h>到上面7个文件中去。

4.如果有错误error C2059双击error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox()再次编译,通过!!

5.读写excel。

在对话框头文件中*Dlg.h定义变量

 1 //定义接口类变量
 2     CApplication app;
 3     CWorkbook book;
 4     CWorkbooks books;
 5     CWorksheet sheet;
 6     CWorksheets sheets;
 7     CRange range;
 8     CMyFont font;
 9     CRange cols;
10     LPDISPATCH lpDisp; 

a.写excel,在*Dlg.cpp里面的OnInitDialog函数添加代码:

 1 //导出
 2     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 3     if (!app.CreateDispatch(_T("Excel.Application")))
 4     {
 5         this->MessageBox(_T("无法创建Excel应用!"));
 6         return TRUE;
 7     }
 8     books = app.get_Workbooks();
 9     //打开Excel,其中pathname为Excel表的路径名
10
11     book = books.Add(covOptional);
12     sheets = book.get_Worksheets();
13     sheet = sheets.get_Item(COleVariant((short)1));  //获得坐标为(A,1)和(B,1)的两个单元格
14     range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("B1")));  //设置单元格类容为Hello Exce
15     range.put_Value2(COleVariant(_T("Hello Excel")));  //选择整列,并设置宽度为自适应
16     cols = range.get_EntireColumn();
17     cols.AutoFit();
18     //设置字体为粗体
19     font = range.get_Font();
20     font.put_Bold(COleVariant((short)TRUE));
21     //获得坐标为(C,2)单元格
22     range = sheet.get_Range(COleVariant(_T("C2")), COleVariant(_T("C2")));
23     //设置公式“=RAND()*100000”
24     range.put_Formula(COleVariant(_T("=RAND()*100000")));
25     //设置数字格式为货币型
26     range.put_NumberFormat(COleVariant(_T("$0.00")));
27     //选择整列,并设置宽度为自适应
28     cols = range.get_EntireColumn();
29     cols.AutoFit();
30     //显示Excel表
31     app.put_Visible(TRUE);
32     app.put_UserControl(TRUE);

结果如下

b.导入excel,同样在*Dlg的位置添加代码:

 1 //导入
 2     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 3     if (!app.CreateDispatch(_T("Excel.Application")))
 4     {
 5         this->MessageBox(_T("无法创建Excel应用!"));
 6         return TRUE;
 7     }
 8     books = app.get_Workbooks();
 9     //打开Excel,其中pathname为Excel表的路径名
10     lpDisp = books.Open(_T("D:\\VS2012\\Projects\\TestExcelApp2\\TestExcelApp2\\工作薄1.xlsx"),covOptional ,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);
11     book.AttachDispatch(lpDisp);
12     sheets = book.get_Worksheets();
13     sheet = sheets.get_Item(COleVariant((short)1));
14     //获得坐标为(A,1)的单元格
15     range = sheet.get_Range(COleVariant(_T("A1")) ,COleVariant(_T("A1")));
16     //获得单元格的内容
17     COleVariant rValue;
18     rValue =   COleVariant(range.get_Value2());
19     //转换成宽字符
20     rValue.ChangeType(VT_BSTR);
21     //转换格式,并输出
22     this->MessageBox(CString(rValue.bstrVal));
23     book.put_Saved(TRUE);
24     app.Quit();

效果如下:

excel内容:

读到第一行第一列元素:

笔者只是需要读取excel的读写功能,所以只是做了这方面的实验,可以用到自己的项目中,所以共大家分享一下。有什么问题可以留言,共勉!

时间: 2024-10-11 01:49:06

MFC vs2012 Office2013 读写excel文件的相关文章

使用phpexcel类读写excel文件

使用原生php读写excel文件的博文地址: 基于使用原生php读写excel文件的不靠谱,本文将简单介绍如何使用第三方类库phpexcel来读写excel文件. 首先,需要到githut下载phpexcel类库.下载地址:https://github.com/PHPOffice/PHPExcel.

C# 读写Excel文件

公司遇到一些tasks,需要将分析完毕的数据结果保存在Excel文件中.陆陆续续参与了这么多tasks后,现简单总结下: 操纵Excel 文件有多种方法,每种方法都有特色,适用于不同场景. 方法1:调用Office com组件: 也就是调用Interop类.此方法适用于desktop已经安装有Windows Office的情况.功能及其强大,windows Office拥有的功能,几乎通过此都能调用.劣势是读写速度最慢. 方法2:使用ODBC技术读写Excel文件 该方法读写速度似乎最快(没有准

集算器读写EXCEL文件的代码示例

集算器可以方便地读写Excel文件,下面用一个例子进行说明:     描述:从data.xlsx读取订单数据和销售员列表,根据这两个sheet计算各部门的销售额,计算结果写入result.xlsx.     源Excel文件:data.xlsx有两个sheet,其中订单数据如下: 销售员列表如下:     集算器代码: A1-A2:从excel文件data.xlsx分别读取第1和第2个sheet,以序表的形式存储在A1.A2格,即订单数据和销售员列表. A3-A4:先将订单数据和销售员列表按照员

[转]用Python读写Excel文件

转自:http://www.gocalf.com/blog/python-read-write-excel.html#xlrd-xlwt 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Excel中进行导入或者直接复制粘贴. 前段时间做一个项目,却不得不使用Python直接生成Excel文件,后来随着需求的变化,还要对已有的Excel文件进行读取.在

R读写Excel文件中数据的方法

用R语言读写Excel的方法有很多,但每种方法都有让人头疼的地方,比如xlsx包的代码复杂,只支持Excel2007:RODBC不易理解,限制太多,程序不稳定,会出各种怪毛病.另存为csv格式的方法倒是比较通用比较稳定,但又存在操作麻烦,无法程序化处理多个文件的问题.提取xml也是个办法,但步骤太多代码太复杂,令人望而生畏.用剪贴板转换也不好,这同样需要人工参与,还不如存为csv. 相比之下,用gdata包来读取,配合WriteXLS写入Excel则可以很好的避开上述麻烦.这两个包都支持Exce

java读写excel文件

需求:利用Java读写excel文件 利用jexcelapi实现Java读写excel文件的功能 首先下载并安装jexcelapi JExcelApi v2.6.12 (1911kbytes) 解压后把jxl.jar文件添加到Java Build Path中 Java读取excel文件 Java写入excel文件

用Python读写Excel文件 Contents

用Python读写Excel文件 四种python处理excel模块PK 我主要尝试了四种工具,在此并不会给出他们的排名,因为在不同的应用场景下,做出的选择会不同.   XlsxWriter xlrd&xlwt OpenPyXL Microsoft Excel API 介绍 可以创建Excel 2007或更高版本的XLSX文件 即python-excel,含xlrd.xlwt和xlutils三大模块,分别提供读.写和其他功能 可以读写Excel 2007 XLSX和XLSM文件 直接通过COM组

用Python读写Excel文件的方式比较

虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Excel中进行导入或者直接复制粘贴. 前段时间做一个项目,却不得不使用Python直接生成Excel文件,后来随着需求的变化,还要对已有的Excel文件进行读取.在这个过程中,研究并尝试了一些工具,也走了一些弯路.记录下来,下次再有类似需求的时候就不用漫天遍野地搜索了. 超级无敌大PK 我主要尝试了四

Python读写Excel文件和正则表达式

Python 读写Excel文件 这里使用的是 xlwt 和 xlrd 这两个excel读写库. #_*_ coding:utf-8 _*_ #__author__='观海云不远' #__date__ = '2019-07-11' #读写excel import xlwt import xlrd import re workbook = xlrd.open_workbook('data.xlsx') sheet = workbook.sheet_by_index(0) data = [] for