最近研究了一下Excel编程相关内容,原因是帮团委校对数据,需要校对的数据是人工录入的可能会存在错误,比如学号或者姓名。正确的数据是从数据库导出的Excel文件。最后效果图如下:
读写Excel方式大致分为三种:
1.采用数据库方式连接,ODBC/ADO。
使用时必须安装xls的ODBC驱动,一般情况下都是随着Excel一起安装的。不过也有例外,如果你使用的是64位的系统,会发现xls的驱动没有,这是因为目前还没有xls的64位驱动,我使用的就是64位Windows,最后在虚拟机(XP)上完成的程序,顺带可以测试下。编写时发现,使用ADO方式,后台还是运行了Excel的进程,说明最根本还是第二种方法。
ADO编程模型(ADO2.5版本还加入了Stream对象,处理大数据;后来还有ADOX,扩展版本)
2.COM Automation,或者叫做互操作(C++ COM Interop),这就必须要了解Excel对象模型
其中最常用的是Application/Workbook/WorkSheet/Range类,使用它们的属性和方法就能实现绝大多数操作。这方面的资料很多是VBA的,转换成C++代码时注意将COM数据类型转换成对应的数据类型(例如,使用_variant_t和_bstr_t类型来包装COM下的VARIANT结构和BSTR指针)。ADO和Excel对象模型都是COM组件,微软提供了智能指针模板例如_ConnectionPtr/_RecordsetPtr/_ApplicationPtr/,就可以避免使用COM时的引用计数和释放等复杂操作了。
3.直接分析xls格式,这是依赖性最低的一种方法不需要安装Excel或数据库驱动,适合与没有复杂数据与图表的Excel文件。CodeProject上有两篇文章,miniExcel和Basic_Excel就是这种方法。还有就是第三方的控件或者库,多半是商业版,例如华表的Excel读写控件,LibXL(功能强大)。
几点感触是:在Windows下面编程,肯定会和COM打交道,所以应当重视起来,还有就是MFC框架,虽然用的很熟悉,但是确实笨重了一点,很多时候明显感觉到坏代码的味道:较长的方法,重复的代码,资源文件应当与代码分离…,就算分离出来,可复用性也不高,看来还得努力提高提高,WTL/ATL是不错的选择。互操作还是很有前途的。C++/COM/.NET之间的交互令人兴奋。
几篇很不错的参考资料:
http://blog.csdn.net/bodybo/archive/2009/05/27/4220561.aspx
在VC中使用智能指针操作Excel
http://msdn.microsoft.com/zh-cn/library/wxks80sb.aspx
如何:以编程方式对工作表中的数据进行排序
http://support.microsoft.com/kb/257819/zh-cn#RetrieveExcel
如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据
http://conkeyn.javaeye.com.sixxs.org/blog/229992
VC++数据类型转换大全
http://www.cnblogs.com/sensizhe/archive/2009/04/01/1427362.html
VC 利用ADO操作Excel
还有就是CodeProject和CodeGuru中的几篇很好的文章就不列举了。