您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > VC++操作EXCEL的方法
VC++操作EXCEL的方法2007年12月27日星期四下午04:53WorkbookswbsMyBooks;_WorkbookwbMyBook;WorksheetswssMysheets;_WorksheetwssMysheet;Rangerange;RangeiCell;LPDISPATCHlpDisp;COleVariantvResult;COleVariantcovTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);//创建Excel2000服务器(启动Excel),尽量在初始化中建立excel_app对象//以确保一次只打开一个excel服务器//if(!m_ExcelApp.CreateDispatch(Excel.Application))//{//AfxMessageBox(无法启动Excel服务器!);//return;//}//app.SetVisible(TRUE);//使Excel可见//ExcelApp.SetUserControl(TRUE);//允许其它用户控制Excel//打开c:\\*.xlswbsMyBooks.AttachDispatch(m_ExcelApp.GetWorkbooks());lpDisp=wbsMyBooks.Open(m_strPath,//此处无法打开文档没有问题covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);wbMyBook.AttachDispatch(lpDisp);//得到WorkbookwssMysheets.AttachDispatch(wbMyBook.GetWorksheets());//得到Worksheets//得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不能返回,会一直等待lpDisp=wbMyBook.GetActiveSheet();wssMysheet.AttachDispatch(lpDisp);//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列RangeusedRange;usedRange.AttachDispatch(wssMysheet.GetUsedRange());range.AttachDispatch(usedRange.GetRows());longiRowNum=range.GetCount();//已经使用的行数range.AttachDispatch(usedRange.GetColumns());longiColNum=range.GetCount();//已经使用的列数longiStartRow=usedRange.GetRow();//已使用区域的起始行,从1开始longiStartCol=usedRange.GetColumn();//已使用区域的起始列,从1开始//读取第iStartRow行,第iStartCol列单元格的值range.AttachDispatch(wssMysheet.GetCells());range.AttachDispatch(range.GetItem(COleVariant(iStartRow),COleVariant(iStartCol)).pdispVal);vResult=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(wssMysheet.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(long(1)),COleVariant(long(1)),COleVariant(HI,EXCEL!));//设置第一个单元格字体颜色:红色//CFontfont;//range.AttachDispatch(wssMysheet.GetCells());//range.AttachDispatch((range.GetItem(COleVariant(long(1)),COleVariant(long(1)))).pdispVal);//font(COleVariant((long)0xFF0000));//合并单元格的处理,包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并RangeunionRange;range.AttachDispatch(wssMysheet.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(wssMysheet.GetCells());unionRange.AttachDispatch(range.GetItem(COleVariant((long)1),COleVariant((long)1)).pdispVal);unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2),COleVariant((long)3)));unionRange.Merge(COleVariant((long)0));//合并单元格}//将文件保存为*.xlsm_ExcelApp.SetVisible(TRUE);CStringstrtmp=m_strPath.Left(m_strPath.ReverseFind('.'))+.xls;//这里应该确保strtmp为有效路径,否则的话该函数会自己处理异常,导致以后的语句没有执行,没有关闭打开的文档wbMyBook.SaveAs(COleVariant(strtmp),covOptional,covOptional,covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional);//关闭所有的book,退出ExcelwbMyBook.Close(covOptional,COleVariant(),covOptional);wbsMyBooks.Close();//m_ExcelApp.Quit();*******************************************************在BOOLCExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:if(CoInitialize(NULL)!=0){AfxMessageBox(初始化COM支持库失败!);exit(1);}在returnFALSE;语句前,加入:CoUninitialize();选择Menu-View-ClassWizade,打开ClassWizade窗口,选择AddClass-Fromatypelibrary,选择D:\ProgramFiles\MicrosoftOffice\office\Excel9.OLB(D:\ProgramFiles\MicrosoftOffice\是本机上MicrosoftOffice2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。在ExcelTestDlg.cpp文件的头部,#includeExcelTestDlg.h语句之下,增加:#includecomdef.h#includeExcel9.h在voidCExcelTestDlg::OnExceltest()函数中增加如下代码:voidCExcelTestDlg::OnExceltest(){_ApplicationExcelApp;WorkbookswbsMyBooks;_WorkbookwbMyBook;WorksheetswssMysheets;_WorksheetwsMysheet;RangergMyRge;//创建Excel2000服务器(启动Excel)if(!ExcelApp.CreateDispatch(Excel.Application,NULL)){AfxMessageBox(创建Excel服务失败!);exit(1);}//利用模板文件建立新文档wbsMyBooks.A
本文标题:VC++操作EXCEL的方法
链接地址:https://www.777doc.com/doc-6327156 .html