利用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. 68. 蓄水池抽样(Reservoir Sampling)

    [本文链接] http://www.cnblogs.com/hellogiser/p/reservoir-sampling.html 问题起源于编程珠玑Column 12中的题目10,其描述如下: H ...

  2. Java-->打包发送信息(UDP协议)

    --> 好像UDP 协议没有TCP 协议应用得那么广泛 --> UdpSender 类定义一个发送端(快递公司) package com.dragon.java.udpdatagram; ...

  3. Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

  4. java.lang.ClassCastException: java.lang.String cannot be cast to com.jy.hfims.domain 映射实体类型错误

    今天在做 excel导出的时候,出现了一个问题"java.lang.ClassCastException: java.lang.String cannot be cast to com.do ...

  5. Java笔记3-for,switch循环,格式化输出,随机数

    大纲:一.分支结构 if switch二.循环 for while do while break continue三.格式化输出 [printf] int score = 100; String na ...

  6. 【Flask】Flask快速玩框架

    最近比较忙 快速玩Flask框架,为微博做些准备 part 1 python程序 from flask importFlask, render_template, session, redirect, ...

  7. Yahoo Pure 中文参考手册

    Pure 是来自雅虎的 CSS 框架,使用 Normalize.CSS 无需任何 JavaScript 代码.框架基于响应式设计,提供多种样式的组件,包括表格.表单.按钮.表.导航等.标识使用非常简单 ...

  8. 获取 .net framework 路径

    要获取当前程序所使用的.netframework路径: System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); ...

  9. JSR 303 - Bean Validation 介绍及最佳实践

    JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...

  10. OpenGL 学习

    一.红宝书学习资料汇集 第八版的图书源码 源代码: http://opengl-redbook.com/Code/oglpg-8th-edition.zip 第九版的图书源码 http://www.o ...