这些天做个软件,需要读取 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 的方法总结的更多相关文章

  1. VBS操作Excel常见方法

    VBS操作Excel常见方法 作者: 字体:[增加 减小] 类型:转载 时间:2009-11-13我要评论 VBS控制Excel常见方法,需要的朋友可以参考下. dim oExcel,oWb,oShe ...

  2. 用VB操作Excel的方法

    VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报 ...

  3. unity3d 下操作excel 与打印

    原地址:http://www.colabug.com/thread-1146390-1-1.html 因项目需要,需在unity下实现写入excel.打印功能.因之前在winform里操作过excel ...

  4. C#操作excel(多种方法比较)

    1.用查询表的方式查询并show在数据集控件上. public static string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; D ...

  5. Ruby操作Excel的方法与技巧大全

    测试工作中,批量的数据通常会放到excel表格中,测试输出的数据写回表格中,这样输入输出易于管理,同时清晰明了 使用ruby来操作excel文件首先需要在脚本里包含以下语句 require'win32 ...

  6. 如何在没有安装微软Excel环境下操作Excel文件?

    在以前接触的项目中,由于很多客户对微软Excel的操作比较熟练,客户经常要求系统支持对Excel文件的读写.用.NET传统方法对Excel进行读写时,往往会涉及到不同版本兼容的问题,导致在本地测试一切 ...

  7. ubuntu下操作端口的方法

    最简单的一个操作:sudo ufw status可检查防火墙的状态,我的返回的是:不活动 sudo ufw version防火墙版本: ufw 0.29-4ubuntu1 Copyright 2008 ...

  8. 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)

    前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...

  9. NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别

    NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...

随机推荐

  1. Android(java)学习笔记260:JNI之native方法头文件的生成

    1. JDK1.6 ,进入到工程的bin目录下classes目录下: 使用命令: javah  packageName.ClassName 会在当前目录下生成头文件,从头文件找到jni协议方法 下面举 ...

  2. Swift - IBOutlet返回nil(fatal error: unexpectedly found nil while unwrapping an Optional value)

    在Swift 中 ViewController 默认构造方法不关联同名的xib文件 在使用OC的时候,调用ViewController的默认构造函数,会自动关联到一个与ViewController名字 ...

  3. itext poi 学习之旅 (3)读取数据库信息并由excel展现出来

    DBConnection.java 连接数据库操作 package com.zkbj.poi; import java.sql.Connection; import java.sql.DriverMa ...

  4. Ftp连接错误

    FTP连接上传 文件报错  windows无法访问此文件夹.请确保输入的文件名是否正确,并且您有权访问此文件.. 解决办法 : IE设置为脱机使用,文件浏览器登录ftp时调用IE浏览器,所以无法连接, ...

  5. Caesar cipher

    #include <iostream> using namespace std; int main() {int k,i; char s[5];  cin>>k;  for(; ...

  6. phpmyadmin自增字段

    自增字段必须为primary key 2种方法: 1- ALTER TABLE `qr_role` CHANGE `ROLE_ID` `ROLE_ID` INT(11) NOT NULL AUTO_I ...

  7. Number Sequence(HDU 1005 构造矩阵 )

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. new Handler()和new Handler(Looper.getMainLooper())的区别

    一个帖子的整理: Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别如果你不带参数的实例化:Handler ...

  9. hdu 畅通工程再续

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 #include <cstdio> #include <cstring> #inc ...

  10. LeetCode_Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...