资源预览内容
第1页 / 共35页
第2页 / 共35页
第3页 / 共35页
第4页 / 共35页
第5页 / 共35页
第6页 / 共35页
第7页 / 共35页
第8页 / 共35页
第9页 / 共35页
第10页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
VC+操作EXCEL的方法 2007年12月27日 星期四 下午 04:53Workbooks wbsMyBooks; _Workbook wbMyBook;Worksheets wssMysheets; _Worksheet wssMysheet;Range range; Range iCell;LPDISPATCH lpDisp;COleVariant vResult;COleVariant covTrue(short)TRUE), covFalse(short)FALSE), covOptional(long)DISP_E_PARAMNOTFOUND, VT_ERROR); /创建Excel 2000服务器(启动Excel),尽量在初始化中建立excel_app对象 /以确保一次只打开一个excel服务器/ if(!m_ExcelApp.CreateDispatch(Excel.Application) / / AfxMessageBox(无法启动Excel服务器!);/ return;/ /app.SetVisible(TRUE); /使Excel可见 /ExcelApp.SetUserControl(TRUE); /允许其它用户控制Excel /打开c:*.xls wbsMyBooks.AttachDispatch(m_ExcelApp.GetWorkbooks(); lpDisp = wbsMyBooks.Open(m_strPath,/此处无法打开文档没有问题 covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); wbMyBook.AttachDispatch(lpDisp);/得到Workbook wssMysheets.AttachDispatch(wbMyBook.GetWorksheets();/得到Worksheets /得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不能返回,会一直等待 lpDisp = wbMyBook.GetActiveSheet(); wssMysheet.AttachDispatch(lpDisp); /读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列 Range usedRange; usedRange.AttachDispatch(wssMysheet.GetUsedRange(); range.AttachDispatch(usedRange.GetRows(); long iRowNum = range.GetCount(); /已经使用的行数 range.AttachDispatch(usedRange.GetColumns(); long iColNum = range.GetCount(); /已经使用的列数 long iStartRow = usedRange.GetRow(); /已使用区域的起始行,从1开始 long iStartCol = usedRange.GetColumn(); /已使用区域的起始列,从1开始 /读取第iStartRow行,第iStartCol列单元格的值 range.AttachDispatch(wssMysheet.GetCells(); range.AttachDispatch(range.GetItem(COleVariant(iStartRow),COleVariant(iStartCol).pdispVal); vResult = range.GetValue(); CString str; if(vResult.vt = VT_BSTR) /字符串 str = vResult.bstrVal; else if (vResult.vt = VT_R8) /8字节的数字 str.Format(%f, vResult.dblVal); else if(vResult.vt = VT_DATE) /时间格式 SYSTEMTIME st; VariantTimeToSystemTime(vResult.date, &st); else if(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) case 1: /默认 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!); /设置第一个单元格字体颜色:红色/ CFont font;/ range.AttachDispatch(wssMysheet.GetCells();/ range.AttachDispatch(range.GetItem (COleVariant(long(1), COleVariant(long(1).pdispVal);/ font(COleVariant(long)0xFF0000); /合并单元格的处理,包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并 Range unionRange; 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(); long iUnionRowNum=range.GetCount(); /合并单元格的列数 range.AttachDispatch(unionRange.GetColumns(); long iUnionColumnNum=range.GetCount(); /合并区域的起始行,列 long iUnionStartRow=unionRange.GetRow(); /起始行,从1开始 long iUnionStartCol=unionRange.GetColumn(); /起始列,从1开始 else if(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); /合并单元格 /将文件保存为*.xls m_ExcelApp.SetVisible(TRUE); CString strtmp = m_strPath.Left(m_strPath.ReverseFind(.) + .xls;/这里应该确保strtmp为有效路径,否则的话该函数会自己处理异常,导致以后的语句没有执行,没有关
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号