使用MFC自动化操作Excel文档

项目中要用到MFC操作Excel文件,在网上搜的结果,有把Excel当数据库处理的,也有直接操作Excel的,最终在MSDN上看到的结果,测试后觉得好用些。

使用基本步骤:

1、创建一个支持MFC的C++项目

2、加入一个从Excel的typelib派生的MFC类,下图为typelib列表:

   应用程序                           类型库
--------------------------------------------------
Microsoft Access 97                   Msacc8.olb
Microsoft Jet Database 3.5         DAO350.dll
Microsoft Binder 97                   Msbdr8.olb
Microsoft Excel 97                     Excel8.olb
Microsoft Graph 97                    Graph8.olb
Microsoft Office 97                    Mso97.dll
Microsoft Outlook 97                 Msoutl97.olb
Microsoft PowerPoint 97             Msppt8.olb
Microsoft Word 97                     Msword8.olb
Microsoft Access 2000                Msacc9.olb
Microsoft Jet Database 3.51        DAO360.dll
Microsoft Binder 2000                 Msbdr9.olb
Microsoft Excel 2000                  Excel9.olb
Microsoft Graph 2000                 Graph9.olb
Microsoft Office 2000                 Mso9.dll
Microsoft Outlook 2000               Msoutl9.olb
Microsoft PowerPoint 2000          Msppt9.olb
Microsoft Word 2000                   Msword9.olb
Microsoft Access 2002                Msacc.olb
Microsoft Excel 2002                  Excel.exe
Microsoft Graph 2002                 Graph.exe
Microsoft Office 2002                 MSO.dll
Microsoft Outlook 2002               MSOutl.olb
Microsoft PowerPoint 2002          MSPpt.olb
Microsoft Word 2002                  MSWord.olb
Microsoft Office Access 2003        Msacc.olb
Microsoft Office Excel 2003          Excel.exe
Microsoft Graph 2003                  Graph.exe
Microsoft Office 2003                  MSO.dll
Microsoft Office Outlook 2003       MSOutl.olb
Microsoft Office PowerPoint 2003   MSPpt.olb
Microsoft Office Word 2003           MSWord.olb

注意:这些类型库的默认位置是 C:/Program Files/Microsoft Office/Office(在 Office 2002 中,相应的路径为 C:/.../Office10;在 Office 2003 中,相应的路径为 C:/.../Office11),Dao350.dll 或 Dao360.dll 以及 Microsoft Office 10 (MSO.dll) 除外。Dao350.dll/Dao360.dll 的默认位置是 C:/Program Files/Common Files/Microsoft Shared/Dao。对于 Office 2002,MSO.dll 的默认位置是 C:/Program Files/Common Files/Microsoft Shared/Office10;对于 Office 2003,其默认位置是 C:/Program Files/Common Files/Microsoft Shared/Office11。

3、选择需要的Excel自动化接口,常用的有_Application/_Workbook/_Worksheet/Workbooks/Worksheet/Range等,接口类为Excel.h,Excel.cpp

(上述三步主要用来生产MFC的Excel接口类,测试结果,VC2005生成的Excel接口不好用,报了一堆的error,重定义什么的。参考网上的意见,用VC6生成了一个Excel接口,然后在VC2005直接使用这个接口了)

4、修改接口类的头文件,定义一个命名空间Excel,将接口类定义及实现包含起来,便以使用

5、在使用Excel接口的地方,引用Excel.h

使用注意事项:

1、在MFC项目中,如果没有启用COM服务库,启用COM服务库,示例如下:

BOOL CAutoProjectApp::InitInstance() { if(!AfxOleInit()) // Your addition starts here { AfxMessageBox("Could not initialize COM dll"); return FALSE; } // End of your addition AfxEnableControlContainer(); . . . }

2、加入必要的头文件,如<afxdisp.h>

3、Excel接口中有许多默认的Optional参数,对应MFC中的定义为:COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

4、部分Excel自动化接口用到的枚举常量,在MFC导出类中并没有,需要用的时候,可以查阅Excel VAB Reference,直接使用这些枚举常量的对应值。

Excel使用封装类:

为了便以使用,对Excel导出类做了简单的封装,代码如下:

//ExcelUtil.h #include "stdafx.h" #include <io.h> #include "../ExcelWrapper/excel.h" using namespace Excel; namespace Excel { class ExcelUtil { private: CString out_file_name; public: CString GetOutFileName() { return out_file_name; }; void SetOutFileName(CString new_file_name) { if (new_file_name.GetLength()>0) out_file_name = new_file_name; } private: _Application m_excelApp; Workbooks m_excelBooks; _Workbook m_excelBook; Worksheets m_excelSheets; _Worksheet m_excelSheet; Range m_excelRange; public: void CreateExcel() { COleException pError; if (!m_excelApp.CreateDispatch("Excel.Application", &pError)) { pError.ReportError(); return; } else { m_excelBooks = m_excelApp.GetWorkbooks(); m_excelBook = m_excelBooks.Add(COleVariant((short)TRUE)); m_excelSheet = m_excelBook.GetActiveSheet(); } } void OpenExcel(CString fileName) { COleException pError; if (!m_excelApp.CreateDispatch("Excel.Application", &pError)) { pError.ReportError(); return; } else { COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); m_excelBooks = m_excelApp.GetWorkbooks(); m_excelBook = m_excelBooks.Open(fileName,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); m_excelSheet = m_excelBook.GetActiveSheet(); out_file_name = fileName; } } bool SaveExcel() { if (out_file_name.GetLength()==0) { AfxMessageBox("Excel·¾¶Î´Ö¸¶¨,ÎÞ·¨±£´æ"); return false; } else { TRY { if (_access(out_file_name, 0) == 0) remove(out_file_name); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); m_excelBook.SaveAs(COleVariant(out_file_name), covOptional, covOptional, covOptional, covOptional, covOptional, 0,covOptional, covOptional, covOptional, covOptional, covOptional); } CATCH (CException, e) { return false; } END_CATCH } return false; } void CloseExcel() { COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); m_excelBook.Close(COleVariant((short)FALSE), covOptional, covOptional); m_excelBooks.Close(); m_excelApp.Quit(); } // <summary> // È¡µÃÌض¨µÄWorksheet //</summary> // <param name="SheetName">worksheetµÄÃû×Ö</param> //<returns></returns> _Worksheet GetSheet(CString SheetName) { bool has_the_sheet = false; Worksheets sheets = m_excelBook.GetWorksheets(); for (int si=1; si<=sheets.GetCount(); si++) { _Worksheet sheet = sheets.GetItem(COleVariant((long)si)); if (sheet.GetName().Compare(SheetName) == 0) { has_the_sheet = true; break; } } if (!has_the_sheet) { AfxMessageBox("SheetÃû×Ö²»¶Ô£¬Çë¼ì²é"); return NULL; } TRY { m_excelSheet = sheets.GetItem(COleVariant(SheetName)); } CATCH (CException, e) { return NULL; } END_CATCH return m_excelSheet; } /// <summary> /// È¡µÃÌض¨µÄWorksheet /// </summary> /// <param name="index">worksheetµÄË÷Òý£¬´Ó1¿ªÊ¼</param> /// <returns></returns> _Worksheet GetSheet(int index) { Worksheets sheets = m_excelBook.GetWorksheets(); int sheet_num = sheets.GetCount(); if (index <= 0 || index > sheet_num) { char buf[BUFSIZ] = ""; sprintf_s(buf, "Ë÷Òý±ØÐë´óÓÚ0ÇÒСÓÚµÈÓÚ%d", sheet_num); AfxMessageBox(buf); return NULL; } TRY { m_excelSheet = sheets.GetItem(COleVariant((long)(index))); } CATCH (CException, e) { return NULL; } END_CATCH return m_excelSheet; } /// <summary> /// Ìí¼ÓÌض¨µÄWorksheet /// </summary> /// <param name="SheetName">ÐÂÌí¼ÓµÄworksheetµÄÃû×Ö</param> /// <returns>³É¹¦·µ»Ø´´½¨µÄworksheet£¬·ñÔò¿ØÖÆ̨´òÓ¡ÏàÓ¦µÄ³ö´íÐÅÏ¢</returns> _Worksheet AddSheet(CString SheetName) { if( SheetName.Trim().GetLength() == 0 ) { AfxMessageBox("sheetÃû×Ö·Ç·¨"); return NULL; } bool has_the_sheet = false; Worksheets sheets = m_excelBook.GetWorksheets(); for (int si=1; si<=sheets.GetCount(); si++) { _Worksheet sheet = sheets.GetItem(COleVariant((long)si)); if (sheet.GetName().Compare(SheetName) == 0) { has_the_sheet = true; break; } } if( has_the_sheet ) { AfxMessageBox("excelÎļþÖÐÒÑÓиÃsheet"); return NULL; } _Worksheet new_sheet; TRY { COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); new_sheet = sheets.Add(covOptional, covOptional, COleVariant((short)1), covOptional); new_sheet.SetName(SheetName); } CATCH (CException, e) { return NULL; } END_CATCH return new_sheet; } /// <summary> /// È¡µÃsheetµÄÊýÁ¿ /// </summary> /// <returns>sheetµÄÊýÁ¿</returns> int GetSheetNum() { Worksheets sheets = m_excelBook.GetWorksheets(); return sheets.GetCount(); } //²Ù×÷µ¥Ôª¸ñ/ºÏ²¢µ¥Ôª¸ñ /// <summary> /// ·µ»ØÌض¨µÄµ¥Ôª¸ñ /// </summary> /// <param name="ColNum">ÁкÅ,´Ó1¿ªÊ¼,²»´óÓÚ255</param> /// <param name="RowNum">ÐкÅ,´Ó1¿ªÊ¼,²»´óÓÚ255</param> /// <returns></returns> CString GetCell(int ColNum, int RowNum) { char buf[BUFSIZ] = ""; //µ¥Ôª¸ñÁкÅÊý×é CString m_colString[] = { "", "A","B","C","D","E", "F","G","H","I","J", "K","L","M","N","O", "P","Q","R","S","T", "U","V","W","X","Y", "Z" }; int row = RowNum; if (ColNum <= 0 || ColNum > 255) { AfxMessageBox("ÐкŴíÎó"); return ""; } if (ColNum <= 26) { sprintf_s(buf, "%s%d", m_colString[ColNum], RowNum); return CString(buf); } else { int i0 = 0, i1 = 0; i0 = (int)(ColNum / 26); i1 = ColNum % 26; if (i1 != 0) { sprintf_s(buf, "%s%s%d", m_colString[i0], m_colString[i1], row); return CString(buf); } else //Èç¹ûColNum = 52¡¢78¡¢104 { sprintf_s(buf, "%s%s%d", m_colString[i0-1], m_colString[i1+26], row); return CString(buf); } } } //È¡µÃÒ»¸öµ¥Ôª¸ñ void SetRange(int ColNum, int RowNum) { COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); m_excelRange = m_excelSheet.GetRange(COleVariant(GetCell(ColNum, RowNum)), covOptional); } //È¡µÃÒ»¸öµ¥Ôª¸ñÇøÓò void SetRange(int StartColNum, int StartRowNum, int EndColNum, int EndRowNum) { m_excelRange = m_excelSheet.GetRange(COleVariant(GetCell(StartColNum, StartRowNum)), COleVariant(GetCell(EndColNum, EndRowNum))); } //ºÏ²¢Ò»¸öµ¥Ôª¸ñÇøÓò void Merge(int startRowIndex, int startColIndex, int endRowIndex, int endColIndex) { SetRange(startColIndex, startRowIndex, endColIndex, endRowIndex); m_excelRange.Merge(COleVariant((short)FALSE)); } //µ¥Ôª¸ñ¸³Öµ/µ¥Ôª¸ñÇøÓò¸³Öµ void SetCellValue(CString value) { if (m_excelRange == NULL) { AfxMessageBox("ûÓÐÉ趨µ¥Ôª¸ñ"); return; } m_excelRange.SetValue2(COleVariant(value)); } void SetCellValue(int row, int col, CString value) { SetRange(col, row); m_excelRange.SetNumberFormatLocal(COleVariant("@")); m_excelRange.SetValue2(COleVariant(value)); } void SetCellStringFormat() { m_excelRange.SetNumberFormatLocal(COleVariant("@")); } void SetCellValue( int startRow,int startCol, int endRow, int endCol, CString value ) { Merge(startRow, startCol, endRow, endCol); m_excelRange.SetNumberFormatLocal(COleVariant("@")); m_excelRange.SetValue2(COleVariant(value)); } CString GetCellValue( int row, int col ) { SetRange(col, row); return (CString)m_excelRange.GetText(); } //ÉèÖõ¥Ôª¸ñÑùʽ void SetBoldFontAndSize( int size ) { Font font = m_excelRange.GetFont(); font.SetBold(COleVariant((short)TRUE)); font.SetSize(COleVariant((short)size)); } //ÉèÖñ¨±í±í¸ñΪ×îÊÊÓ¦¿í¶È //ÉèÖñ¨±í±í¸ñΪ×îÊÊÓ¦¿í¶È void SetAutoFitColumns( int startRow, int startCol, int endRow, int endCol ) { SetRange(startCol, startRow, endCol, endRow); Range cols = m_excelRange.GetEntireColumn(); cols.AutoFit(); } void SetCenterAlign() { m_excelRange.SetHorizontalAlignment(COleVariant((short)0)); } void SetBorder() { Borders borders = m_excelRange.GetBorders(); borders.SetLineStyle(COleVariant((short)1)); Border border = borders.GetItem(7); border.SetWeight(COleVariant((short)4)); border = borders.GetItem(8); border.SetWeight(COleVariant((short)4)); border = borders.GetItem(10); border.SetWeight(COleVariant((short)4)); border = borders.GetItem(9); border.SetWeight(COleVariant((short)4)); } }; }

(代码应用的excel.h为MFC导出类)

更多示例代码,参考:

http://support.microsoft.com/kb/178783/zh-cn

http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q179706&ID=KB;EN-US;Q179706

http://www.usewide.com/forums/topics.aspx?ID=86

内容参考来源于MSDN

使用MFC自动化操作Excel文档相关推荐

  1. 用python处理excel-使用Python操作Excel文档(一)

    Python | 使用Python操作Excel文档(一) 0 前言 在阅读本文之前,请确保您已满足或可能满足以下条件: 请确保您具备基本的Python编程能力. 请确保您会使用Excel. 请确保您 ...

  2. python xlwt xlrd_用xlrd和xlwt操作Excel文档

    工作当中经常要操作excel文档,有些完全是纯粹的重复劳动.在我的工作中就遇到这样一个需求: 1. 存在两个excel文档(source.xls/target.xls),列数据是一致的 2. 文档so ...

  3. Java web--利用java操作excel文档

    在web应用程序的开发中,如果需要将Excel文档中的信息导入数据库或将数据库的信息导出到Excel文档中,需要应用程序访问Excel文件.目前,操作Excel文档的java组件主要有Jxl和POI两 ...

  4. VB中操作Excel文档

    ​​​​​​​篇一:利用 Python 操作 Excel文档 利用 Python 操作 Excel 在Excel 2010中打开VBA编辑器,请按 Alt + F11 打开: 以下代码在 Excel ...

  5. MFC创建新Excel文档并设置其中的格式和字体

    MFC创建新Excel文档并设置其中的格式和字体 转载 生成Excel.obl对象类excel.h 创建对象 [cpp] view plaincopyprint? Range m_ExlRge;    ...

  6. Java实战—POI操作Excel文档、读取、写入、合并单元格

    一.POI项目简介 POI全称 Poor Obfuscation Implementation,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:http: ...

  7. MFC中操作Word文档

    首先我们需要导入word类库(电脑上需要安装了word),左击项目,点击类向导,添加类(C)选择类型库中的MFC类.本文章案例可点击下载. 然后选择文件,位置选择从office安装目录中找到MSWOR ...

  8. golang如何操作excel文档

    目录 需求 分析 实现 日历时间 生成excel表头 style 参考 直接使用 github上关注较多的两个libary是 github.com/tealeg/xlsx 然而xlsx:NOT ACT ...

  9. VS操作Excel文档

    1.打开一个Excel模板文档 Excel.Application app = new Excel.Application(); app.Visible = false; app.UserContro ...

最新文章

  1. 使用PHP将HTTP标头设置为UTF-8
  2. layui动态添加input_layer.prompt添加多个输入框
  3. C++设计UDP协议通讯示例
  4. IDEA配置Maven-scala方式具体操作
  5. #6278. 数列分块入门 2
  6. 淘宝电影“追杀”猫眼电影,同门相争不可避免
  7. Hadoop 集群的基准测试
  8. web developer tips (56):手动更新JScript的智能感知
  9. 2018美赛b题论文翻译
  10. 让Google earth叠加中文地图
  11. Java多线程大合集
  12. 光纤模块和光纤收发器匹配问题
  13. 宝塔远程连接助手使用方法
  14. 烟花绽放c语言程序设计摘要,描写烟花绽放的优美句子
  15. 【ELM预测】基于极限学习机ELM实现数据预测matlab源码
  16. python inchat库下载_LearnPython/python_wechat.py at master · oxtaw/LearnPython · GitHub
  17. MySQL 基本查询语句
  18. 谷歌浏览器点击任意部分都会出现黑色光标
  19. 广州市花都区2021-2022学年九年级第一学期期末考试英语试题
  20. javaScript:操作元素-新浪触碰下拉菜单(3)

热门文章

  1. mongodb客户端编程
  2. 关于光速(c)测定的故事
  3. 01背包的状态转移方程
  4. 计算机中一个字等于多少个字节
  5. 微博视频、信息流总结
  6. 史上第一奇女子——五废五立的两朝皇后羊献容
  7. 【文件上传绕过】——前端检测_前端js验证漏洞
  8. linux应用程序开发_开发应用程序
  9. oracle登录提示01034,登录 oracle 时 ORA-01034 和 ORA-27101 的解决办法
  10. Java实现多线程的几种方式