肖 峰
(1.安徽大学;2.安徽职业技术学院 学生处,安徽 合肥 230001)
VC++读写Excel的接口和应用研究
肖峰1,2
(1.安徽大学;2.安徽职业技术学院学生处,安徽合肥230001)
摘要:电子表格软件Excel以其操作简单、功能强大,在社会中得到了广泛的应用.文章通过研究COM技术,研究了EXCEL的接口函数,借助面向对象编程工具VC++,制作了功能齐全而强大的Excel文件操作类;使程序开发人员能够将注意力集中于需要解决的问题,而不是如何操作Excel文件上.并结合实际教学工作中经常遇到的学生成绩统计为例,全面介绍了一个系统完整的实现过程,对数据报表的处理和更高级别的具体应用具有一定的借鉴意义.
关键词:VC++;Excel;COM;数据处理
在当前的程序设计中,不仅仅需要进行繁杂的数学计算和逻辑处理,而且也需要对数据的输入和输出以报表或者表格的形式来存储.Visual C++作为比较常用的可视化开发工具,具有良好的计算处理、灵活的界面设计和多样化的接口处理等功能,并且在代码效率和执行效率上有优异的表现.但是在对一些数据和报表的处理上,很难达到让人非常满意的效果.电子表格软件Excel是office办公软件的重要成员.作为一种简单易用、功能强大的办公软件,在社会上得到越来越广泛的应用.所以,将VC++和Excel结合起来,在程序中实现数据的输入和输出具有非常重要的价值.
文中程序均已经在VC++2010下编译通过,并能够在Excel 2007下完成指定功能.
COM(Component Object Model)技术是微软公司提出的一种接口和应用实现的规范.Excel就是一种基于COM技术的应用程序,通过特定的接口可将其内部对象开放给其他应用程序,这样外部程序就可以通过这些接口来实现对Excel中的对象模型进行操作.
要通过COM技术对Excel对象进行操作,必须与Excel对象模型提供的对象进行交互,Excel的对象模型中有超过100个对象模型,程序设计中常用的对象有Application、Workbook、Worksheet、Range等:
Application:代表Excel,处于模型的最上层.
Workbook:指Excel中的工作簿,相当于通常所说的Excel文件.需要注意的是,Workbook中包括Worksheet. Worksheet是Workbook中独立的页,可以有多个,数据就保存在Worksheet中.
Worksheet:Worksheet中包括单元格(Cell).Worksheets是所有Worksheet对象的集合.
Range:Excel中基本的操作是通过对范围(Range)对象进行处理而实现的.Range是指一个或者多个连续的单元格区域.
一般来说,操作Excel对象的步骤如下:(1)建立Application对象.
(2)建立Workbooks对象.
(3)建立Workbook和Worksheet对象.
(4)通过调用Worksheet对象的方法和属性操作文件中的详细内容.
(5)依次关闭Worksheet、Workbook、Workbook是和Application对象.
在使用Excel对象之前,必须插入一个Excel类,步骤如下:
(1)建立一个标准的基于MFC的工程.
(2)在工程名上点击鼠标右键,选择”Add→Class”,在弹出的对话框中选择”MFC Class From TypeLib”会弹出一个导入对话框.
(3)在”Available type libraries:”选择框中选择”Microsoft Excel 12.0 type Library<1.6>”,Interfaces列表框中会出现excel所有的对象模型.在列表框中的对象模型里选择我们需要的类.
(4)进入几个刚生成的类头文件中将”#import”开头的这行注释掉.
这样我们就把Excel对象模型中的对象导入到VC++中了.
为了在VC++实现方便快捷的操作Excel,我们可以对这些导入的Excel对象模型的方法和属性进一步的包装和抽象,使其调用更加简单.
创建一个新的类CExcelLib,在这个类中实现Excel的所有操作.CExcelLib类直接调用Excel内部函数,完成读取、写入、保存和设置格式等操作.
3.1初始化Excel对象
在这里我们可以在类CExcelLib的构造函数中创建Excel.Application对象,如果创建成功,则使用已经完成初始化的Application对象m_Excel创建工作簿组对象并将其关联到类成员变量m_bojBooks.
3.2打开和创建Excel文件
通过文件名在已经完成初始化的Workbooks对象打开对应的工作簿(Workbook)并将其关联到成员变量m_Book.
m_Book=m_Books.Open(szFileName, vt, vt, vt,vt, vt, vt, vt, vt,vt, vt, vt, vt, vt, vt);
如果是创建一个新文件则使用如下的方法.通过加载excel空白模板的方式,创建一个excel文件,默认的文件名是Book1.
m_Book = m_Books.Add(vt);
经初始化成功的workbook对象获取表单对象集(Worksheets)并将之关联到一个Worksheets变量上,通过枚举的方式查找和指定表单名匹配的worksheet,并将它关联到成员变量m_Sheet.
如果是创建一个新表单,可以采用如下的代码来创建一个指定名字的新表单.
Worksheets objSheets = m_Book.GetWorksheets();
m_Sheet = objSheets.Add(vt,vt,vt,vt);
m_Sheet.SetName(szSheetName);
这步完成后,我们已经把一个excel文件操作所需要的对象均已构建、关联完毕.
3.3单元格操作
(1)合并/解除合并单元格
合并单元格是Excel经常用到的操作,输入参数有四个,前两个参数是开始位置单元格的行号和列号,后两个参数是结束单元格的行号和列号.
Range objRange=m_Sheet.GetRange (Variant (rc2a1 (ROW1,COL1)), OleVariant(rc2a1(ROW2, COL2)));
objRange.Merge(vt);
除合并单元格的方法和合并单元格的方法类似.
(2)填写单元格内容
把预先定义的值填写到指定的某一单元格中.因为参数中传入的值仅支持字符串类型的值,需要我们事先把其他类型的值转为字符串形式,然后再填写到指定的单元格中.
m_Range.SetItem(Variant(lRow), Variant(lCol), Variant (szText));
用类似的方法可以读取表单中指定单元格的内容. (3)设置背景色
设置指定的一个单元格或者多个单元格的背景色.
Range objRange=m_Sheet.GetRange (Variant (rc2a1 (ROW1, COL1)),Variant(rc2a1(ROW2,COL2)));
((Interior)objRange.GetInterior ()).SetColor (_variant_t ((long)Color));
(4)设置对齐方式
设置指定单元格的对齐方式,可以同时指定单个或者多个单元格.同时对单元格的水平和垂直对齐方式进行设定.如果水平或者垂直对齐方式的输入值是0,则认为是不对此方向上的对齐方式作出新的设定.水平对齐常用的值有:1默认对齐方式,-4108居中对齐,-4131左对齐,-4152右对齐.垂直对齐常用的值有:2默认对齐方式,-4108居中对齐,-4160左对齐,-4107右对齐.
关于单元格的操作还有很多,比如设置字体的大小、颜色,设置行高、列宽以及在指定的单元格设置边框等等,这里不再一一详细描述.
3.4保存和退出
当把Excel的内容编辑完成之后,保存的时候传入指定的文件路径,调用SaveAs功能把整个文件保存到电脑上.
Excel在退出的时候必须按照指定的顺序释放对象:
m_Range.ReleaseDispatch();
m_Sheet.ReleaseDispatch();
m_Book.ReleaseDispatch();
m_Books.ReleaseDispatch();
delete m_Excel;
下面以教学工作中经常能遇到的学生考试成绩统计为例来说明如何使用VC++来操作Excel文件.
(1)假设学生信息数据库存储着学生姓名、学号、班级、科目、考试分数等信息,也可以从相关联的数据库中查到授课老师的信息,我们可以把这些信息都导出到Excel文件中.
(2)执行导出操作将数据到Excel文件.
假设我们已经定义CExcelLib的成员变量实例.并且已经关联到本地空白的excel文件,然后把从数据库中得到的信息写入excel文件中.
先创建一个Excel对象和三个工作表,分别是数学、英语和网络,并且把数学表单激活作为当前的工作表单.并且对表头进行简单的设置.
假设已经获取数据库连接对象,对数据库中的学生学号、姓名、成绩进行读取,并对成绩进行判断,如果60分以上为及格,否则不及格.
这些操作完成后,整个输出过程全部完成.
通过上面的代码把指定某个班级全部学生数学这门课程的考试分数信息全部输出到Excel文件.使用类似的操作可以把英语和网络的成绩统计输出到Excel文件中.
当这些操作全部完成后,调用保存函数把当前文件保存为指定的文件名.
(3)数据输入
当Excel文件作为外部数据输入源,需要把文件中的大批量的数据存储到数据库时,使用程序设计也可以使这一过程大大方便和简化.
基本的处理过程是使用类CExcelLib把数据逐条读出来,经过一定的处理后把这些数据通过数据连接写入数据库,直到Excel文件中的数据被全部读完.这样所有的数据就都被保存到数据库了.
本文使用VC++实现操作Excel文件,并把具体的操作方法封装为一个类,并应用此类完成学校考试成绩统计的运算处理工作.Excel是一种功能强大、界面友好的电子表格工具软件,当用户处理的数据量不是特别大的时候,使用Excel会使工作变得更简单;但随着数据量的增大,特别是处理大批量重复性数据时,就会显得效率比较低下.因此,使用程序设计来完成这种工作具有实用性和必要性.
参考文献:
〔1〕郝建,张红瑞,吕延岗.VC++和Excel对象接口的研究与应用[J].石家庄铁道学院学报(自然科学版),2009,22(4): 75-78.
〔2〕杜诗雨,王子源.Visual C++操作Excel的应用研究[J].计算机与现代化,2011(8):201-203.
〔3〕王文会,陈静,严翠玲.VC++中用Excel实现数据库表的导入与导出[J].河北工业科技,2008,25(6):382-385.
〔4〕潘爱民.COM原理与应用[M].北京:清华大学出版社,1999.
〔5〕潘爱民,等译.Visual C++技术内幕(第4版)[M].北京:清华大学出版社,2004.
收稿日期:2015年10月19日
中图分类号:TP317.3
文献标识码:A
文章编号:1673-260X(2016)02-0016-02