1、defined _HEAD_FILE_EXCEL9_#define _HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif成功二、操作EXCEL文件1. 新建一个excel表,并填充两个单元格的实例void CTestExcelDlg:OnButton1()/WorkbooksWorkbook WorksheetsWorksheet Range_Application app; /Excel应用程序接口Workbooks books; /工作薄集合_Workbook book; /工作薄Worksheets sheets; /工作表集合_Worksheet sheet; /工
2、作表Range range; /Excel中针对单元格的操作都应先获取其对应的Range对象Font font;Range cols;/*COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant类来转换了的。*/covOptional 可选参数的VARIANT类型COleVariant covOptional(long)DISP_E_PARAMNOTFOUND, VT_ERROR);app.CreateDispatch(Excel.Application) )this-Messag
3、eBox(无法创建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=HELLO EXCEL!range.SetValue(COleVariant(HELLO EXCEL
4、!/调整格式,设置粗体font=range.GetFont();font.SetBold(COleVariant(short)TRUE);/选择A2单元格,插入一个公式=RAND()*100000,并设置A2数字格式为货币形式A2range.SetFormula(COleVariant(range.SetNumberFormat(COleVariant($0.00/选择A:A列,设置宽度为自动适应cols=range.GetEntireColumn();cols.AutoFit();/显示Excel表格,并设置状态为用户可控制app.SetVisible(TRUE);app.SetUserCo
5、ntrol(TRUE);2. 打开一个已有的excel表格实例CString strPath; strPath += C:template.xlt; / 模板的路径 CFileFind filefind;filefind.FindFile( strPath ) ) AfxMessageBox( 没有找到模版文档,请其查找 ); return; LPDISPATCH lpDisp; /接口指针lpDisp = books.Open(m_filepath, covOptional, covOptional, covOptional, covOptional, covOptional, covOpt
6、ional /与的不同,是个参数的,直接在后面加了两个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); /与的不同,是个参数的
7、,直接在后面加了两个covOptional成功了5. 释放一个excel文件实例经试验证实,不释放第二次使用excel时会中断,放在类的析构里面有时调用不到,主动调用最保险。(有没有AttachDispatch()过都要释放,否则报错)/释放对象(相当重要!) Rang.ReleaseDispatch();sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();books.ReleaseDispatch();/退出程序 app.Quit();/m_ExlApp一定要释放,否则程序结束后还会有一个Excel进
8、程驻留在内存中,而且程序重复运行的时候会出错 app.ReleaseDispatch();6. 修改一个excel单元格range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col);range.SetValue2(COleVariant(value);7. 取出一个excel单元格实现Variant数据类型转换为CString类,这个只是一个示例,转换较为简单。COleVariant rValue;rValue=COleVariant(range.GetValue2();rV
9、alue.ChangeType(VT_BSTR);return CString(rValue.bstrVal);8. 还有释放问题是最重要的问题: 首先变量必须全释放,无论当初是否绑定过; 其次,程序释放和程序关闭的顺序必须是如果顺如颠倒如下:出现的后果是程序关闭后,excel进程仍然运行,所以无法正常打开程序曾经打开excel表格。附录(操作类源码):./Stdafx.hOptExcel.hcomdef.hRange cell;/Function: COptExcel/Description: 初始化函数,初始化中附加excel应用程序/Call: app.CreateDispatch(_T
10、()COptExcel:COptExcel(void) if (:CoInitialize( NULL ) = E_INVALIDARG) AfxMessageBox(_T(初始化Com失败! return; /验证office文件是否可以正确运行 if( !app.CreateDispatch(_T() ) /在程序执行文件路径名中,剪掉执行文件名,得到程序路径,追加模板文件名,得到模板完整路径 COptExcel 析构函数,释放对象,非常重要,不全部释放,占用内存,下/ 一次使用此类时会中断 ReleaseDispatch()COptExcel(void) books.ReleaseDis
11、patch(); book.ReleaseDispatch(); sheets.ReleaseDispatch(); sheet.ReleaseDispatch(); range.ReleaseDispatch(); font.ReleaseDispatch(); cell.ReleaseDispatch(); app.Quit(); app.ReleaseDispatch(); :CoUninitialize(); OpenExcelBook 打开表名为filename的文件,注意,文件路径非自动生成,以后/ 考虑从下处理方法 GetAppPath()/Input: CString file
12、name 文件名bool COptExcel:OpenExcelBook(CString filename) CFileFind filefind;filefind.FindFile(filename) ) 文件不存在 return false; LPDISPATCH lpDisp; /接口指针 books=app.GetWorkbooks(); lpDisp = books.Open(filename, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional ); /与office 2000的不
13、同,是个参数的,直接在后面加了两个covOptional成功了 book.AttachDispatch(lpDisp); sheets=book.GetSheets(); sheet=sheets.GetItem(COleVariant(short)1); /与的不同,是个参数的,直接在后面加了两个covOptional成功了 return true;void COptExcel:NewExcelBook() book=books.Add(covOptional); OpenExcelApp 打开应用程序(要注意以后如何识别用户要打开的是哪个文件)OpenExcelApp(void) app.
14、SetVisible(TRUE); app.SetUserControl(TRUE); SaveExcel 用于打开数据文件,续存数据后直接保存SaveExcel(void) book.SetSaved(TRUE); SaveAsExcel 保存excel文件SaveAsExcel(CString filename) book.SaveAs(COleVariant(filename),covOptional, covOptional,covOptional,(long)0,covOptional,covOptional,covOptional, covOptional,covOptional)
15、; SetCellValue 修改单元格内的值 IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串 int row 单元格所在行/ int col 单元格所在列/ int Align 对齐方式默认为居中SetCellValue(int row, int col,int Align) range=sheet.GetRange(COleVariant(IndexToString(row,col),COleVariant(IndexToString(row,col); range.SetValue2(COleVariant(value); cell.AttachDispat
16、ch(range.GetItem (COleVariant(long(1), COleVariant(long(1).pdispVal); cell.SetHorizontalAlignment(COleVariant(short)Align); GetCellValue 得到的单元格中的值/Return: CString 单元格中的值CString COptExcel:GetCellValue(int row, int col) COleVariant rValue; rValue=COleVariant(range.GetValue2(); rValue.ChangeType(VT_BSTR); return CString(rValue.bstrVal); SetRowHeight 设置行高SetRowHeight(int row, CString height) int col = 1; range.SetRowHeight(COleVariant(height); SetColumnWidth 设置列宽 int col 要设置列宽的列/ CString 宽值SetColumnWidth(int col,CString width) int row = 1; range.SetColumnWidth(COleVariant(width);/Call
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2