热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在VS2008下操作Excel的方法总结

这些天做个软件,需要读取Excel并导入到数据库中,所以研究了一下在VC下操作Excel的方法,这里做个总结,以作备忘。一、最常用的OLE自动化方式这个方式应该说是功能最全的方式,可

这些天做个软件,需要读取 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 了,嘿嘿

 

最后来张图:

截图


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • d3dx9_26.dll极品飞车9修复工具下载及修复教程
    本文介绍了d3dx9_26.dll文件的修复工具下载和修复教程,解释了该dll文件的作用和安装方法,同时提供了其他dll文件下载安装的方法。文章涵盖了3d、windows、p2p、dll、visual studio等知识点,并由未来可期1212投稿。希望该技术和经验能帮到你解决dll文件相关技术问题。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
m13380107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有