在 VS2008 下操作 Excel 的方法总结
这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘。
一、最常用的 OLE 自动化方式
这个方式应该说是功能最全的方式,可能也是应用的最多的方式。由于这种方式采用的是隐藏启动 Office Excel 的方式,所以几乎是全能,任何功能都可以完成。不过缺点也是比较明显的:
1、采用 OLE 方式,需要用户计算机上安装有 Office Excel,否则就失败;
2、由于是隐藏启动 Office Excel,而 Mcirosoft 的一贯作风就是功能强大、体积巨大无比,所以这个速度是个很大的瓶颈,如果是批量读取的话,那...
3、它的基本方法是使用导出 .h 进行 OLE 操作,但是网上关于 Excel OLE 的完善的参考资料并不是很多,大多也是抄来抄去,所以要想很好的使用它们,恐怕还要好好的探索一下。
不过总之,这种方式在文件数目不多,对功能要求大过速度的话,这是首选。
代码可参考:http://blog.csdn.net/hyz_9257/archive/2008/12/27/3621309.aspx
二、ADO/ODBC 的方式
这种方式需要确保 ODBC 中已安装有 Excel 表格文件的驱动 "MICROSOFT EXCEL DRIVER (*.XLS)",所以同样依赖于 Office Excel 是否安装。
常规例子:http://www.vckbase.com/document/viewdoc/?id=421
这里不得不提的是:新加坡人 Yap Chun Wei 在 CodeProject 上 2001 年发布的 CSpreadSheet,非常流行的一个 Excel 操作类。地址是:http://www.codeproject.com/KB/database/cspreadsheet.aspx
具体我在最后第六点来介绍和对比。
三、Sourceforge 上的开源 Excel 库
搜索了一下,有几个似乎人气比较高,像 libXLS,XLSlib 等,下载下来看了一下说明,好像更多是作为 php 的插件来使用的,对 C++ 似乎没多大帮助。
四、第三方收费 Excel 操作库
第三方收费的,找到一个 LibXL (注意不是 LibXLS),他的官方网站是 http://www.libxl.com/,首先尝试找了一下 cr,可惜没有,由于工期紧,我甚至都考虑要付费购买一份授权,$199 啊!在决定之前,还是先好好测试一下他的功能是否达到我的要求,于是编译了他的几个 Demo,居然... 他自己的 Edit Demo 居然连自己 Generate Demo 程序生成的 Excel 都打不开,俺机器可是安装的有 Office Excel 的呀!实在是,寒
五、一些不需要依赖 Office Excel 的方式
网上还有一些说的不依赖 Office Excel 的方式,比如 http://www.vckbase.com/document/viewdoc/?id=815,但,说实话,这里的只是理论可行,离实际运用还有很远的路需要走。
六、重点推荐的
当当当当,BasicExcel !
他的作者和 CSpreadSheet 的作者是同一个,不过是因为他考虑到以前 CSpreadSheet 的一些局限性和想实现兼容性,重新写的。地址是:http://www.codeproject.com/KB/office/BasicExcel.aspx
对比 CSpreadSheet,他的优点在于:
1、CSpreadSheet 采用 CStringArray 赋值和取值,所以对数字等都处理不是很合适;
2、CSpreadSheet 采用 ODBC 方式,ODBC 是拿来当数据库读取和赋值的,所以,必须依赖于 Office 是否安装;ODBC 的速度也是一大瓶颈;而 BasicExcel 直接解析 Excel 格式,从文件下手,速度有相当提高,并且不再依赖于 Office 是否安装;
3、CSpreadSheet 不支持对 Sheet 的操作,而 BasicExcel 可以;
4、CSpreadSheet 需要被读取的 Excel 每一列需要一个列头,比如“姓名”、“年龄”等,不是 Excel 自身的 A、B、AA 等,没办法,要作为 ODBC 数据源使用,需要相当于数据库表的列名一样,这是不可避免的;
...
众多优点,是 CSpreadSheet 不能比的,所以作者在 2006 年新发布了这个类。
我的起点,便在这里。
由于作者在发布这一款操作类的时候,考虑的更多是跨平台性,Windows/(*)nix,所以采用的都是标准 C++ 函数,如 wcstombs、wcscpy 等,而这些在 Visual Studio 在被认为是不安全的,Microsoft 认为存在缓冲区溢出的隐患,所以 Microsoft 建立了一系列自己的函数,加了个 _s,如 wcstombs_s 等,另外由于不同的平台对 int short 等的精度不一样,所以还会有“初始化截断常量”这样怪异的警告。总共编译下来居然有 200 多个 warnning,要崩溃了!于是一个一个修改,终于到最后消灭了所有的 warnning。
另外一个我做的很大的调整就是完善对 Unicode 的支持。原类中作者似乎并没有考虑到这些,或者说是考虑的不全(谁叫人家新加坡的官方语言是英语呢?),所以只要打开或者保存的文件中含有中文,必定失败,被这个问题折腾了好久,一点点修改、调试。增加了很多 wchar_t* 形式的重载函数。
对这些类的收集、分析和 Basci Excel 的修改和调试,整整用了我 5 天时间!不过好在,到昨天凌晨,终于大功告成了,可以完美的支持 Unicode 了,嘿嘿
最后来张图:
在 VS2008 下操作 Excel 的方法总结的更多相关文章
- VBS操作Excel常见方法
VBS操作Excel常见方法 作者: 字体:[增加 减小] 类型:转载 时间:2009-11-13我要评论 VBS控制Excel常见方法,需要的朋友可以参考下. dim oExcel,oWb,oShe ...
- 用VB操作Excel的方法
VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报 ...
- unity3d 下操作excel 与打印
原地址:http://www.colabug.com/thread-1146390-1-1.html 因项目需要,需在unity下实现写入excel.打印功能.因之前在winform里操作过excel ...
- C#操作excel(多种方法比较)
1.用查询表的方式查询并show在数据集控件上. public static string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; D ...
- Ruby操作Excel的方法与技巧大全
测试工作中,批量的数据通常会放到excel表格中,测试输出的数据写回表格中,这样输入输出易于管理,同时清晰明了 使用ruby来操作excel文件首先需要在脚本里包含以下语句 require'win32 ...
- 如何在没有安装微软Excel环境下操作Excel文件?
在以前接触的项目中,由于很多客户对微软Excel的操作比较熟练,客户经常要求系统支持对Excel文件的读写.用.NET传统方法对Excel进行读写时,往往会涉及到不同版本兼容的问题,导致在本地测试一切 ...
- ubuntu下操作端口的方法
最简单的一个操作:sudo ufw status可检查防火墙的状态,我的返回的是:不活动 sudo ufw version防火墙版本: ufw 0.29-4ubuntu1 Copyright 2008 ...
- 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)
前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...
- NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别
NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...
随机推荐
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- 大数据笔记13:Hadoop安装之Hadoop的配置安装
1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip ...
- alias
1.语法:alias[别名]=[指令名称] [root@rusky /]# alias pingm="ping 127.0.0.1" [root@rusky /]# pingmP ...
- easyui-form添加自定义表单验证
easyui自定义表单验证规则其实不是很复杂,只要重写一下重写 $.fn.validatebox.defaults.rules 自定义示例 $.extend($.fn.validatebox.defa ...
- 关于使用Jsonp做跨域请求
今天在使用Jsonp做跨域请求的练习时碰上这样一个问题 代码如下 <!DOCTYPE html> <html> <head> <meta charset=&q ...
- 自定义悬浮按钮:FloatingButton
floating_button_layout.xml <?xml version="1.0" encoding="utf-8"?> <Rela ...
- 添加序号列(SQL Server)
SELECT ROW_NUMBER() OVER (ORDER BY 实际缴费金额 ) AS A, --序号 RANK() OVER (ORDER BY 实际缴费金额 ) AS B, --相同跳过从新 ...
- C++编译指令#pragma pack的配对使用
#pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...
- linux挂载查看、添加与取消
挂载概念: 查看挂载:df 添加挂载mount:mount 挂载的源 目的点 mount /dev/sdb1 /mnt mount挂载常用参数(Option) -t 指定文件系统类型,例如:-t ex ...
- pubwin数据云备份
由于pubwin自带的异地备份一直不好用,并且pubwin自带的37分钟备份也不方便手动备份,考虑用python 与写一个基于酷盘的pubwin数据备份工具(本来想基于百度云的,发现百度云用的人太多, ...