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

本文转自:http://www.vcfans.com/2010/08/vs2010-mfc-excel-file-in-the-data-analysis.html

 

前两天折腾一个小功能,需求是解析Excel中的数据出来。网上一般使用的方案:
1. ODBC当数据库来操作。
2. 使用第三方的类库
3. 使用COM调用Excel.exe中的接口。

第三方类库我怕MS升级版本后,是否仍然使用是个问号。使用ODBC的方案感觉很怪怪的,但据说不能修改删除什么的,不过我没有试验,还是放弃此种方案。我最终还是使用COM来做的,本来是没什么实现代码,都是COM实现好的,没什么可写的。难点在于VS2010的版本与MSDN上的说法严重不一致,折腾死人。MSDN上说的方案是VC6.0的实现方法。而且加入COM后与VS的SDK库冲突,无法编译。下面说说我的使用方法。

第一步:初化COM接口。在InitInstance中加入如下代码:

?[Copy to clipboard]View Code CPP
1
2
3
4
5
if(!AfxOleInit()){AfxMessageBox(_T( "Cannot initialize COM dll" ));return FALSE;}

第二步:向工程添加Excel的C++操作类。具体步骤见下图:
1.Ctrl+Shift+X 打开类向导。

2.添加“类型库中MFC类”。此处操作与VC6.0有很大的不一样,让我找了半天,如下图:

3.添加需要的类文件。如下图:

4.将刚才导入的类头文件,加到模块中。

?[Copy to clipboard]View Code CPP
1
2
3
4
5
6
#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorksheets.h"
#include "CWorkbook.h"
#include "CWorksheet.h"
#include "CRange.h"

到此好像一切都结束了,下面就是写调用上面载入的代码了。But……,当你编译时。MS将给你如下惊喜:

1>d:\xls\xls\debug\excel.tlh(74974): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(74974): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(74974): warning C4183: “GetMailEnvelope”: 缺少返回类型;假定为返回“int”的成员函数
1>d:\xls\xls\debug\excel.tlh(75683): error C2146: 语法错误: 缺少“;”(在标识符“HTMLProject”的前面)
1>d:\xls\xls\debug\excel.tlh(75683): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75683): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75693): error C2146: 语法错误: 缺少“;”(在标识符“CommandBars”的前面)
1>d:\xls\xls\debug\excel.tlh(75693): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75693): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75737): error C2146: 语法错误: 缺少“;”(在标识符“VBProject”的前面)
1>d:\xls\xls\debug\excel.tlh(75737): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75737): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75739): error C2146: 语法错误: 缺少“;”(在标识符“Permission”的前面)
1>d:\xls\xls\debug\excel.tlh(75739): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75739): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75741): error C2146: 语法错误: 缺少“;”(在标识符“SharedWorkspace”的前面)
1>d:\xls\xls\debug\excel.tlh(75741): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75741): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75743): error C2146: 语法错误: 缺少“;”(在标识符“Sync”的前面)
1>d:\xls\xls\debug\excel.tlh(75743): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75743): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75757): error C2146: 语法错误: 缺少“;”(在标识符“SmartDocument”的前面)
1>d:\xls\xls\debug\excel.tlh(75757): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75757): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
1>d:\xls\xls\debug\excel.tlh(75759): error C2146: 语法错误: 缺少“;”(在标识符“DocumentLibraryVersions”的前面)
1>d:\xls\xls\debug\excel.tlh(75759): fatal error C1003: 错误计数超过 100;正在停止编译
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

我也不知道为什么造成这种结果,可能是由于这类接口是MS在N年前就弄好,后来VS升级了,相关接口也就年久失修了。造成我们这帮使用老技术的人的尴尬,后来求助于万能的Google大侠,得到如下方案:

将刚才导入的几个头文件中的:

?[Copy to clipboard]Download download.txt
1
#import "D:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace

替换成:

?[Copy to clipboard]Download download.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma region Import the type libraries#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \rename("RGB", "MSORGB") \rename("DocumentProperties", "MSODocumentProperties")
// [-or-]
//#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \
//	rename("RGB", "MSORGB") \
//	rename("DocumentProperties", "MSODocumentProperties")using namespace Office;#import "libid:0002E157-0000-0000-C000-000000000046"
// [-or-]
//#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"using namespace VBIDE;#import "libid:00020813-0000-0000-C000-000000000046" \rename("DialogBox", "ExcelDialogBox") \rename("RGB", "ExcelRGB") \rename("CopyFile", "ExcelCopyFile") \rename("ReplaceText", "ExcelReplaceText") \no_auto_exclude
// [-or-]
//#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" \
//	rename("DialogBox", "ExcelDialogBox") \
//	rename("RGB", "ExcelRGB") \
//	rename("CopyFile", "ExcelCopyFile") \
//	rename("ReplaceText", "ExcelReplaceText") \
//	no_auto_exclude#pragma endregion

到此搞定环境问题,下面就根据需求对Excel进行操作吧。

有图有真像:

 

转载于:https://www.cnblogs.com/freeliver54/archive/2012/10/12/2720785.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引机制(详细+原理+解析)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 MySQL索引机制 永远年轻,永远热泪盈眶 一.索引的类型与常见的操作 前缀索引 MySQL 前缀索引能有效减小索引文…

War-Driving(战争驾驶***)

War-Driving总结性的文章 以后应该不会在到这方面过多的下功夫了。点我下载转载于:https://blog.51cto.com/0x007/1586376

OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测

在笔记十四中,我们使用了Sobel算子对图像进行边缘检测,理论依据是像素变化最快的地方最有可能是边缘处,所以使用sobel算子对图像做微分,得到的结果图像当中灰度较大的区域,即为边缘处。 在这里,我们使用Lap…

设计模式之:享元模式FlyweightPattern的实现

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 享元模式的理解: 享元模式的定义:运用共享技术支持大量细粒度对象的复用; Flyweight P…

7.中文输入验证-原生JS

1 <!DOCTYPE html>2 <html>3 <head lang"en">4 <meta charset"UTF-8">5 <title>中文输入验证-原生JS</title>6 </head>7 <body>8 <input type"text" id"num" οnblur&quo…

(转)CentOs 设置静态IP 方法

在做项目时由于公司局域网采用自动获取&#xff29;&#xff30;的方式&#xff0c;导到每次服务器重启主机&#xff29;&#xff30;都会变化。为了解决这个问题&#xff0c;我参考了http://blog.sina.com.cn/s/blog_537977e50100qhb5.html的文章然后根据自己的情况设置静态IP…

php资源索引

2019独角兽企业重金招聘Python工程师标准>>> w3school http://www.w3school.com.cn/php/func_mysql_result.asp osc代码分享 http://www.oschina.net/code/list/?langphp&catalog&showtime&sort&p110 CRUD例子&#xff1a; http://git.oschina…

掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 掌握JavaScript中的迭代器和生成器&#xff0c;顺便了解一下async、await的原理 前言 相信很多人对迭代器和生成器都不陌…

Boot loader: Grub入门(转)

Boot Loader: Grub 在看完了前面的整个启动流程&#xff0c;以及核心模块的整理之后&#xff0c;你应该会发现到一件事情&#xff0c; 那就是『 boot loader 是加载核心的重要工具』啊&#xff01;没有 boot loader 的话&#xff0c;那么 kernel 根本就没有办法被系统加载的呢&…

网页设计趋势:模糊背景在网站中的经典应用案例

如今&#xff0c;网页设计领域出现了多种创新的设计方法&#xff0c;例如视差滚动&#xff0c;全屏背景&#xff0c;单页设计等等。今天这篇文章向大家介绍另一种新的网页设计趋势——模糊背景。这种类似于摄影拍摄的效果应用在网页中能够突出主题内容&#xff0c;同时若隐若现…

magento去除子分类的url地址中带有父分类的url key

2019独角兽企业重金招聘Python工程师标准>>> app/code/core/Mage/Catalog/Model/Url.php 找到如下代码 方法getCategoryRequestPath if (null $parentPath) {$parentPath $this->getResource()->getCategoryParentPath($category);}elseif ($parentPath /…

深度学习(三)之LSTM写诗

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* 数据预处理 构建数据集模型结构生成诗 根据上文生成诗生成藏头诗 参考 根据前文生成诗&#xff1a; 机器学习业&…

C# 将PDF转为Excel

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 通常&#xff0c;PDF格式的文档能支持的编辑功能不如office文档多&#xff0c;针对PDF文档里面有表格数据的&#xff0c;如果…

SQL Server R2 地图报表制作(五)

SQL Server R2 地图报表制作&#xff08;五&#xff09; 2.3 向地图中添加线条层 在上述报表的基础上&#xff0c;我们接下来添加一个表示两个商店间路线的地图层&#xff0c;这里我们依旧使用SQL空间数据源&#xff0c;部分步骤与上一节类似&#xff0c;所不同的是相应的SQL语…

SQL Server 2005新特性之使用with关键字解决递归父子关系

1. 引言 现实项目中经常遇到需要处理递归父子关系的问题&#xff0c;如果把层次关系分开&#xff0c;放在多个表里通过主外键关系联接&#xff0c;最明显的问题就是扩展起来不方便&#xff0c;对于这种情况&#xff0c;一般我们会创建一个使用自连接的表来存放数据。例如存放会…

做订购系统必须要明白的几点

2019独角兽企业重金招聘Python工程师标准>>> 对价格的疑问&#xff1f; 1、用户容易把单位搞错&#xff0c;你标注的是单价&#xff0c;他理解的是整套的价格。譬如你标注的是一粒糖的价格&#xff0c;但卖的是一包糖10粒。 新增单&#xff1f;我拍了之后还想补充 2…

Oracle安装 - shmmax和shmall设置

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 一、概述 在Linux上安装oracle&#xff0c;需要对内核参数进行调整&#xff0c;其中有shmmax和shmall这两个参数&#xff…

彻底理解js中this的指向

首先必须要说的是&#xff0c;this的指向在函数定义的时候是确定不了的&#xff0c;只有函数执行的时候才能确定this到底指向谁&#xff0c;实际上this的最终指向的是那个调用它的对象&#xff08;这句话有些问题&#xff0c;后面会解释为什么会有问题&#xff0c;虽然网上大部…

带码农《手写Mybatis》进度3:实现映射器的注册和使用

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&…

01背包问题,动态规划求解

01背包问题&#xff1a; 1.递归思想 0- 1 背包问题如果采用递归算法来描述则非常清楚明白, 它的算法根本思想是假设用布尔函数knap( s, n) 表示n 件物品放入可容质量为s 的背包中是否有解( 当knap 函数的值为真时 说明问题有解,其值为假时无解) . 我们可以通过输入s 和n 的值, …