Excel的对象模型
在对Excel编程之前首先要了解微软Excel 对象(Object)模型。(Parent-Child关系)
Application:代表应用程序本身。即Excel应用程序
Workbooks:是Workbook 的集合,代表了工作薄。
Worksheets:是Worksheet的集合,是Workbook的子对象。
Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。
Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。
二、VC操作Excel的初始化过程
1、导入Excel库文件。
点击"Add class"按钮下的"From a type Library"导入 office安装目录下的"excel.exe",然后选择需要用的一些类,比如_Application, _Workbook, Workbooks, Worksheets,_Wroksheet,Range,Shapes等。
将头文件中的#import "C:\\Program Files\\Microsoft Office\\Office15\\EXCEL.EXE" no_namespace注释掉
将DialogBox()改为_DialogBox()
2、初始化Application。
首先, 初始化COM组件
if(!AfxOleInit())
{
AfxMessageBox("无法初始化COM的动态连接库");
return FALSE;
}
3.调用
引用头文件
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbooks.h"
#include "CWorksheets.h"
#include "CWorkbook.h"
#include "CWorksheet.h"
#include "CFont0.h"
#include "CShapes.h"
#include "CShapeRange.h"
#include "CBorders.h"
#include "CBorder.h"
创建对象
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
LPDISPATCH lpDisp;
CRange range;
CFont0 font;
CRange unionRange;
CRange resizeunionRange;
CBorders border;
CBorder everyborder;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CFileDialog FileDialog(FALSE,_T("xlsx"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("Microsoft Excel 2010(*.xlsx)|*.xlsx|所有文件(*.*)"),NULL);
if(FileDialog.DoModal()!=IDOK)
{
return;
}
CString cStrFile=FileDialog.GetPathName(); //选择保存路径名称 ;
if(::PathFileExists(cStrFile))
DeleteFile(cStrFile);
f( !app.CreateDispatch(_T("Excel.Application")))
{
AfxMessageBox(_T("无法创建Excel应用!"));
return;
}
books.AttachDispatch(app.get_Workbooks()); // 得到Workbooks
book = books.Add(covOptional); // 得到Workbook
sheets = book.get_Worksheets(); // 得到Worksheets
sheet = sheets.get_Item(COleVariant((short)1)); // 得到Worksheet
打开已有的execl(未尝试)
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);
向每个单元格添加数据range = sheet.get_Range(COleVariant(_T("B1")), covOptional); // 获取B1 Range
range.put_Value2(COleVariant(_T("Subamount")));
// 向单元格中添加公式(未尝试)
range = sheet.<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">get_Range</span>(COleVariant("D2"), covOptional); // 获得D2 Range
range = range.get_Resize(COleVariant((long)NUMROWS), COleVariant((long)1)); // 重新设置D2的大小
range.put_Formula(COleVariant("=C2*0.07")); // 给D2:D21设置公式
// 合并单元格 设置单元格的格式 unionRange = sheet.get_Range(COleVariant(_T("A3")), COleVariant(_T("J3")));
unionRange = unionRange.get_Resize(COleVariant((long)1), COleVariant((long)10));
unionRange.Merge(COleVariant((long)0)); //合并单元格;
unionRange.put_RowHeight(COleVariant((short)30)); //设置单元格的高度;
unionRange.put_HorizontalAlignment(COleVariant((long)-4108));// 水平居中对齐;
unionRange.put_Value2(COleVariant(_T("采 购 合 同")));
font = unionRange.get_Font(); // 获得Range的字体
font.put_Bold(COleVariant((short)TRUE)); // 设置是否粗体
//font.put_Color(COleVariant((long)RGB(255, 0, 0))); // 设置字体颜色;
font.put_Size(COleVariant((short)20));
font.put_Name(COleVariant(_T("黑体")));
range = range.GetEntireColumn(); // 获得全部的单元格(未尝试)range.AutoFit(); // 自动适合尺寸 (未尝试)
向单元格中插入图片(支持BMP、JPG格式,其他没试)
CShapes shapes = sheet.get_Shapes(); // 从Sheet对象上获得一个Shapes ;
range = sheet.get_Range(COleVariant(_T("B1")),COleVariant(_T("D1"))); // 获得Range对象,用来插入图片
range.put_RowHeight(COleVariant((short)60)); //设置单元格的高度;
range.put_HorizontalAlignment(COleVariant((long)-4108));// 水平居中对齐;
shapes.AddPicture(_T("D:\\1.jpg") , false , true ,(float)range .get_Left().dblVal+20,
(float)range .get_Top().dblVal+5,100,50);
CShapeRange sRange = shapes.get_Range(_variant_t(long(1)));
//sRange.put_Height(float(50));
//sRange.put_Width(float(100));
unionRange = sheet.get_Range(COleVariant(_T("E1")), COleVariant(_T("J1")));
unionRange = unionRange.get_Resize(COleVariant((long)1), COleVariant((long)6));
unionRange.put_Value2(COleVariant(_T(" 深圳东方启峰科技有限公司")));
将已建的.xls文件另存为
book.SaveCopyAs(COleVariant(cStrFile)); //保存到cStrFile文件
book.put_Saved(true);
books.Close();
关闭Excel服务
resizeunionRange.DetachDispatch();
border.DetachDispatch();
unionRange.DetachDispatch();
font.DetachDispatch();
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
shapes.ReleaseDispatch();
sRange.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
AfxMessageBox(_T("成功导出"));
添加边框
unionRange = sheet.get_Range(COleVariant(_T("B1")), COleVariant(_T("E1")));
resizeunionRange = unionRange.get_Resize(COleVariant((long)1), COleVariant((long)4));
border=resizeunionRange.get_Borders();
for(int i=7;i<11;i++)
{
everyborder = border.get_Item(i);
everyborder.put_Weight(COleVariant((short)2));
everyborder.DetachDispatch();
}
边框有枚举值,但是未找到定义的头文件(引用方法),只有自己定义输入
颜色 //1-black;2-white;3-red;4-green;5-blue;6-yellow;7-pink;8-dark blue.
xlEdgeLeft=7.xlEdgeRight=10.xlEdgeTop=8.xlEdgeBottom.=9 xlInsideVertical=11.xlInsideHorizontal=12
线的样式:
xlContinuous=1 default |
xlDash =-4115 |
xlDashDot =4 |
xlDashDotDot=5 |
xlDot -4118 |
xlDouble -4119 |
xlLineStlyeNone -4142 |
xlSlantDashDot 13 |
xlLineStlyeNone |
put_Weight(COleVariant((short)2));添加默认边框(黑色,实线,7-12所有)
水平居中与垂直居中
vResult=iCell.GetHorizontalAlignment();
if(vResult.lVal!=0)
{
switch (vResult.lVal)
{
case 1: //默认
break;
case -4108: //居中
break;
case -4131 : //靠左
break;
case -4152 : //靠右
break;
}
}
vResult=iCell.GetVerticalAlignment();
if(vResult.lVal!=0)
{
switch (vResult.lVal)
{
case -4160 : //靠上
break;
case -4108 : //居中
break;
case -4107 : //靠下
break;
}
}
通过CPageSet可以对页面进行设置
pageset=sheet.get_PageSetup();
//CString csPrintarea;
//csPrintarea.Format(_T("B1:J%d"),currowNum);
//pageset.put_PrintArea(csPrintarea);
//wdOrientPortrait=0,横向wdOrientLandscape=1 { oPageSetup.put_Orientation(1); // 横向 ;
// 设置上下左右变距,单位缇,以下参数设置的页边距是“适中” ;
pageset.put_TopMargin((float)43);
// 适中时72=2.54cm,默认时90=3.17cm;10≈0.35cm ;
pageset.put_BottomMargin((float)43);// 适中时72=2.54cm,默认时
90=3.17cm;10≈0.35cm
pageset.put_LeftMargin((float)17);// 适中时54=1.9cm,默认时
72=2.54cm
pageset.put_RightMargin((float)17);// 适中时54=1.9cm,默认时
72=2.54cm } //else // 设置为纵向;