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. SecureCRT 常用技巧

    转自:http://blog.chinaunix.net/uid-26575352-id-3063143.html 快捷键: 1. ctrl + a :  移动光标到行首 2. ctrl + e :移 ...

  2. Android之Handler与AsyncTask的区别

    1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可 ...

  3. dubbo项目实战代码展示

    最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...

  4. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  5. ios UITableView高度自适应(转)

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // ...

  6. java面向对象、构造方法 之内部类

    UML类图 UML  Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中      属性表示这类事物的性质(描述它的数据)      方法表示这类 ...

  7. PAT 1026 Table Tennis (30)

    A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...

  8. python基础-第四篇-4.1内置函数

    lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...

  9. golang的指针和切片

    首先为什么要讲go的指针和切片放在一起? 因为go指针和切片都是引用类型 引用类型就是说切片和指针保存的只是内存的地址,而不是具体的值,效率在大数据读取方面效率会高很多. 1.怎么定义一个切片 方法1 ...

  10. java基础06 switch

    public class SwitchDemo01 { /** * 韩嫣参加计算机编程大赛 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 如果获得第二名,将奖励惠普笔记本电脑一部 如果获得第三 ...