利用VC操作Excel的方法至少有两种

1 .利用ODBC把Excel文件当成数据库文件,来进行读、写、修改等操作,网上有人编写了CSpreadSheet类,提供支持。

2. 利用Automation(OLD Automation)方法。将Excel当成组件服务器,利用VBA。又分为基于MFC的和SDK两种。

主要研究了一下第二种基于MFC的OLE编程方法。

一、Excel的对象模型

在对Excel编程之前首先要了解微软Excel 对象(Object)模型。(Parent-Child关系)

图 1 Office 应用程序对象模型(Excel)From msdn

其中:

_application:代表应用程序本身,即Excel应用程序。 EXCEL服务器

Workbooks:  表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所  有的视窗就是workbooks)

  _workbook:  就是一个表,相当于MDI中的一个视窗

Worksheets:  表示所有的表单,每个表都可能有很多表单(sheet1,sheet2)

   _worksheet:  就表示一个表单

Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。

Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。

___1,建立OLE自动化工程

1,建立一个MFC AppWizard(exe)工程,TestExcel。导入excel 库文件,从classwizard中add class处from type library,去office的安装目录下( C:\Program Files1\Microsoft Office\OFFICE11)引入excel.exe这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range .之后会出现excel.h,excel.cpp两个文件

2,在excel.h文件中添加引用重复判断

打开stdafx.h头文件确保包含如下头文件:

#include <afxdisp.h>

#include "excel.h"

3,// 在程序开始或APP初始化的时候初始化COM库
打开testexcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:
BOOL CTestExcelApp::InitInstance()
{
if( !AfxOleInit() ){
AfxMessageBox("初始化Ole出错!");
return FALSE;
}
AfxEnableControlContainer();
......
......
return FALSE;
}

____2操作excel文件

1,新建一个excel,在一个按键或菜单命令中添加代码

    //create an application object,as excel application interface
_Application app;
//workbooks->workbook->worksheets->worksheet->range
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
//cell opeartion requir range object
Range range;
Font font;
Range cols;
//class of COleVariant is packup of the date type of VARIANT, which normally used
//in parameter transmission.In below codes,all parameters are converted by COleVariant class
  //Common OLE variants. These are easy variants to use for calling arguments.
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);   // Start Excel and get the Application object.
   if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Couldn't start Excel and get an application 0bject");
return;
}
//get workbooks
books = app.GetWorkbooks();
//add one book
book = books.Add(covOptional);
//get sheet
sheets = book.GetSheets();
//get the firat sheet
sheet = sheets.GetItem(COleVariant((short)));
//select in the sheet the aree of A1:A1
range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
//set A1 = hello excel
range.SetValue2(COleVariant("Hello excel,it is rainy today"));
//change font,set bold
font = range.GetFont();
font.SetBold(COleVariant((short)TRUE));
//select A2,insert a formula,and set to currency format
range = sheet.GetRange(COleVariant("A2"),COleVariant("A2"));
range.SetFormula(COleVariant("=RAND()*100000"));
range.SetNumberFormat(COleVariant("$0.00"));
//select A:A list, set auto fit
cols = range.GetEntireColumn();
cols.AutoFit();
//display excel,set status to user control
app.SetVisible(TRUE);
app.SetUserControl(TRUE);  //允许其他用户控制excel,否则excel将一闪而过。

2,自动保存生成的excel文件

  book.SaveAs(COleVariant("C:\\a.xls"),covOptional,
covOptional,covOptional,
covOptional,covOptional,(long),covOptional,covOptional,covOptional,
covOptional);

3,上面的程序只能实现新建Excel文件的功能,但大多数情况我们需要的是导入excel中的数据,即要打开现存的xls文件,那么可用如下代码:

CString sPath;// excel的绝对路径
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
LPDISPATCH lpDisp; //接口指针
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if( !app.CreateDispatch("Excel.Application") ){
this->MessageBox("无法创建Excel应用!");
return;
}
sPath = "D:\\table.xls";
books=app.GetWorkbooks();
//workbooks::open take 15 parameters!
lpDisp = books.Open(sPath,covOptional,covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional
);
book.AttachDispatch( lpDisp );
sheets=book.GetSheets();
sheet=sheets.GetItem(COleVariant((short)));
range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

//将variant数据类型转换为CString类。
COleVariant rValue;
rValue=COleVariant(range.GetValue2()); //getvalue2 take no parameter
rValue.ChangeType(VT_BSTR);
this->MessageBox(CString(rValue.bstrVal)); book.SetSaved(TRUE);
app.Quit();

4, 修改第N行第M列单元格颜色(参数color)

Interior it; // 用于修改单元格颜色等属性

range.AttachDispatch((range.GetItem (_variant_t(long(N)), _variant(long(M)))).pdispVal);
it = range.GetInterior();
it.SetColor(color);
it.DetachDispatch();
range.AttachDispatch(wht.GetCells());

  

 

VC++ operate excel的更多相关文章

  1. VC操作excel

    http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html   最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要 ...

  2. VC操作Excel之基本操作(颜色等)【转载】

    文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...

  3. 用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)

    首先在stdafx.h里加入对IDispatch接口提供支持的头文件: #include <afxDisp.h> 再在应用程序类的InitInstance()函数里加入: AfxOleIn ...

  4. VC操作Excel之基本操作

    // 变量的定义 _Application app; Workbooks books; _Workbook book; Worksheets sheets; _Worksheet sheet; Ran ...

  5. VC 插入excel

    CString ePath,iPath; m_ePath.GetWindowText(ePath); m_iPath.GetWindowText(iPath); _Application app; W ...

  6. VC6.0读取Excel文件数据

    啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过 ...

  7. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  8. C++中利用libxl操作Excel表格

    libxl是一款操作excel的商业库,支持C.C++.C#和Delphi.下文利用libxl在C++中实现了从excel文档的表1中随机挑选记录,保存到新建的表中.以下为代码: #include & ...

  9. C++读取excel特定行列中的数据

    可以通过COM API调用才是正解,不过需要编写COM接口类,Excel对象库的接口太多了……不过可以用工具自动生成. 我最近也在用VC操作Excel,在VC中可以这样做,在任何一个cpp文件中加入下 ...

随机推荐

  1. pasa的安装

    介绍: http://pasapipeline.github.io/ 参考别人的安装教程:http://sihua.us/pasa.htm 软件下载: https://github.com/PASAp ...

  2. dedecms搜索框制作

    <form method=" name="kwtype"> <table width="> <tr> <td widt ...

  3. Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting

    最近每天半夜,服务器都会出现崩掉的现象,pc  app 都不能正常使用 查看错误日志发现问题所在: [Wed Nov 09 08:07:28.651642 2016] [mpm_winnt:error ...

  4. 【 D3.js 入门系列 --- 2.1 】 关于如何选择,插入,删除元素

    在D3.js中,选择元素的函数有两个:select 和 selectAll . 先说明一下它们的区别: select 是选择所有指定元素的第一个 selectAll 是选择指定元素的全部(以用于后面同 ...

  5. XPath注入笔记

    XPath注入 XQuery注入 测试语句:'or '1'='1 利用工具: Xcat介绍 Xcat是python的命令行程序利用Xpath的注入漏洞在Web应用中检索XML文档 下载地址:https ...

  6. 数据获取以及处理系统 --- 功能规格说明书V2.0

    产品规格说明书: 版本号: V2.0 版本说明: Version 1.0 简单得需求分析以及构思,初稿形成 Version 2.0 细化beta阶段设计,增加典型用户尝尽以及功能罗列 1. 引言 1. ...

  7. zend guard6的使用

    1.生成key edit->preferences->license Keys->generate 2.新建product license文件 3.新建Zend Guard项目文件 ...

  8. Linux安装gcc编译器详解

    本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...

  9. visualSVN Server 设置外网可连接

    首先再根节点右键,打开属性菜单. 打开Network选项卡,在Server name一栏中填入主机域名或者是ip. 然后在创建的项目中单机或者右键,就可以得到访问地址了.

  10. Debian 7.6 新编译内核 3.15.6 开机加载黑屏

    需要手动加载 fbcon 这个模块,或者编译内核的时候,Framebuffer Console support 编译进内核(后者没测试过).加在模块只要修改/etc/default/grub文件或者/ ...