C++之操作Excel(抄录https://www.cnblogs.com/For-her/p/3499782.html)
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()函数的调用,如:
- if (!AfxOleInit())
- {
- AfxMessageBox("注册COM出错!");
- return FALSE;
- }
二.Excel操作类
ExcelOperate.h
- #include "atlbase.h"
- #include "excel.h"
- using namespace myexcel;
- class CExcelOperate
- {
- private:
- myexcel::_Application m_ecApp;
- Workbooks m_ecBooks;
- _Workbook m_ecBook;
- Worksheets m_ecSheets;
- _Worksheet m_ecSheet;
- myexcel::Range m_ecRange;
- VARIANT ret;//保存单元格的值
- public:
- CExcelOperate();
- virtual ~CExcelOperate();
- public:
- //操作
- //**********************创建新EXCEL*******************************************
- BOOL CreateApp();
- BOOL CreateWorkbooks(); //创建一个新的EXCEL工作簿集合
- BOOL CreateWorkbook(); //创建一个新的EXCEL工作簿
- BOOL CreateWorksheets(); //创建一个新的EXCEL工作表集合
- BOOL CreateWorksheet(short index); //创建一个新的EXCEL工作表
- BOOL CreateSheet(short index);
- BOOL Create(short index = 1); //创建新的EXCEL应用程序并创建一个新工作簿和工作表
- void ShowApp(); //显示EXCEL文档
- void HideApp(); //隐藏EXCEL文档
- //**********************打开文档*********************************************
- BOOL OpenWorkbook(CString fileName, short index = 1);
- BOOL Open(CString fileName); //创建新的EXCEL应用程序并打开一个已经存在的文档。
- BOOL SetActiveWorkbook(short i); //设置当前激活的文档。
- //**********************保存文档*********************************************
- BOOL SaveWorkbook(); //Excel是以打开形式,保存。
- BOOL SaveWorkbookAs(CString fileName);//Excel以创建形式,保存。
- BOOL CloseWorkbook();
- void CloseApp();
- //**********************读信息********************************
- BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range并将之间的值设置到ret中
- void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列数
- BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文本类型的,到dest中
- BOOL SetTextFormat(CString &beginS, CString &endS);//将beginS到endS设置为文本格式(数字的还要用下面的方法再转一次)
- BOOL SetRowToTextFormat(CString &beginS, CString &endS);//将beginS到endS(包括数字类型)设置为文本格式
- };
ExcelOperate.cpp
- CExcelOperate::CExcelOperate()
- {
- }
- CExcelOperate::~CExcelOperate()
- {
- }
- BOOL CExcelOperate::CreateApp()
- {
- //if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
- COleException pe;
- if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))
- {
- AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
- pe.ReportError();
- throw &pe;
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::CreateWorkbooks() //创建一个新的EXCEL工作簿集合
- {
- if (FALSE == CreateApp())
- {
- return FALSE;
- }
- m_ecBooks = m_ecApp.GetWorkbooks();
- if (!m_ecBooks.m_lpDispatch)
- {
- AfxMessageBox("WorkBooks创建失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::CreateWorkbook() //创建一个新的EXCEL工作簿
- {
- if(!m_ecBooks.m_lpDispatch)
- {
- AfxMessageBox("WorkBooks为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- m_ecBook = m_ecBooks.Add(vOptional);
- if(!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- /*
- //得到document变量
- m_wdDoc = m_wdApp.GetActiveDocument();
- if (!m_wdDoc.m_lpDispatch)
- {
- AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- //得到selection变量
- m_wdSel = m_wdApp.GetSelection();
- if (!m_wdSel.m_lpDispatch)
- {
- AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- //得到Range变量
- m_wdRange = m_wdDoc.Range(vOptional,vOptional);
- if(!m_wdRange.m_lpDispatch)
- {
- AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- */
- return TRUE;
- }
- BOOL CExcelOperate::CreateWorksheets() //创建一个新的EXCEL工作表集合
- {
- if(!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- m_ecSheets = m_ecBook.GetSheets();
- if(!m_ecSheets.m_lpDispatch)
- {
- AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::CreateWorksheet(short index) //创建一个新的EXCEL工作表
- {
- if(!m_ecSheets.m_lpDispatch)
- {
- AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- m_ecSheet = m_ecSheets.GetItem(COleVariant(index));
- if(!m_ecSheet.m_lpDispatch)
- {
- AfxMessageBox("WorkSheet为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::CreateSheet(short index)
- {
- if(CreateWorksheets() == FALSE)
- {
- return FALSE;
- }
- if(CreateWorksheet(index) == FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::Create(short index) //创建新的EXCEL应用程序并创建一个新工作簿和工作表
- {
- if(CreateWorkbooks() == FALSE)
- {
- return FALSE;
- }
- if(CreateWorkbook() == FALSE)
- {
- return FALSE;
- }
- if(CreateSheet(index) == FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- void CExcelOperate::ShowApp() //显示WORD文档
- {
- m_ecApp.SetVisible(TRUE);
- }
- void CExcelOperate::HideApp() //隐藏word文档
- {
- m_ecApp.SetVisible(FALSE);
- }
- //**********************打开文档*********************************************
- BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)
- {
- if(!m_ecBooks.m_lpDispatch)
- {
- AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- //COleVariant vFileName(_T(fileName));
- COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
- if(!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("WorkSheet获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- if(CreateSheet(index) == FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- BOOL CExcelOperate::Open(CString fileName) //创建新的EXCEL应用程序并打开一个已经存在的文档。
- {
- if(CreateWorkbooks() == FALSE)
- {
- return FALSE;
- }
- return OpenWorkbook(fileName);
- }
- /*BOOL CExcelOperate::SetActiveWorkbook(short i) //设置当前激活的文档。
- {
- }*/
- //**********************保存文档*********************************************
- BOOL CExcelOperate::SaveWorkbook() //文档是以打开形式,保存。
- {
- if (!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- m_ecBook.Save();
- return TRUE;
- }
- BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文档以创建形式,保存。
- {
- if (!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- COleVariant vTrue((short)TRUE),
- vFalse((short)FALSE),
- vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- COleVariant vFileName(_T(fileName));
- m_ecBook.SaveAs(
- vFileName, //VARIANT* FileName
- vOptional, //VARIANT* FileFormat
- vOptional, //VARIANT* LockComments
- vOptional, //VARIANT* Password
- vOptional, //VARIANT* AddToRecentFiles
- vOptional, //VARIANT* WritePassword
- 0, //VARIANT* ReadOnlyRecommended
- vOptional, //VARIANT* EmbedTrueTypeFonts
- vOptional, //VARIANT* SaveNativePictureFormat
- vOptional, //VARIANT* SaveFormsData
- vOptional, //VARIANT* SaveAsAOCELetter
- vOptional //VARIANT* ReadOnlyRecommended
- /* vOptional, //VARIANT* EmbedTrueTypeFonts
- vOptional, //VARIANT* SaveNativePictureFormat
- vOptional, //VARIANT* SaveFormsData
- vOptional //VARIANT* SaveAsAOCELetter*/
- );
- return TRUE;
- }
- BOOL CExcelOperate::CloseWorkbook()
- {
- COleVariant vTrue((short)TRUE),
- vFalse((short)FALSE),
- vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- m_ecBook.Close(vFalse, // SaveChanges.
- vTrue, // OriginalFormat.
- vFalse // RouteDocument.
- );
- m_ecBook = m_ecApp.GetActiveWorkbook();
- if(!m_ecBook.m_lpDispatch)
- {
- AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- if(CreateSheet(1) == FALSE)
- {
- return FALSE;
- }
- return TRUE;
- }
- void CExcelOperate::CloseApp()
- {
- SaveWorkbook();
- COleVariant vTrue((short)TRUE),
- vFalse((short)FALSE),
- vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- //m_ecDoc.Save();
- m_ecApp.Quit();
- if(m_ecRange.m_lpDispatch)
- m_ecRange.ReleaseDispatch();
- if(m_ecSheet.m_lpDispatch)
- m_ecSheet.ReleaseDispatch();
- if(m_ecSheets.m_lpDispatch)
- m_ecSheets.ReleaseDispatch();
- if(m_ecBook.m_lpDispatch)
- m_ecBook.ReleaseDispatch();
- if(m_ecBooks.m_lpDispatch)
- m_ecBooks.ReleaseDispatch();
- if(m_ecApp.m_lpDispatch)
- m_ecApp.ReleaseDispatch();
- }
- BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)
- {
- if(!m_ecSheet.m_lpDispatch)
- {
- AfxMessageBox("Sheet获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));
- if(!m_ecRange.m_lpDispatch)
- {
- AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);
- return FALSE;
- }
- ret = m_ecRange.GetValue2();//得到表格中的值
- return TRUE;
- }
- void CExcelOperate::GetRowsAndCols(long &rows, long &cols)
- {
- COleSafeArray sa(ret);
- sa.GetUBound(1,&rows);
- sa.GetUBound(2,&cols);
- }
- //只返回CString类型的,其他类型概视为错误
- BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)
- {
- long rRows, rCols;
- long index[2];
- VARIANT val;
- COleSafeArray sa(ret);
- sa.GetUBound(1,&rRows);
- sa.GetUBound(2,&rCols);
- if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)
- {
- AfxMessageBox("出错点1");
- return FALSE;
- }
- index[0]=rows;
- index[1]=cols;
- sa.GetElement(index,&val);
- if(val.vt != VT_BSTR)
- {
- CString str;
- str.Format("出错点2, %d",val.vt);
- AfxMessageBox(str);
- return FALSE;
- }
- dest = val.bstrVal;
- return TRUE;
- }
- //将beginS到endS之间设置为文本格式
- BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)
- {
- if(GetRangeAndValue(beginS, endS))
- {
- m_ecRange.Select();
- m_ecRange.SetNumberFormatLocal(COleVariant("@"));
- return TRUE;
- }
- return FALSE;
- }
- //将beginS到endS之间(必须是一列)设置为真正的文本格式
- BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)
- {
- if(GetRangeAndValue(beginS, endS))
- {
- m_ecRange.Select();
- Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));
- if(!m_tempRange.m_lpDispatch) return FALSE;
- COleVariant vTrue((short)TRUE),
- vFalse((short)FALSE);
- //int tempArray[2] = {1, 2};
- COleSafeArray saRet;
- DWORD numElements = {2};
- saRet.Create(VT_I4, 1, &numElements);
- long index = 0;
- int val = 1;
- saRet.PutElement(&index, &val);
- index++;
- val = 2;
- saRet.PutElement(&index, &val);
- //m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
- 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);
- m_tempRange.ReleaseDispatch();
- return TRUE;
- }
- return FALSE;
- }
C++之操作Excel(抄录https://www.cnblogs.com/For-her/p/3499782.html)的更多相关文章
- 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 ...
- python操作excel表格(xlrd/xlwt)
最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...
- python3:操作excel文件
前提:自动化接口测试中,可以将用例放在excel中管理.结合实际情况讲解如何操作excel文件 1.安装xlrd:pip install xlrd 2.导入模块:import xlrd 3.打开Exc ...
- C#利用NPOI操作Excel文件
NPOI作为开源免费的组件,功能强大,可用来读写Excel(兼容xls和xlsx两种版本).Word.PPT文件.可是要让我们记住所有的操作,这便有点困难了,至此,总结一些在开发中常用的针对Excel ...
- .Net 操作Excel表格
一..从NuGet中,引用 Microsoft.Office.Interop.Excel类库. 方法一.先打开一个execl表然后进行保存 Application xApp = null; Workb ...
- 【转】python操作excel表格(xlrd/xlwt)
[转]python操作excel表格(xlrd/xlwt) 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异, ...
- xlrd、xlwt 操作excel表格详解
转自:https://www.cnblogs.com/jiablogs/p/9141414.html python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是 ...
- 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html
#网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...
- POI操作Excel(xls、xlsx)
阿帕奇官网:http://poi.apache.org/ POI3.17下载:http://poi.apache.org/download.html#POI-3.17 POI操作Excel教程(易百教 ...
随机推荐
- SecureCRT 常用技巧
转自:http://blog.chinaunix.net/uid-26575352-id-3063143.html 快捷键: 1. ctrl + a : 移动光标到行首 2. ctrl + e :移 ...
- Android之Handler与AsyncTask的区别
1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可 ...
- dubbo项目实战代码展示
最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...
- 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望
[BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...
- ios UITableView高度自适应(转)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // ...
- java面向对象、构造方法 之内部类
UML类图 UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中 属性表示这类事物的性质(描述它的数据) 方法表示这类 ...
- 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 ...
- python基础-第四篇-4.1内置函数
lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...
- golang的指针和切片
首先为什么要讲go的指针和切片放在一起? 因为go指针和切片都是引用类型 引用类型就是说切片和指针保存的只是内存的地址,而不是具体的值,效率在大数据读取方面效率会高很多. 1.怎么定义一个切片 方法1 ...
- java基础06 switch
public class SwitchDemo01 { /** * 韩嫣参加计算机编程大赛 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 如果获得第二名,将奖励惠普笔记本电脑一部 如果获得第三 ...