MFC中使用EXCEL方法及源码_第1页
MFC中使用EXCEL方法及源码_第2页
MFC中使用EXCEL方法及源码_第3页
MFC中使用EXCEL方法及源码_第4页
MFC中使用EXCEL方法及源码_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用MFd作EXCEL:件一、加载1、在VC6.0里创建一个MFC:程2、打开MFC ClassWizard窗口(查看一 >建立类向导),选择Automation ,单击Add Class 按钮,选择From a type library.,弹出文件选择对话框,之后定位到 C:Program FilesMicrosoft OfficeOFFICE11EXCEL.EXE ,在生成类中添加所有的对象(其实添加需 要的即可,为了简便,不出错保留了冗余),如下图。3、返回编辑器,查看工程文件,可发现多了EXCEL.H及EXCEL.CPP两个文件,拷贝出来,放在VS2005需要使用excel的工程

2、文件中。4 .打开stdafx.h头文件确保包含如下头文件:#include <afxdisp.h> (这个一般有 了)#include "excel.h"(手动添加这个即可)5 .打开TestExcel.cpp 文件,修改 CTestExcelApp:InitInstance(),加入如下代码:if( !A仅OleInit()AfxMessageBox("初始化 Ole 出错!"力 return FALSE;没有也能正常执文件,在文件开始位为保证编译时不产生重复定义错误(可以验证一下是否成功加载, 行),我编译时出现了很多“类重复定义”异常

3、,打开 excel.h 置加入如下代码:#if !defined _HEAD_FILE_EXCEL9_#define _HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif成功二、操作EXCE文件1 .新建一个excel表,并填充两个单元格的实例void CTestExcelDlg:OnButton1()/Workbooks >Workbook >Worksheets >Worksheet >RangeApplication app;Workbooks books;_Workbook book;Worksheets sheets;/Excel应用程序接

4、口工作薄集合工作薄工作表集合.Worksheet sheet;工作表Range range;/Excel中针对单元格的操作都应先获取其对应的Font font;Range对象Range cols;/*COleVariant类为VARIAN数据类型的包装,在自动化程序中,通常都使用VARIAN散据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant类来转换了的。*/covOptional 可选参数的VARIAN段型COleVariant covOptional(long)DISP_E_PARAMNOTFOUND, VT_ERROR);if( !app.CreateDispatc

5、h("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

6、"),COleVariant("A1");/ 设置 A1=HELLO EXCEL!"range.SetValue(COleVariant("HELLO EXCEL!");/调整格式,设置粗体font=range.GetFont();font.SetBold(COleVariant(short)TRUE);/选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形式range=sheet.GetRange(COleVariant("A2"),COleVariant(

7、"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表格实例CString strPath;strPath +=

8、 "C:template.xlt" / 模板的路径CFileFind filefind;if( !filefind.FindFile( strPath ) (AfxMessageBox("没有找到模版文本请其查找 ");return;LPDISPATCH lpDisp; / 接口指针books=app.GetWorkbooks();lpDisp = books.Open(m_filepath,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOp

9、tional, 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,covO

10、ptional,(long)0,covOptional,covOptional,covOptional,covOptional,covOptional); /与的不同,是个参数的,直接在后面加了两个covOptional成功了5 .释放一个excel文件实例经试验证实,不释放第二次使用excel时会中断,放在类的析构里面有时调用不 到,主动调用最保险。(有没有 AttachDispatch ()过都要释放,否则报错)/释放对象(相当重要!)Rang.ReleaseDispatch();sheet.ReleaseDispatch(); sheets.ReleaseDispatch();book.

11、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单元格实现Va

12、riant数据类型转换为CString类,这个只是一个示例,转换较为简单。range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col);COleVariant rValue;rValue=COleVariant(range.GetValue2();rValue.ChangeType(VT_BSTR);return CString(rValue.bstrVal);8 .还有释放问题是最重要的问题:首先变量必须全释放,无论当初是否绑定过;其次,程序释放和程序关闭的顺序必须是app

13、.Quit();app.ReleaseDispatch();如果顺如颠倒如下:app.ReleaseDispatch();app.Quit();出现的后果是程序关闭后,excel进程仍然运行,所以无法正常打开程序曾经打开excel表格。附录(操作类源码):#include "./Stdafx.h"#include "OptExcel.h#include "excel.h"#include "comdef.h"_Application app;Workbooks books;_Workbook book;Worksheets

14、sheets;_Worksheet sheet;Range range;Range cell;Font font;COleVariant covOptional( long )DISP_E_PARAMNOTFOUND, VT_ERROR);/Function:COptExcel/Description:初始化函数,初始化中附加 excel应用程序/Call:app.CreateDispatch(_T("Excel.Application")/COptExcel:COptExcel( void ) if (:CoInitialize( NULL ) = E_INVALIDAR

15、G) AfxMessageBox(_T("初始化 Con败!"); return ; )/验证office文件是否可以正确运行if ( !app.CreateDispatch(_T( "Excel.Application" ) AfxMessageBox(_T("无法创建 Excel 应用!"); return ; )/在程序执行文件路径名中,剪掉执行文件名,得到程序路径,追加模板文件名,得到模板完整路径/Function:COptExcel/Description:析构函数,释放对象,非常重要,不全部释放,占用内存,下/一次使用此类

16、时会中断/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/

17、Description:打开表名为filename的文件,注意,文件路径非自动生成,以后/考虑从下处理方法/Call:GetAppPath()/Input:CString filename文件名/bool COptExcel:OpenExcelBook(CString filename)CFileFind filefind;if ( !filefind.FindFile(filename) )AfxMessageBox(_T("文件不存在"); return false ;LPDISPATCH lpDisp; 接口指针books=app.GetWorkbooks();lpD

18、isp = books.Open(filename,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);后面加了两个covOptional成功了book.AttachDispatch(lpDisp);sheets=book.GetSheets();sheet=sheets.GetItem

19、(COleVariant( short )1);个covOptional 成功了return true ;void COptExcel:NewExcelBook()books=app.GetWorkbooks();book=books.Add(covOptional);sheets=book.GetSheets();sheet=sheets.GetItem(COleVariant( short )1);个covOptional 成功了/ 与office 2000的不同,/与的不同,是个参数的,/与的不同,是个参数的,是个参数的,直接在直接在后面加了两直接在后面加了两/Function:Open

20、ExcelApp/Description:打开应用程序(要注意以后如何识别用户要打开的是哪个文件)/ void COptExcel:OpenExcelApp( void ) ( app.SetVisible(TRUE); app.SetUserControl(TRUE); / /Function:SaveExcel/Description:用于打开数据文件,续存数据后直接保存/ void COptExcel:SaveExcel( void ) ( book.SetSaved(TRUE); / /Function:SaveAsExcel/Description:保存excel 文件/ void

21、COptExcel:SaveAsExcel(CString filename) (book.SaveAs(COleVariant(filename),covOptional, covOptional,covOptional, covOptional,covOptional,( long )0,covOptional,covOptional,covOptional, covOptional,covOptional);/ /Function:SetCellValue/Description:修改单元格内的值/Call:IndexToString()从(x,y)坐标形式转化为A1”格式字符串/Inp

22、ut:int row单元格所在行/int col单元格所在列/int Align对齐方式默认为居中/ void COptExcel:SetCellValue( int row, int col, int Align) ( range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col) ); range.SetValue2(COleVariant(value); cell.AttachDispatch(range.GetItem (COleVariant(long (1), CO

23、leVariant( long (1).pdispVal);cell.SetHorizontalAlignment(COleVariant(short )Align); / /Function:GetCellValue/Description:得到的单元格中的值/Call:IndexToString()从(x,y)坐标形式转化为A1”格式字符串/Input:int row 单元庙所在行/int col单元格所在列/Return:CString 单元格中的值/CString COptExcel:GetCellValue( int row, int col) (range=sheet.GetRan

24、ge(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col) );COleVariant rValue;rValue=COleVariant(range.GetValue2();rValue.ChangeType(VT_BSTR); return CString(rValue.bstrVal); / /Function:SetRowHeight/Description:设置行高/Call:IndexToString()从(x,y)坐标形式转化为A1”格式字符串/Input:int row 单元格所在行/ voi

25、d COptExcel:SetRowHeight( int row, CString height) ( int col = 1;range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col) );range.SetRowHeight(COleVariant(height);/Function:SetColumnWidth/Description:设置列宽/Call:IndexToString()从(x,y)坐标形式转化为A1”格式字符串/Input:int col要设置列宽的

26、列/CString 宽值/void COptExcel:SetColumnWidth( int col,CString width) (int row = 1;range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col) );range.SetColumnWidth(COleVariant(width);/Function:SetRowHeight/Description:设置行高/Call:IndexToString()从(x,y)坐标形式转化为A1”格式字符串/Input

27、:int row 单元格所在行/CString COptExcel:GetColumnWidth( int col) (int row = 1;range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col) );VARIANT width = range.GetColumnWidth();CString strwidth;strwidth.Format(CString(LPCSTR)(_bstr_t)(_variant_t)width); return strwidth;/Function:GetRowHeight/Description:设置行高/Call:IndexToString()从(x,y)坐标形式转化为Al”格式字符串/Input:int row 要设置行高的行/CString 宽值/ CString COptExcel:GetRowHeight( int row) int col = 1;range=sheet.GetRange(COleVariant(IndexToString

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论