在VC中彻底玩转Excel

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

[原创]在VC中彻底玩转Excel如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。利用Automation技术,我们可以在不去了解数据库的情况下玩转Excel,而且你会发现一切竟如此轻松!好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,包括启动Excel,读取数据,写入数据,以及最后的关闭Excel,其中还包括了很多人感兴趣的合并单元格的处理。特别说明以下代码需要MFC的支持,而且工程中还要包含EXCEL2000的定义文件:EXCEL9.H,EXCEL9.CPPVC6.0操作Excel(2008-1-2211:26)1.建立一个空的单文档程序;2.加入Excel的库文件:在vc++的view菜单里面选classwizard,然后选Automationtab,再选AddClass,选Fromatypelibrary.,然后再选你需要的objectlibrary。(forthisexample,ifyouareautomatingExcel97,choosetheMicrosoftExcel8.0ObjectLibrary;thedefaultlocationisC:\ProgramFiles\MicrosoftOffice\Office\Excel8.olb).IfyouareautomatingMicrosoftExcel2000,chooseMicrosoftExcel9.0ObjectLibraryforwhichthedefaultlocationistheC:\ProgramFiles\MicrosoftOffice\Office\Excel9.olb.IfyouareautomatingMicrosoftExcel2002andMicrosoftOfficeExcel2003,theobjectlibraryisembeddedinthefileExcel.exe.ThedefaultlocationforExcel.exeinOffice2002isC:\programFiles\MicrosoftOffice\Office10\Excel.exe.ThedefaultlocationforExcel.exeinOffice2003isC:\programFiles\MicrosoftOffice\Office11\Excel.exe.在ListCtrl框中选中_Application,_Workbook,_Worksheet,Range,Sheets,Workbooks,单击OK,自动生成EXCEL8.H和EXCEL8.CPP文件(或者EXCEL9.H和EXCEL9.CPP或者EXCEL.H和EXCEL.CPP)。3.初始化COM库:在App类的InitInstance中一定要先加上AfxOleInit();因为操作Excel是属于COM自动化,需初始化COM库。4.加入Excel的头文件:文档类的CPP文件中包含头文件#includeexcel9.h,是关于Excel中各类的接口定义信息。如果excel9.h,excel9.cpp文件已经生成创建project,将示例文档中的excel9.h,excel9.cpp复制到工程目录,选Project--Addtoproject--File--excel9.h;Project--Addtoproject--File--excel9.cpp;在App的Initinstance中加入AfxOleInit();在Dlg的头文件中加入#includeexcel9.h代码中加入调用COM接口代码,编译即可,*****************************************************************************************************************//*****//变量定义_Applicationapp;Workbooksbooks;_Workbookbook;Worksheetssheets;_Worksheetsheet;Rangerange;RangeiCell;LPDISPATCHlpDisp;COleVariantvResult;COleVariantcovTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//*****//初始化COM的动态连接库if(!AfxOleInit()){AfxMessageBox(无法初始化COM的动态连接库!);return;}//*****//创建Excel2000服务器(启动Excel)if(!app.CreateDispatch(Excel.Application)){AfxMessageBox(无法启动Excel服务器!);return;}app.SetVisible(TRUE);//使Excel可见app.SetUserControl(TRUE);//允许其它用户控制Excel//*****//打开c:\\1.xlsbooks.AttachDispatch(app.GetWorkbooks());lpDisp=books.Open(C:\\\\1.xls,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);//*****//得到Workbookbook.AttachDispatch(lpDisp);//*****//得到Worksheetssheets.AttachDispatch(book.GetWorksheets());//*****//得到当前活跃sheet//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待lpDisp=book.GetActiveSheet();sheet.AttachDispatch(lpDisp);//*****//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列RangeusedRange;usedRange.AttachDispatch(sheet.GetUsedRange());range.AttachDispatch(usedRange.GetRows());longiRowNum=range.GetCount();//已经使用的行数range.AttachDispatch(usedRange.GetColumns());longiColNum=range.GetCount();//已经使用的列数longiStartRow=usedRange.GetRow();//已使用区域的起始行,从1开始longiStartCol=usedRange.GetColumn();//已使用区域的起始列,从1开始//*****//读取第一个单元格的值range.AttachDispatch(sheet.GetCells());range.AttachDispatch(range.GetItem(COleVariant((long)1),COleVariant((long)1)).pdispVal);COleVariantvResult=range.GetValue();CStringstr;if(vResult.vt==VT_BSTR)//字符串{str=vResult.bstrVal;}elseif(vResult.vt==VT_R8)//8字节的数字{str.Format(%f,vResult.dblVal);}elseif(vResult.vt==VT_DATE)//时间格式{SYSTEMTIMEst;VariantTimeToSystemTime(&vResult.date,&st);}elseif(vResult.vt==VT_EMPTY)//单元格空的{str=;}//*****//读取第一个单元格的对齐方式,数据类型:VT_I4//读取水平对齐方式range.AttachDispatch(sheet.GetCells());iCell.AttachDispatch((range.GetItem(COleVariant(long(1)),COleVariant(long(1)))).pdispVal);vResult.lVal=0;vResult=iCell.GetHorizontalAlignment();if(vResult.lVal!=0){switch(vResult.lVal){case1://默认break;case-4108://居中break;case-4131://靠左break;case-4152://靠右break;}}//垂直对齐方式iCell.AttachDispatch((range.GetItem(COleVariant(long(1)),COleVariant(long(1)))).pdispVal);vResult.lVal=0;vResult=iCell.GetVerticalAlignment();if(vResult.lVal!=0){switch(vResult.lVal){case-4160://靠上break;case-4108://居中break;case-4107://靠下break;}}//*****//设置第一个单元格的值HI,EXCEL!range.SetItem(COleVariant(1),COleVariant(1),COleVariant(HI,EXCEL!));//*****//设置第一个单元格字体颜色:红色Fontfont;range.AttachDispatch(sheet.GetCells());range.AttachDispatch((range.GetItem(COleVariant(long(1)),COleVariant(long(1)))).pdispVal);font.SetColor(COleVariant((long)0xFF0000));//*****//合并单元格的处理//包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并RangeunionRange;range.AttachDispatch(sheet.GetCells());unionRange.AttachDispatch(range.GetItem(COleVariant((long)1),COleVariant((long)1)).pdispVal);vResult=unionRange.GetMergeCells();if(vResult.boolVal==-1)//是合并的单元格{//合并单元格的行数range.AttachDispatch(unionRange.GetRows());longiUnionRowNum=range.GetCount();//合并单元格的列数range.AttachDispatch(unionRange.GetColumns());longiUnionColumnNum=range.GetCount();//合并区域的起始行,列longiUnionStartRow=unionRange.GetRow();//起始行,从1开始longiUnionStartCol=unionRange.GetColumn();//起始列,从1开始}elseif(vResult.boolVal==0){//不是合并的单元格}//将第一个单元格合并成2行,3列range.AttachDispatch(sheet.GetCells(

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功