您的位置:首页 > 其它

VC操作Excel的方法

2012-03-20 00:44 399 查看
所有资料来源于网络
利用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应用程序
Workbooks:是Workbook 的集合,代表了工作薄。
Worksheets:是Worksheet的集合,是Workbook的子对象。
Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。
Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。
二、VC操作Excel的初始化过程
1、导入Excel库文件。
首先打开Class Wizard,点击"Add class"按钮下的"From a type Library"导入 office安装目录下的"excel.exe"(适用于 Excel2003),然后选择需要用的一些类,比如_Application, _Workbook,Workbooks, Worksheets,_Wroksheet,Range,Shapes等。点击确定后,系统会在你的程序目录下生成excel.h和excel.cpp两个文件,在要使用这些导入的类时加入#include
"Excel.h"即可。
2、初始化Application。
首先, 初始化COM组件
view plaincopy to clipboardprint?

if(!AfxOleInit())

{

AfxMessageBox("无法初始化COM的动态连接库");

return FALSE;

}

if(!AfxOleInit())

{

AfxMessageBox("无法初始化COM的动态连接库");

return FALSE;

}

然后,创建Excel 服务器(启动Excel)
定义app的全局或成员变量 _Application app;
view plaincopy to clipboardprint?

if (!app.CreateDispatch("Excel.Application"))

{

AfxMessageBox("无法启动Excel服务器");

return FALSE;

}

if (!app.CreateDispatch("Excel.Application"))

{

AfxMessageBox("无法启动Excel服务器");

return FALSE;

}

3、设置Excel的状态
view plaincopy to clipboardprint?

app.SetVisible(bVisble); // 使Excel可见

app.SetUserControl(bControl); // 允许其他用户控制Excel

app.SetVisible(bVisble); // 使Excel可见

app.SetUserControl(bControl); // 允许其他用户控制Excel

三、VC对Excel的操作
定义变量
view plaincopyto clipboardprint?

Workbooks books;

_Workbook book;

Worksheets sheets;

_Worksheet sheet;

LPDISPATCH lpDisp;

Range range;

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

Workbooks books;

_Workbook book;

Worksheets sheets;

_Worksheet sheet;

LPDISPATCH lpDisp;

Range range;

COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

1、打开已有的Excel文件
view plaincopy to clipboardprint?

books.AttachDispatch(app.GetWorkbooks());

// 或者也可以

// books = app.GetWorkbooks();

lpDisp = books.Open("D:\\\\1.xls", covOptional,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,

covOptional, covOptional, covOptional, covOptional);

books.AttachDispatch(app.GetWorkbooks());

// 或者也可以

// books = app.GetWorkbooks();

lpDisp = books.Open("D:\\\\1.xls", covOptional,covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,

covOptional, covOptional, covOptional, covOptional);

2.、 新建一个.xls文件,并写入数据
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
// Get the Workbooks collection so that you can add a new workbook

books.AttachDispatch(app.GetWorkbooks()); // 得到Workbooks

book =books.Add(covOptional); // 得到Workbook

// Get the Worksheets collection so that you canget the IDispatch for the first Worksheet

sheets =book.GetWorksheets(); // 得到Worksheets

sheet =sheets.GetItem(COleVariant((short)1)); // 得到Worksheet

// 分别向每个单元格添加数据

// Excel2000 用函数SetValue()即可, Excel2003用函数SetValue2()

//
range = sheet.GetRange(COleVariant("A1"), covOptional); // 获取A1 Range

range.SetValue2(COleVariant("Date")); // 添加数据

range = sheet.GetRange(COleVariant("B1"),covOptional); // 获取B1 Range

range.SetValue2(COleVariant("Order")); // 添加数据
range =sheet.GetRange(COleVariant("C1"), covOptional); // 获取C1 Range

range.SetValue2(COleVariant("Amount")); // 添加数据
range =sheet.GetRange(COleVariant("D1"), covOptional); // 获取D1 Range

range.SetValue2(COleVariant("Tax")); // 添加数据

// 向单元格中添加公式
range =sheet.GetRange(COleVariant("D2"), covOptional); // 获得D2 Range

range = range.GetResize(COleVariant((long)NUMROWS),COleVariant((long)1)); // 重新设置D2的大小

range.SetFormula(COleVariant("=C2*0.07")); // 给D2:D21设置公式

// 设置单元格的格式
range =sheet.GetRange(COleVariant("A1"), COleVariant("D1")); // 获得A1:D1的Range

oFont =range.GetFont(); // 获得Range的字体

oFont.SetBold(COleVariant((short)TRUE)); // 设置是否粗体

oFont.SetColor(COleVariant((long)RGB(255, 0,0))); // 设置字体颜色
oFont.SetName(COleVariant("黑体")); // 设置字体类型
range =range.GetEntireColumn(); // 获得全部的单元格

range.AutoFit(); // 自动适合尺寸
3、 合并单元格
// 思路:1.先获取A1:C1的Range范围,然后重新定义此范围,最后合并

// 2.直接获得A1:C2的Range范围,直接合并。结果和第一种方法一样

Range unionRange;

unionRange =sheet.GetRange(COleVariant("A1"), COleVariant("C1"));

vResult = unionRange.GetMergeCells();

unionRange =unionRange.GetResize(COleVariant((long)2), COleVariant((long)3));

unionRange.Merge(COleVariant((long)0)); //合并单元格

unionRange.SetRowHeight(COleVariant((short)30)); //设置单元格的高度

unionRange.SetHorizontalAlignment(COleVariant((long)-4108));// 水平居中对齐
4、向单元格中插入图片(支持BMP、JPG格式,其他没试)
Shapes shapes = sheet.GetShapes(); // 从Sheet对象上获得一个Shapes

range =sheet.GetRange(COleVariant("B16"),COleVariant("J22")); // 获得Range对象,用来插入图片

rgMyRge1 = range;

shapes.AddPicture("D:\\Test1.jpg" , false , true ,

(float)range .GetLeft().dblVal, (float)range.GetTop().dblVal, // 从本地添加一个图片

(float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);
ShapeRange sRange = shapes.GetRange(_variant_t(long(1)));

sRange.SetHeight(float(30));

sRange.SetWidth(float(30));
5、将已建的.xls文件另存为
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

book.SaveAs(COleVariant("D:\\3.xls"),covOptional,covOptional,

covOptional,covOptional,covOptional,0,

covOptional,covOptional,covOptional,covOptional,covOptional);

6、关闭Excel服务
COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

book.SetSaved(TRUE); // 将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存

range.ReleaseDispatch(); // 释放Range对象

sheet.ReleaseDispatch(); // 释放Sheet对象

sheets.ReleaseDispatch(); // 释放Sheets对象

book.ReleaseDispatch(); // 释放Workbook对象

books.ReleaseDispatch(); // 释放Workbooks对象
book.Close(covOptional, covOptional,covOptional);// 关闭Workbook对象

books.Close(); // 关闭Workbooks对象

app.Quit(); // 退出_Application

app.ReleaseDispatch (); // 释放_Application
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: