您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > MFC中使用EXCEL2010方法
使用MFC操作EXCEL文件一、加载1、在VC6.0里创建一个MFC工程2、打开MFCClassWizard窗口(查看—建立类向导),选择Automation,单击AddClass按钮,选择Fromatypelibrary...,弹出文件选择对话框,之后定位到C:\ProgramFiles\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图。3、返回编辑器,查看工程文件,可发现多了EXCEL.H及EXCEL.CPP两个文件,拷贝出来,放在VS2005需要使用excel的工程文件中。4.打开stdafx.h头文件确保包含如下头文件:#includeafxdisp.h(这个一般有了)#includeexcel.h(手动添加这个即可)5.打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:if(!AfxOleInit()){AfxMessageBox(初始化Ole出错!);returnFALSE;}为保证编译时不产生重复定义错误(可以验证一下是否成功加载,没有也能正常执行),我编译时出现了很多“类重复定义”异常,打开excel.h文件,在文件开始位置加入如下代码:#if!defined_HEAD_FILE_EXCEL9_#define_HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif成功二、操作EXCEL文件1.新建一个excel表,并填充两个单元格的实例voidCTestExcelDlg::OnButton1(){//Workbooks—Workbook—Worksheets—Worksheet—Range_Applicationapp;//Excel应用程序接口Workbooksbooks;//工作薄集合_Workbookbook;//工作薄Worksheetssheets;//工作表集合_Worksheetsheet;//工作表Rangerange;//Excel中针对单元格的操作都应先获取其对应的Range对象Fontfont;Rangecols;/*COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant类来转换了的。*///covOptional可选参数的VARIANT类型COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);if(!app.CreateDispatch(Excel.Application)){this-MessageBox(无法创建Excel应用!);return;}//获取工作薄集合books=app.GetWorkbooks();//添加一个工作薄book=books.Add(covOptional);//获取工作表集合sheets=book.GetSheets();//获取第一个工作表sheet=sheets.GetItem(COleVariant((short)1));//选择工作表中A1:A1单元格区域range=sheet.GetRange(COleVariant(A1),COleVariant(A1));//设置A1=HELLOEXCEL!range.SetValue(COleVariant(HELLOEXCEL!));//调整格式,设置粗体font=range.GetFont();font.SetBold(COleVariant((short)TRUE));//选择A2单元格,插入一个公式=RAND()*100000,并设置A2数字格式为货币形式range=sheet.GetRange(COleVariant(A2),COleVariant(A2));range.SetFormula(COleVariant(=RAND()*100000));range.SetNumberFormat(COleVariant($0.00));//选择A:A列,设置宽度为自动适应cols=range.GetEntireColumn();cols.AutoFit();//显示Excel表格,并设置状态为用户可控制app.SetVisible(TRUE);app.SetUserControl(TRUE);2.打开一个已有的excel表格实例CStringstrPath;strPath+=C:\\template.xlt;//模板的路径CFileFindfilefind;if(!filefind.FindFile(strPath)){AfxMessageBox(没有找到模版文档,请其查找);return;}LPDISPATCHlpDisp;//接口指针books=app.GetWorkbooks();lpDisp=books.Open(m_filepath,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);//与的不同,是个参数的,直接在后面加了两个covOptional成功了book.AttachDispatch(lpDisp);3.保存一个excel文件实例book.SetSaved(TRUE);4.另存一个excel文件实例book.SaveAs(COleVariant(m_filename),covOptional,covOptional,covOptional,covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,covOptional,covOptional);//与的不同,是个参数的,直接在后面加了两个covOptional成功了5.释放一个excel文件实例经试验证实,不释放第二次使用excel时会中断,放在类的析构里面有时调用不到,主动调用最保险。(有没有AttachDispatch()过都要释放,否则报错)//释放对象(相当重要!)Rang.ReleaseDispatch();sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();books.ReleaseDispatch();//退出程序app.Quit();//m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错app.ReleaseDispatch();6.修改一个excel单元格range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));range.SetValue2(COleVariant(value));7.取出一个excel单元格实现Variant数据类型转换为CString类,这个只是一个示例,转换较为简单。range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));COleVariantrValue;rValue=COleVariant(range.GetValue2());rValue.ChangeType(VT_BSTR);returnCString(rValue.bstrVal);8.还有释放问题是最重要的问题:首先变量必须全释放,无论当初是否绑定过;其次,程序释放和程序关闭的顺序必须是app.Quit();app.ReleaseDispatch();如果顺如颠倒如下:app.ReleaseDispatch();app.Quit();出现的后果是程序关闭后,excel进程仍然运行,所以无法正常打开程序曾经打开excel表格。附录(操作类源码):#include../Stdafx.h#includeOptExcel.h#includeexcel.h#includecomdef.h_Applicationapp;Workbooksbooks;_Workbookbook;Worksheetssheets;_Worksheetsheet;Rangerange;Rangecell;Fontfont;COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);///////////////////////////////////////////////////////////////////////////Function:COptExcel///Description:初始化函数,初始化中附加excel应用程序///Call:app.CreateDispatch(_T(Excel.Application)////////////////////////////////////////////////////////////////////////COptExcel::COptExcel(void){if(::CoInitialize(NULL)==E_INVALIDARG){AfxMessageBox(_T(初始化Com失败!));return;}//验证office文件是否可以正确运行if(!app.CreateDispatch(_T(Excel.Application))){AfxMessageBox(_T(无法创建Excel应用!));return;}//在程序执行文件路径名中,剪掉执行文件名,得到程序路径,追加模板文件名,得到模板完整路径}///////////////////////////////////////////////////////////////////////////Function:~COptExcel///Description:析构函数,释放对象,非常重要,不全部释放,占用内存,下///一次使用此类时会中断///Call:ReleaseDispatch()////////////////////////////////////////////////////////////////////////COptExcel::~COptExcel(void){books.ReleaseDispatch();book.ReleaseDispatch();sheets.ReleaseDispatch();sheet.ReleaseDispatch();range.ReleaseDispatch();font.ReleaseDispatch();cell.ReleaseDispatch();app.Quit();app.ReleaseDispatch();::CoUninitialize();}///////////////////////////////////////////////////////////////////////////Function:OpenExcelBook///Description:打开表名为filename的文件,注意,文件路径非自动生成,以后///考虑从下处理方法///Call:GetAppPath()///Input:CStringfilename文件名/////////////////////////////////////////////////////////
本文标题:MFC中使用EXCEL2010方法
链接地址:https://www.777doc.com/doc-1387407 .html