您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > VC++2010版怎么调用、读取和写入EXCEL2010版
VC++2010版怎么调用、读取和写入EXCEL2010版信息化技术在教学管理工作中的应用实践——VC++应用Automation技术完成Excel复杂管理工作摘要:电子表格软件Excel以其操作简单、功能强大,被全社会广泛应用。但随着应用深入,用户日益扩大的专业化需求与相对滞后的Excel通用工具之间的矛盾越来越突出。文章运用Automation技术,借助面向对象编程系统VC++,精心制作Excel文件操作类;使程序开发人员能够将注意力集中于需要解决的问题,而不是如何操作Excel文件上。作者结合实际工作,以“正方现代教学管理信息系统”导出的全院学生成绩为基础,应用此操作类编写应用软件,分学科、教师、班级,完成学院级期末考试不及格率的统计,为评教、评学工作提供数据依据。关键字:VC++;Automation;Excel;数据统计;正方现代教学管理信息系统一、引言Excel是微软办公套装软件Office的一个重要组成部分,它可以进行各种数据的处理、统计分析操作。因其入门简单、集成工具功能强大,被广泛地应用于管理、统计、财经、金融等众多领域。但随着Excel应用范围不断扩大,应用层次不断深入,专业领域中许多工作无法直接通过集成工具得到满意的结果。如何高效、准确地获得管理数据,已经成为衡量员工能力和工作质量的重要标准。Automation自动化技术是微软公司推出的一个技术标准,是OLE技术的进一步扩展。自动化技术使应用程序能够对另一个应用程序中实现的对象进行操作,或者将对象公开以便可以对其进行操作。自动化服务器是向其他应用程序(称为自动化客户端)公开可编程对象(称为自动化对象)的应用程序[1]。Excel被设计成为一个自动化服务器,可将其内部对象公开给其他应用程序,以供调用。VC++是一种面向对象的可视化集成编程系统。使用VC++编写程序,可以通过自动化技术对Excel文件直接操作,能够满足各领域对数据管理工作的复杂需求。本文首先构造Excel操作类,使读者能够将注意力集中于需要解决的问题上,从而提高程序开发效率,缩短开发周期;然后结合实际工作,应用此类编写学院级期末考试不及格率的统计程序。文中程序均已通过VC++2010编译,并能够在Excel2003支持下完成预设功能。二、Excel层次结构要通过Automation技术对Excel进行操作,必须与Excel对象模型提供的对象进行交互。Excel提供了一百多个可能需要与之交互的对象,但程序设计主要集中在以下六个,如图1所示。[2]Application对象表示整个应用程序,处于模型的最顶层。Workbooks对象作为所有Workbook对象的集合包含在Application对象中。Worksheets对象作为所有Worksheet对象的集合包含在Workbook对象中。Range代表一个或者若干连续单元格区域。[3]三、构建ExcelOperate类ExcelOperate类通过Automation技术直接调用Excel内部函数,完成查找、读取、写入、存储等基本操作。它由头文件ExcelOperate.h和定义文件ExcelOperate.cpp组成。头文件用于保存类中成员变量、函数的声明;定义文件主要保存成员函数的程序实现。(一)ExcelOperate类函数调用流程根据Excel层次结构,要对其进行操作必须按顺序创建和关联一系列对象。ExcelOperate类函数调用流程如图2所示。(二)头文件ExcelOperate.h#includecomdef.h#includeatlstr.hclassExcelOperate{public:CRangem_TemRge;//用于保存用户设定区域ExcelOperate();//构造函数virtual~ExcelOperate();//析构函数staticvoidInitExcel();//初始化Excel.Application对象boolOpen(CStringFileName);//打开Excel数据文件boolLoadSheet(intiIndex);//载入已打开Excel文件中第iIndex个表单long*FindCell(CStringCellContext);//全表单查找long*FindInRge(CStringCellContext,longStartX,longStartY,longEndX,longEndY);//范围查找voidSaveExcel();//保存文件voidSaveNewFile(CStringFileName);//新建Excel文件,并保存CStringGetCell(intiRow,intiColumn);//读取单元格数据voidWriteInCell(longx,longy,CStringstr);//写入单元格数据voidAppendDataRow(CStringstr1,CStringstr2,CStringstr3,CStringstr4,CStringstr5);//向表单中追加数据行intGetRowCount();//取得当前表单已经使用的总行数voidCloseBook();//关闭Excel文件voidShowInExcel(boolbShow);//设置是否在程序运行过程中显示Excel文件voidSetRange(VARIANTx,VARIANTy);//将一个矩形区域保存到成员变量m_TemRge中CStringColumnNumToAlphameric(longrow,longcol);//将数字坐标转换为字母列数字行的形式,如“A7”private:staticCApplicationm_ExcelApp;//静态Application对象CWorkbooksm_Books;//工作簿组对象CWorkbookm_Book;//工作簿对象CWorksheetsm_sheets;//表单组对象CWorksheetm_sheet;//表单对象CRangem_Rge;//区域对象,保存表单整个区域CStringm_FileName;//保存已经打开的Excel文件名};(三)程序文件ExcelOperate.cpp1.引入头文件#includeStdAfx.h#includeExcelOperate.h2.静态成员初始化CApplicationExcelOperate::m_ExcelApp=NULL;3.构造和析构函数ExcelOperate::ExcelOperate()//构造函数{}ExcelOperate::~ExcelOperate()//析构函数{m_Rge.ReleaseDispatch();m_sheet.ReleaseDispatch();m_sheets.ReleaseDispatch();m_Book.ReleaseDispatch();m_Books.ReleaseDispatch();m_ExcelApp.Quit();m_ExcelApp.ReleaseDispatch();}4.初始化Excel服务器初始化Excel.Application对象,如果过程中出现错误,则提示失败信息。由于m_ExcelApp为静态成员,所以在整个程序执行过程中,不论需要声明多少个类的对象,只需初始化一次即可。voidExcelOperate::InitExcel(){if(!m_ExcelApp.CreateDispatch(_T(Excel.Application),NULL)){AfxMessageBox(_T(创建Excel服务失败!));exit(1);}}5.打开Excel文件首先,使用已经完成初始化的Application对象m_ExcelApp创建工作簿组对象(Workbooks),并将其关联到类成员变量m_Books。然后,将参数FileName指示的Excel文件作为一个工作簿(Workbook),添加到m_Books中,并关联到类成员变量m_Book;提取其中所有表单(Worksheets),添加到类成员变量m_sheets中。最后,将文件名保存到成员变量m_FileName备用。boolExcelOperate::Open(CStringFileName){m_Books.AttachDispatch(m_ExcelApp.get_Workbooks(),true);LPDISPATCHlpDis=NULL;lpDis=m_Books.Add(_variant_t(FileName));if(lpDis){m_Book.AttachDispatch(lpDis);m_sheets.AttachDispatch(m_Book.get_Worksheets(),true);m_FileName=FileName;returntrue;}returnfalse;}6.载入表单引用存有指定Excel文件所有表单的成员变量m_sheets,取得指定索引序号iIndex的表单,将其关联到类成员变量m_sheet。将该表单中被使用单元格区域关联到类成员变量m_Rge。至此,对Excel文件操作所必需的对象均已构建、关联完毕。boolExcelOperate::LoadSheet(intiIndex){LPDISPATCHlpDis=NULL;m_Rge.ReleaseDispatch();m_sheet.ReleaseDispatch();lpDis=m_sheets.get_Item(_variant_t((long)iIndex));if(lpDis){m_sheet.AttachDispatch(lpDis,true);m_Rge.AttachDispatch(m_sheet.get_Cells(),true);returntrue;}returnfalse;}7.全表单查找在整个表单的范围内,精确查找参数CellContext内容。如果找到,则返回第一个匹配单元格的横纵坐标;如果没找到,则横纵坐标均返回-1。long*ExcelOperate::FindCell(CStringCellContext){LPDISPATCHlpDis=NULL;long*a=newlong[2];a[0]=long(-1);a[1]=long(-1);CRangemyRange=m_Rge;lpDis=myRange.Find(_variant_t(CellContext),vtMissing,vtMissing,vtMissing,vtMissing,_variant_t((long)1),vtMissing,vtMissing,vtMissing);if(lpDis){myRange.AttachDispatch(lpDis,true);long*b=newlong[2];b[0]=myRange.get_Row();b[1]=myRange.get_Column();CStringm_Temp;m_Temp=GetCell(b[0],b[1]);if(m_Temp.GetLength()==CellContext.GetLength()){a[0]=b[0];a[1]=b[1];}}myRange.ReleaseDispatch();returna;}8.范围查找从单元格坐标(StartX,StartY)到(EndX,EndY)的矩形区域中查找CellContext内容,如果找到,则返回第一个匹配单元格的横纵坐标;如果没找到,则横纵坐标均返回-1。long*ExcelOperate::FindInRge(CStringCellContext,longStartX,longStartY,longEndX,longEndY){LPDISPATCHlpDis=NULL;long*a=newlong[2];a[0]=long(-1);a[1]=long(-1);if(StartXEndX||StartYEndY){returna;
本文标题:VC++2010版怎么调用、读取和写入EXCEL2010版
链接地址:https://www.777doc.com/doc-5100880 .html