MFC操作Excel

下面的操作基于Excel2003

一.初始化操作

1.导入类库

点击查看->建立类向导-> Add Class...\From a type Library...-> C:\Program Files\Microsoft Office\Office\EXCEL.EXE,接下来就可以看到导入的类excel.h, excel.cpp。

2.初始化COM

找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如:

  1. if (!AfxOleInit())
  2. {
  3. AfxMessageBox("注册COM出错!");
  4. return FALSE;
  5. }

二.Excel操作类

ExcelOperate.h

  1. #include "atlbase.h"
  2. #include "excel.h"
  3. using namespace myexcel;
  4. class CExcelOperate
  5. {
  6. private:
  7. myexcel::_Application m_ecApp;
  8. Workbooks m_ecBooks;
  9. _Workbook m_ecBook;
  10. Worksheets m_ecSheets;
  11. _Worksheet m_ecSheet;
  12. myexcel::Range m_ecRange;
  13. VARIANT ret;//保存单元格的值
  14. public:
  15. CExcelOperate();
  16. virtual ~CExcelOperate();
  17. public:
  18. //操作
  19. //**********************创建新EXCEL*******************************************
  20. BOOL CreateApp();
  21. BOOL CreateWorkbooks();                //创建一个新的EXCEL工作簿集合
  22. BOOL CreateWorkbook();                //创建一个新的EXCEL工作簿
  23. BOOL CreateWorksheets();                //创建一个新的EXCEL工作表集合
  24. BOOL CreateWorksheet(short index);                //创建一个新的EXCEL工作表
  25. BOOL CreateSheet(short index);
  26. BOOL Create(short index = 1);                         //创建新的EXCEL应用程序并创建一个新工作簿和工作表
  27. void ShowApp();                        //显示EXCEL文档
  28. void HideApp();                        //隐藏EXCEL文档
  29. //**********************打开文档*********************************************
  30. BOOL OpenWorkbook(CString fileName, short index = 1);
  31. BOOL Open(CString fileName);        //创建新的EXCEL应用程序并打开一个已经存在的文档。
  32. BOOL SetActiveWorkbook(short i);    //设置当前激活的文档。
  33. //**********************保存文档*********************************************
  34. BOOL SaveWorkbook();                //Excel是以打开形式,保存。
  35. BOOL SaveWorkbookAs(CString fileName);//Excel以创建形式,保存。
  36. BOOL CloseWorkbook();
  37. void CloseApp();
  38. //**********************读信息********************************
  39. BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range并将之间的值设置到ret中
  40. void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列数
  41. BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文本类型的,到dest中
  42. BOOL SetTextFormat(CString &beginS, CString &endS);//将beginS到endS设置为文本格式(数字的还要用下面的方法再转一次)
  43. BOOL SetRowToTextFormat(CString &beginS, CString &endS);//将beginS到endS(包括数字类型)设置为文本格式
  44. };

ExcelOperate.cpp

    1. CExcelOperate::CExcelOperate()
    2. {
    3. }
    4. CExcelOperate::~CExcelOperate()
    5. {
    6. }
    7. BOOL CExcelOperate::CreateApp()
    8. {
    9. //if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
    10. COleException pe;
    11. if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))
    12. {
    13. AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
    14. pe.ReportError();
    15. throw &pe;
    16. return FALSE;
    17. }
    18. return TRUE;
    19. }
    20. BOOL CExcelOperate::CreateWorkbooks()               //创建一个新的EXCEL工作簿集合
    21. {
    22. if (FALSE == CreateApp())
    23. {
    24. return FALSE;
    25. }
    26. m_ecBooks = m_ecApp.GetWorkbooks();
    27. if (!m_ecBooks.m_lpDispatch)
    28. {
    29. AfxMessageBox("WorkBooks创建失败!", MB_OK|MB_ICONWARNING);
    30. return FALSE;
    31. }
    32. return TRUE;
    33. }
    34. BOOL CExcelOperate::CreateWorkbook()               //创建一个新的EXCEL工作簿
    35. {
    36. if(!m_ecBooks.m_lpDispatch)
    37. {
    38. AfxMessageBox("WorkBooks为空!", MB_OK|MB_ICONWARNING);
    39. return FALSE;
    40. }
    41. COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    42. m_ecBook = m_ecBooks.Add(vOptional);
    43. if(!m_ecBook.m_lpDispatch)
    44. {
    45. AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
    46. return FALSE;
    47. }
    48. /*
    49. //得到document变量
    50. m_wdDoc = m_wdApp.GetActiveDocument();
    51. if (!m_wdDoc.m_lpDispatch)
    52. {
    53. AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
    54. return FALSE;
    55. }
    56. //得到selection变量
    57. m_wdSel = m_wdApp.GetSelection();
    58. if (!m_wdSel.m_lpDispatch)
    59. {
    60. AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
    61. return FALSE;
    62. }
    63. //得到Range变量
    64. m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    65. if(!m_wdRange.m_lpDispatch)
    66. {
    67. AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
    68. return FALSE;
    69. }
    70. */
    71. return TRUE;
    72. }
    73. BOOL CExcelOperate::CreateWorksheets()                //创建一个新的EXCEL工作表集合
    74. {
    75. if(!m_ecBook.m_lpDispatch)
    76. {
    77. AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
    78. return FALSE;
    79. }
    80. m_ecSheets = m_ecBook.GetSheets();
    81. if(!m_ecSheets.m_lpDispatch)
    82. {
    83. AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
    84. return FALSE;
    85. }
    86. return TRUE;
    87. }
    88. BOOL CExcelOperate::CreateWorksheet(short index)                //创建一个新的EXCEL工作表
    89. {
    90. if(!m_ecSheets.m_lpDispatch)
    91. {
    92. AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
    93. return FALSE;
    94. }
    95. m_ecSheet = m_ecSheets.GetItem(COleVariant(index));
    96. if(!m_ecSheet.m_lpDispatch)
    97. {
    98. AfxMessageBox("WorkSheet为空!", MB_OK|MB_ICONWARNING);
    99. return FALSE;
    100. }
    101. return TRUE;
    102. }
    103. BOOL CExcelOperate::CreateSheet(short index)
    104. {
    105. if(CreateWorksheets() == FALSE)
    106. {
    107. return FALSE;
    108. }
    109. if(CreateWorksheet(index) == FALSE)
    110. {
    111. return FALSE;
    112. }
    113. return TRUE;
    114. }
    115. BOOL CExcelOperate::Create(short index)                        //创建新的EXCEL应用程序并创建一个新工作簿和工作表
    116. {
    117. if(CreateWorkbooks() == FALSE)
    118. {
    119. return FALSE;
    120. }
    121. if(CreateWorkbook() == FALSE)
    122. {
    123. return FALSE;
    124. }
    125. if(CreateSheet(index) == FALSE)
    126. {
    127. return FALSE;
    128. }
    129. return TRUE;
    130. }
    131. void CExcelOperate::ShowApp()                        //显示WORD文档
    132. {
    133. m_ecApp.SetVisible(TRUE);
    134. }
    135. void CExcelOperate::HideApp()                       //隐藏word文档
    136. {
    137. m_ecApp.SetVisible(FALSE);
    138. }
    139. //**********************打开文档*********************************************
    140. BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)
    141. {
    142. if(!m_ecBooks.m_lpDispatch)
    143. {
    144. AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
    145. return FALSE;
    146. }
    147. //COleVariant vFileName(_T(fileName));
    148. COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    149. m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
    150. if(!m_ecBook.m_lpDispatch)
    151. {
    152. AfxMessageBox("WorkSheet获取失败!", MB_OK|MB_ICONWARNING);
    153. return FALSE;
    154. }
    155. if(CreateSheet(index) == FALSE)
    156. {
    157. return FALSE;
    158. }
    159. return TRUE;
    160. }
    161. BOOL CExcelOperate::Open(CString fileName)        //创建新的EXCEL应用程序并打开一个已经存在的文档。
    162. {
    163. if(CreateWorkbooks() == FALSE)
    164. {
    165. return FALSE;
    166. }
    167. return OpenWorkbook(fileName);
    168. }
    169. /*BOOL CExcelOperate::SetActiveWorkbook(short i)    //设置当前激活的文档。
    170. {
    171. }*/
    172. //**********************保存文档*********************************************
    173. BOOL CExcelOperate::SaveWorkbook()                //文档是以打开形式,保存。
    174. {
    175. if (!m_ecBook.m_lpDispatch)
    176. {
    177. AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
    178. return FALSE;
    179. }
    180. m_ecBook.Save();
    181. return TRUE;
    182. }
    183. BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文档以创建形式,保存。
    184. {
    185. if (!m_ecBook.m_lpDispatch)
    186. {
    187. AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
    188. return FALSE;
    189. }
    190. COleVariant vTrue((short)TRUE),
    191. vFalse((short)FALSE),
    192. vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    193. COleVariant vFileName(_T(fileName));
    194. m_ecBook.SaveAs(
    195. vFileName,    //VARIANT* FileName
    196. vOptional,    //VARIANT* FileFormat
    197. vOptional,    //VARIANT* LockComments
    198. vOptional,    //VARIANT* Password
    199. vOptional,    //VARIANT* AddToRecentFiles
    200. vOptional,    //VARIANT* WritePassword
    201. 0,    //VARIANT* ReadOnlyRecommended
    202. vOptional,    //VARIANT* EmbedTrueTypeFonts
    203. vOptional,    //VARIANT* SaveNativePictureFormat
    204. vOptional,    //VARIANT* SaveFormsData
    205. vOptional,    //VARIANT* SaveAsAOCELetter
    206. vOptional    //VARIANT* ReadOnlyRecommended
    207. /*                vOptional,    //VARIANT* EmbedTrueTypeFonts
    208. vOptional,    //VARIANT* SaveNativePictureFormat
    209. vOptional,    //VARIANT* SaveFormsData
    210. vOptional    //VARIANT* SaveAsAOCELetter*/
    211. );
    212. return    TRUE;
    213. }
    214. BOOL CExcelOperate::CloseWorkbook()
    215. {
    216. COleVariant vTrue((short)TRUE),
    217. vFalse((short)FALSE),
    218. vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    219. m_ecBook.Close(vFalse,    // SaveChanges.
    220. vTrue,            // OriginalFormat.
    221. vFalse            // RouteDocument.
    222. );
    223. m_ecBook = m_ecApp.GetActiveWorkbook();
    224. if(!m_ecBook.m_lpDispatch)
    225. {
    226. AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
    227. return FALSE;
    228. }
    229. if(CreateSheet(1) == FALSE)
    230. {
    231. return FALSE;
    232. }
    233. return TRUE;
    234. }
    235. void CExcelOperate::CloseApp()
    236. {
    237. SaveWorkbook();
    238. COleVariant vTrue((short)TRUE),
    239. vFalse((short)FALSE),
    240. vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    241. //m_ecDoc.Save();
    242. m_ecApp.Quit();
    243. if(m_ecRange.m_lpDispatch)
    244. m_ecRange.ReleaseDispatch();
    245. if(m_ecSheet.m_lpDispatch)
    246. m_ecSheet.ReleaseDispatch();
    247. if(m_ecSheets.m_lpDispatch)
    248. m_ecSheets.ReleaseDispatch();
    249. if(m_ecBook.m_lpDispatch)
    250. m_ecBook.ReleaseDispatch();
    251. if(m_ecBooks.m_lpDispatch)
    252. m_ecBooks.ReleaseDispatch();
    253. if(m_ecApp.m_lpDispatch)
    254. m_ecApp.ReleaseDispatch();
    255. }
    256. BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)
    257. {
    258. if(!m_ecSheet.m_lpDispatch)
    259. {
    260. AfxMessageBox("Sheet获取失败!", MB_OK|MB_ICONWARNING);
    261. return FALSE;
    262. }
    263. m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));
    264. if(!m_ecRange.m_lpDispatch)
    265. {
    266. AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
    267. return FALSE;
    268. }
    269. ret = m_ecRange.GetValue2();//得到表格中的值
    270. return TRUE;
    271. }
    272. void CExcelOperate::GetRowsAndCols(long &rows, long &cols)
    273. {
    274. COleSafeArray sa(ret);
    275. sa.GetUBound(1,&rows);
    276. sa.GetUBound(2,&cols);
    277. }
    278. //只返回CString类型的,其他类型概视为错误
    279. BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)
    280. {
    281. long rRows, rCols;
    282. long index[2];
    283. VARIANT val;
    284. COleSafeArray sa(ret);
    285. sa.GetUBound(1,&rRows);
    286. sa.GetUBound(2,&rCols);
    287. if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)
    288. {
    289. AfxMessageBox("出错点1");
    290. return FALSE;
    291. }
    292. index[0]=rows;
    293. index[1]=cols;
    294. sa.GetElement(index,&val);
    295. if(val.vt != VT_BSTR)
    296. {
    297. CString str;
    298. str.Format("出错点2, %d",val.vt);
    299. AfxMessageBox(str);
    300. return FALSE;
    301. }
    302. dest = val.bstrVal;
    303. return TRUE;
    304. }
    305. //将beginS到endS之间设置为文本格式
    306. BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)
    307. {
    308. if(GetRangeAndValue(beginS, endS))
    309. {
    310. m_ecRange.Select();
    311. m_ecRange.SetNumberFormatLocal(COleVariant("@"));
    312. return TRUE;
    313. }
    314. return FALSE;
    315. }
    316. //将beginS到endS之间(必须是一列)设置为真正的文本格式
    317. BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)
    318. {
    319. if(GetRangeAndValue(beginS, endS))
    320. {
    321. m_ecRange.Select();
    322. Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));
    323. if(!m_tempRange.m_lpDispatch) return FALSE;
    324. COleVariant vTrue((short)TRUE),
    325. vFalse((short)FALSE);
    326. //int tempArray[2] = {1, 2};
    327. COleSafeArray saRet;
    328. DWORD numElements = {2};
    329. saRet.Create(VT_I4, 1, &numElements);
    330. long index = 0;
    331. int val = 1;
    332. saRet.PutElement(&index, &val);
    333. index++;
    334. val = 2;
    335. saRet.PutElement(&index, &val);
    336. //m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
    337. m_ecRange.TextToColumns(m_tempRange.GetItem(COleVariant((short)1),COleVariant((short)1)), 1, 1, vFalse, vTrue, vFalse, vFalse, vFalse, vFalse, vFalse, saRet, vFalse, vFalse, vTrue);
    338. m_tempRange.ReleaseDispatch();
    339. return TRUE;
    340. }
    341. return FALSE;
    342. }

C++之操作Excel(抄录https://www.cnblogs.com/For-her/p/3499782.html)的更多相关文章

  1. HBASE学习d端口master:16010(java操作hbase)https://www.cnblogs.com/junrong624/p/7323483.html

    HBase提示已创建表,但是list查询时,却显示表不存在. https://blog.csdn.net/liu16659/article/details/80216085 下载网址 http://a ...

  2. python操作excel表格(xlrd/xlwt)

    最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...

  3. python3:操作excel文件

    前提:自动化接口测试中,可以将用例放在excel中管理.结合实际情况讲解如何操作excel文件 1.安装xlrd:pip install xlrd 2.导入模块:import xlrd 3.打开Exc ...

  4. C#利用NPOI操作Excel文件

    NPOI作为开源免费的组件,功能强大,可用来读写Excel(兼容xls和xlsx两种版本).Word.PPT文件.可是要让我们记住所有的操作,这便有点困难了,至此,总结一些在开发中常用的针对Excel ...

  5. .Net 操作Excel表格

    一..从NuGet中,引用 Microsoft.Office.Interop.Excel类库. 方法一.先打开一个execl表然后进行保存 Application xApp = null; Workb ...

  6. 【转】python操作excel表格(xlrd/xlwt)

    [转]python操作excel表格(xlrd/xlwt) 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异, ...

  7. xlrd、xlwt 操作excel表格详解

    转自:https://www.cnblogs.com/jiablogs/p/9141414.html python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是 ...

  8. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  9. POI操作Excel(xls、xlsx)

    阿帕奇官网:http://poi.apache.org/ POI3.17下载:http://poi.apache.org/download.html#POI-3.17 POI操作Excel教程(易百教 ...

随机推荐

  1. Fragment之间传数据

    1.用bundle存Bundle bundle = new Bundle();bundle.putString("cid1", classList.get(i).getId()); ...

  2. hdu 1300(dp)

    一个模式的dp. Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. 【BZOJ5074】[Lydsy十月月赛]小B的数字 数学

    [BZOJ5074][Lydsy十月月赛]小B的数字 题解:题目是问你ai*bi>=sum,bi>=0这个不等式组有没有解.因为a<=10,容易想到取ai的lcm,然后变成lcm*b ...

  4. 电力项目七--js控制文字内容过长的显示和文本字数的显示

    当文本框中文字内容过长时,需要调整显示的样式 如上图所示的样式 对应的代码为: <div id="showInfomation" style="visibility ...

  5. Java23种设计模式学习笔记【目录总贴】

    创建型模式:关注对象的创建过程 1.单例​模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 主要: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,但 ...

  6. iOS 常用框架介绍

    iOS框架介绍      Cocoa Touch   GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息  iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游 ...

  7. Yii框架2.0的过滤器

    过滤器是 控制器 动作 执行之前或之后执行的对象. 例如访问控制过滤器可在动作执行之前来控制特殊终端用户是否有权限执行动作, 内容压缩过滤器可在动作执行之后发给终端用户之前压缩响应内容. 过滤器可包含 ...

  8. linux物理页面的换入换出简析

    2017-04-25 我们都知道,现代操作系统使用分页机制和虚拟内存,同时为了提高物理页面的利用率,采用了请求调页的机制,即物理内存的分配只有在真正需要的时候才会进行,比如发生了真正的读写操作,而普通 ...

  9. SpringBoot-URL路由:@Controller和@RequestMapping

    SpringBoot定义URL处理方法:@Controller和@RequestMapping @Controller标注的类表示的是一个处理HTTP请求的控制器(即MVC中的C),该类中所有被@Re ...

  10. SIP UserAgent (B2BUA client)——pjsip

    SIP UserAgent常用的SIP协议栈有pjsip/bell-sip/sofia-sip/libeXosip/libre等 https://github.com/staskobzar/sip_s ...