文档库 最新最全的文档下载
当前位置:文档库 › 连接EXCEL

连接EXCEL

******************************************************************************************
39bar excel.39bar(col;row;barstr;Headstr;FootStr;Height)
align
改变当前选中数据单元格的数据排列方式 excel.align(hAlign;vAlign)
参数说明:
..halign : 水平方向排列方式
..valign : 垂直方向排列方式
其中hAlign : 0表示按系统缺省方式排列; 1表示居左排列; 2表示居中排列;3表示居右排列
其中valign : 0表示按系统缺省方式排列; 1表示居顶排列; 2表示居中排列; 3表示居底排列
excel.Align(2;2) //水平和垂直均居中排列

autofit excel.autofit
当前选中区域中的内容按缩小字体方式填充
无参数
autowrap excel.Autowrap
当数据量大于当前单元格时,允许自动换行
batchstart1
batchstatt2
batchcancel
batchend
与EXCEL批量数据交换
excel.batchstart1(col;row) 批处理开始(方法1)
excel.batchstart2(col;row) 批处理开始(方法2)
excel.Batchcancel 取消批处理
excel.batchend 批处理结束
当有大量的数据需要与EXCEL进行交换时,如果仍采用常规的数据交换方式,则需要大量的处理时间.如果采用这一组批处理控制命令,则会极大地提高处理速度.
使用方法是,首先定义批处理开始点,然后执行常规的数据交换命令,最后通过excel.batchend命令执行数据交换.例:
...
excel.batchstart1(2;3) //在cells[2,3]开始批处理
excel.cells(2;3)=321 //对CELLS进行赋值
excel.cells(2;4)=100
qry_emp.toexcel = 3;5
...
excel.batchend //完成批处理,执行真正的数据交换
...

Bottomline excel.BottomLine
无参数
EXCEL选择区域画底边框线
leftline excel.leftline
无参数
EXCEL选择区域画左边框线
Rightline excel.Rightline
无参数
EXCEL选择区域画右边框线
Topline excel.Topline
无参数
EXCEL选择区域画顶边框线
Cells(col;row) excel.cells(col;row) = Value
参数调用:
..Col: EXCEL单元格列坐标
..Row: EXCEL单元格行坐标
..Value: 单元格中的值
向EXCEL指定的单元格中赋值
close excel.close
无调用参数
关闭EXCEL
color Excel.Color = value
调整EXCEL当前选中的单元格的背景色
Excel.Select(1;1;1;10)
Excel.Color = clGreen
Colwidth excel.Colwidth(col)=Colwidth
参数调用:
..Col: EXCEL列坐标
..ColWidth: 列宽度值
调整EXCEL指定列的宽度
Copy Excel.Copy
无调用参数
执行EXCEL中的拷贝命令,将所选内容拷贝到剪切板中
CopyCols Excel.CopyCols(Col;ColCount)
参数调用:
..Col: EXCEL列坐标
..ColCount: 需要拷贝的列数
多列整列拷贝
CopyRows Excel.CopyRows(Row;RowCount)
参数调用:
..Row: EXCEL行坐标
..RowCount: 需要拷贝的行数
多行整行拷贝
DeleteRow Excel.DeleteRow(Row)
参数调用:
..Row: 需要删除的EXCEL行坐标
整行删除
Font Excel.Font = 字体;字号;粗否;斜否;字体色
调整EXCEL当前选中的单元格的字体
Excel.Select(1

;1;1;10)
Excel.Font = 宋体;16;True;False;clRed
请参阅字体
Frame Excel.Frame
无调用参数
EXCEL当前选中的单元格画外框

GridAll Excel.GridAll
无调用参数
EXCEL当前选中的单元格画表格线
InsertCol Excel.InsertCol(Col)
参数调用:
..Col: EXCEL列坐标
在EXCEL中指定列前插入一新列
Insertcolwithcopy Excel.Insertcolwithcopy(Col)
参数调用:
..Col: EXCEL列坐标
在EXCEL中指定列前插入一新列,并将指定列的格式也复制到新列
InsertCols Excel.InsertCols(Col;ColCount)
参数调用:
..Col: EXCEL列坐标
..ColCount: 需要插入的列数
在EXCEL中指定列前插入多列新列
InsertColsWithCopy Excel.InsertColsWithCopy(Col;ColCount)
参数调用:
..Col: EXCEL列坐标
..ColCount: 需要插入的列数
在EXCEL中指定列前插入多列新列, 并将指定列的格式也复制到新列
InsertRow Excel.InsertRow(Row)
参数调用:
..Row: EXCEL行坐标
在EXCEL中指定行前插入一新行
InsertRowWithCopy Excel.InsertRowWithCopy(Row)
参数调用:
..Row: EXCEL行坐标
在EXCEL中指定行前插入一新行, 并将指定行的格式也复制到新行
InsertRows Excel.InsertRows(Row;RowCount)
参数调用:
..Row: EXCEL行坐标
..RowCount: 需要插入的行数
在EXCEL中指定行前插入多行新行
InsertRowsWithCopy Excel.InsertRowsWithCopy(Row;RowCount)
参数调用:
..Row: EXCEL行坐标
..RowCount: 需要插入的行数
在EXCEL中指定行前插入多行新行, 并将指定行的格式也复制到新行
InsertOLEObj Excel.InsertOleObj(Col;Row;Filename)
参数调用:
..Col: EXCEL列坐标
..Row: EXCEL行坐标
..Filename: OLE对象文件名
在EXCEL中指定单元格处按给定文件创建OLE对象
Excel.InsertOleObj(10;10;.\lxpdoc.doc)
InsertPic excel.InsertPic(Col;Row;PicFilename)
参数调用:
..Col: EXCEL列坐标
..Row: EXCEL行坐标
..PicFilename: 图形文件名,文件类型支持由EXCEL决定
在EXCEL中指定单元格处插入图片文件
Excel.InsertOleObj(10;10;.\lxpjpg.jpg)
Merge Excel.Merge(hAlign;vAlign)
参数调用:
..halign : 合并后水平方向排列方式
..valign : 合并后垂直方向排列方式
hAlign: 0表示按缺省方式 , 1表示居左排列 , 2表示居中排列 , 3表示居右排列
valign: 0表示按缺省方式 , 1表示居顶排列 , 2表示居中排列 , 3表示居底排列.
合并当前选中的单元格
Excel.Select(2;2;6;6)
Excel.Merge(2;2)
MoveObjectx Excel.Moveobjectx(offset)
参数调用:
..Offset : 水平方向移动偏移量
水平方向移动当前选中对象.
Excel.insertoleobj(1;2)=lxp.jpg
Excel.MoveObjectx(-30)
Excel.MoveObjecty(-30)
MoveObjecty Excel.Moveobjecty(offset)
参数调用:
..Offset : 垂直方向移动偏移量
垂直方向移动当前选中对象.
Excel.insertoleobj(1;2)=lxp.jpg
Excel.MoveObjectx(-30)
Excel.MoveObjecty(-30)
NumFormat Excel.NumFormat(Format)
参数调用:
..Format :数据显示格式命

令字符串
设置当前选中区域的数值格式
请参阅 格式命令字符串
Open Excel.Open(xlsfilename)
参数调用:
..XlsFilename :EXCEL文件名
如果XlsFilename参数省略,则将使用与报表文件同名的XLS格式文件.
打开EXCEL程序
Pagebreak Excel.PageBreak(Row)
参数调用:
..Row :EXCEL行坐标
在EXCEL中指定行后插入一分页符
Paste Excel.Paste(Col;Row)
参数调用:
..Col :EXCEL列坐标
..Row :EXCEL行坐标
在excel中指定的单元格中,从前切板粘帖数据
Excel.Select(1;1)
Excel.Copy
Excel.Paste(1;3)
PasteCols Excel.PasteCols(Col)
参数调用:
..Col :EXCEL列坐标
在excel中指定的列后,粘帖EXCEL列数据及其格式,该命令需要与Excel.CopyCols配合使用.
Excel.CopyCols(4;10)
Excel.PasteCols(5)
PasteRows Excel.PasteRows(Row)
参数调用:
..Row :EXCEL行坐标
在excel中指定的行后,粘帖EXCEL行数据及其格式,该命令需要与Excel.CopyRows配合使用.
Excel.Copyrows(4;10)
Excel.PasteRows(5)
PictureHeight Excel.PictureHeight(Ratio)
参数调用:
..Ratio : 当前图形对象纵向缩放比例
按比例纵向缩放图形对象
PictureRatio Excel.PictureRatio(Ratio)
参数调用:
..Ratio : 当前图形对象缩放比例
按比例缩放图形对象(横向纵向同时缩放)
PictureWidth Excel.PictureWidth(Ratio)
参数调用:
..Ratio : 当前图形对象横向缩放比例
按比例横向缩放图形对象
PictureWidthHeight Excel.PictureRatio(wRatio;hRatio)
参数调用:
..wRatio : 当前图形对象横向缩放比例
..hRatio : 当前图形对象纵向缩放比例
按比例缩放图形对象(横向纵向同时按不同比例缩放)
Preview Excel.Preview
无参数调用
调用EXCEL的预视功能
Print Excel.Print
无参数调用
调用EXCEL的打印功能
RunMacro Excel.RunMacro(Macroname)
参数调用:
..Macroname : 需要运行的宏命令名
运行EXCEL宏命令
Excel.Runmacro('module.xls!InsertOLEOBJbyfile')
RowHeight Excel.Rowheight(Row)
参数调用:
..Row :EXCEL行坐标
调节EXCEL中指定行的行高
Save Excel.Save
无参数调用
保存EXCEL文档
Saveas Excel.SaveAs(Filename)
参数调用:
..Filename : 文件名
另在当前EXCEL中打开的文档
Excel.SaveAs(c:\doc\newdoc.xls)
SaveColVal Excel.SaveColVal(Col;Value)
参数调用:
..Col : EXCEL列坐标
..Value : 与需要保存的列坐标相对应的关键词
根据VALUE的值保存EXCEL列坐标,保存之后,可以通过函数COLVAL求出相应的列值.
Excel.SaveColVal(10;Marke) //通过Marke保存列10的坐标值
Excel.SaveColVal(11;Mike) //通过Mike保存列11的坐标值
Excel.SaveColVal(12;Mary) //通过Mary保存列12的坐标值
...
Var.Emp_name = Mike
Excel.cells(ColVal({var.Emp_name});1)=Mike's site
//根据变量var.Emp_name的值找到相应的列,上语句相当于
Excel.cells(11;1)=Mike's site

SaveRowVal Excel.SaveRowVal(Row;Value)
参数调用:
..Row : EXCEL行坐标
..Va

lue : 与需要保存的行坐标相对应的关键词
根据VALUE的值保存EXCEL行坐标,保存之后,可以通过函数RowVAL求出相应的行值.
Excel.SaveRowVal(10;Marke) //通过Marke保存行10的坐标值
Excel.SaveRowVal(11;Mike) //通过Mike保存行11的坐标值
Excel.SaveRowVal(12;Mary) //通过Mary保存行12的坐标值
...
Var.Emp_name = Mike
Excel.cells(1;RowVal({var.Emp_name}))=Mike's site
//根据变量var.Emp_name的值找到相应的行,上语句相当于
Excel.cells(1;11)=Mike's site

Select Excel.Select(LeftCol;TopRow;RightCol;BottomRow)
参数调用:
..LeftCol : EXCEL起始列坐标
..TopRow : EXCEL起始行坐标
..RightCol : EXCEL终止列坐标
..BottomRo
无人回复,本人自己参考下列文章,有所收获。不敢独享,放出大家看看。
///************************************************************************************************
C++ Builder5.0基于OLE技术对Excel 2000的调用
李胜广 山东大学控制科学与工程学院 邮编:250061
赵秀娟 广东五邑大学电子系 邮编:529020
贾 垒 山东大学控制科学与工程学院
摘要:利用C++ Builder 5.0可视化的设计工具,强大方便的数据库开发功能和Excel强大的电子表格处理功能,为处理多重报表和复杂报表提供一个良好的方法。
关键词:OLE 自动化客户程序 电子表格
Abstract: The paper provides a good method to make use of powerful database exploitation function of C++ Builder and powerful electron table management function of Excel 2000.
Key words: OLE,automation client programs,electron table

一 引言
C++ builder 5.0是Inprise公司推出的基于C++语言的可视化开发语言,不仅具有新颖的可视化设计工具,还配有数据库引擎,可以通过SQL连接或ODBC访问多种数据库,并具有开发基于Client/Server模式的数据库应用程序的能力。当我们进行数据库软件开发的时候,一般要进行大量报表设计,尤其当涉及到设计多重报表或交叉报表时,我们会觉得力不从心。利用EXCEL强大的电子表格处理功能,可以解决C++ Builder 自带报表工具功能少的缺陷。
C++ Builder调用Excel常用的方法有两种:一种是利用OLE技术调用Excel。OLE(对象的连接和嵌入)是微软公司提出的标准,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。第二种是利用ODBC数据库技术调用Excel。第一种方法比较简单,方便,本文讨论的是第一种方法。
二 系统功能要求
随着电子化办公的推广和保险业务的全面开展,账本式的管理方法已不能对数据庞大的电子化设备进行合理有效的管理,这就要求电子化的管理方式,通过计算机和公司局域网实现对设备进行管理。我们开发的电子化管理软件由电子化设备管理数据库、电子化设备耗材管

理数据库组成,信息技术管理人员可以对本数据库进行添加、删除、修改、查询等操作,并且可以打印各种查询表格,表格按照EXCEL格式进行打印,并且保存归档。
C++Builder软件自带创建报表工具,如QReport控件。但是相对于EXCEL强大的电子表格处理功能和方便的操作而言,QReport控件功能就显得很苍白。在该管理软件中,我们将查询结果自动生成EXCEL表格,然后在EXCEL环境下进行打印或者保存文件。具体函数实现在下面的段落中进行详细说明,并且都给出示例。
三 函数的实现
要在应用程序中控制Excel2000的运行,首先必须在编制自动化客户程序时使其头文件要包含Comobj.hpp和Utilcls.h。
即:#include
#include
C++ Builder开发者把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:Variant OlePropertySet(属性名,参数……);
获得对象属性:void OlePropertyGet(属性名,参数……);
调用对象方法:1) Variant OleFunction(函数名,参数……);
2) void OleProcedure(过程名,参数……);
C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。
1、Excel中常用的对象是:Application,Workbooks,Worksheets等。
(1) 创建应用对象:如:
Variant ex;
ex=Variant::CreateObject ("Excel.Application");
或者 ex=CreateOleObject ("Excel.Application");
(2) 创建工作簿对象:
Variant wb;
wb=ex.OlePropertyGet("ActiveWorkBook");
(3) 创建工作表对象:
Variant sheet;
sheet=wb.OlePropertyGet("ActiveSheet");
(4) 创建区域对象:
Variant range;
range=sheet.OlePropertyGet("Range","A1:A10");
2、常用的属性操作:
(1)新建EXCEL文件:
(a):新建系统模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add") //默认工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add",1) //单工作表
ex.OlePropertyGet("workbooks").OleFunction("Add",2) //图表
ex.OlePropertyGet("workbooks").OleFunction("Add",3) //宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",4) //国际通用宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",5) //与默认的相同
ex.OlePropertyGet("workbooks").OleFunction("Add",6) //工作簿且只有一个表
(b):新建自己创建的模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add","C:\\WINDOWS\\Profiles\\test2\\Application Data\\Microsoft\\Templates\\result.xlt"); // 后面写上模板的完全路径,注意“\\”
(2)打开工作

簿:
ex.OlePropertyGet("workbooks").OleFunction("open","路径名.xls")
(3)保存工作簿:
wb.OleFunction("Save"); //表格保存
wb..OleFunction("SaveAs","文件名"); //表格保存为,文件路径注意用“\\”
(4)退出EXCEL:
ex.OleFunction ("Quit");
(5)设置字体:
(a):设置单元格字体
sheet.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书");
sheet.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28);
(b):设置所选区域字体
range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",28); range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Color",
RGB(0,0,255));
其中参数的设置:
Font---Name : “隶书” //字体名称
----Size : 12 //字体大小
----Color : RGB(*,*,*) //颜色
-----Underline : true/false //下划线
-----Italic: true/false //斜体
(6)单元格的合并:
(a) range1=sheet.OlePropertyGet("Range", "A1:A2"); //A1和A2单元格合并
(b) AnsiString Str="A"+IntToStr(j)+":"+"C"+IntToStr(j);
range1=sheet.OlePropertyGet("Range",Str); //可以用变量控制单元格合并
range1.OleFunction("Merge" , false);
(7)赋值语句:
(a):指定单元格赋值
sheet.OlePropertyGet("Cells",3,6).OlePropertySet("Value",str);
sheet.OlePropertyGet("Cells",j,1).OlePropertySet("Value","共查到记录:"+IntToStr(j-6));
(b):所选区域单元格赋值
range.OlePropertyGet("Cells").OlePropertySet("Value",10);
(c):所选区域行赋值
range.OlePropertyGet("Rows",1).OlePropertySet("Value",1234);
(d):工作表列赋值
sheet.OlePropertyGet("Columns",1).OlePropertySet("Value",1234);
(8)取值语句:
AnsiString abc=sheet.OlePropertyGet("Cells",120,1).OlePropertyGet("Value");
(9)区域选择:
range.OlePropertyGet("Cells").OleFunction("Select");
(10)窗口属性:
(a)显示属性
ex.OlePropertySet("Windowstate",3); //最大化显示
参数 1---------xlNormal //正常显示
2---------xlMinimized //最小化显示
3---------xlMaximized //最大化显示
(b)状态栏属性
ex.OlePropertySet ("StatusBar","您好,请您稍等。正在查询!");
ex.OlePropertySet ("StatusBar", false); //还原成默认值
(c)标题属性:
ex.OlePropertySet("Caption","查询系统");
四 结论和展望
我们已将上面的技术应用于我们为某保险公司做的电子化设备管理软件中,运行良好,使用方便,维护性好,人机界面友好,功能强大,既利用C++ Builder 强大的开发数据库软件的功能,又利用了Excel强大的电子表格处理功能和表格打印功能,使我们的软件具有专业水平。上

面的程序在C++Builder5.0和Excel2000下调试通过。


TOleContainer *oleExcel;

//ole控件打开excel文件
oleExcel->CreateObjectFromFile("F:\\人员信息.xls", true);

//显示
oleExcel->DoVerb(ovShow);

//取得OleContainer中的Variant形式的Excel对象
Variant vExcel = oleExcel->OleObject.OlePropertyGet("Application");

//取得OleContainer中的Variant形式的Sheet对象
Variant vSheet = vExcel.OlePropertyGet("ActiveSheet");

Variant Ex,Wb,Sh1;
Ex=Variant::CreateObject("Excel.Application");
Ex.PG("WorkBooks").PR("Open","c:\\book1.xls");
Wb=Ex.PG("ActiveWorkBook"); Sh1=Wb.PG("ActiveSheet");
Edit3->Text=Sh1.PG("Cells", Edit1->Text.ToInt(), Edit2->Text.ToInt()).PG("Value");
写数据,保存
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
Sh1.PG("Cells",i,j).PS("Value",i*100+j);
Wb.PR("Save");
Wb.PR("Close");

这一段是从别人的例子


我帖一篇文章给你,希望有所帮助。别人的例子

用C++Builder操纵Excel
(作者:赵天平 2000年04月26日 13:17)


Microsoft Excel作为一个功能强大的电子表格处理软件,已经得到了广泛的应用。在数据库应用软件开发过程中,如果能实现数据库与Excel文件的数据交换,那么一方面能增加数据库数据的来源,另一方面也能方便用户对数据库数据的进一步处理。

C++ Builder是一个可视化快速应用程序开发工具,它提供的OLE Automation机制使得开发人员在应用程序中就能调用Excel,实现数据交换。

在C++ Builder中调用Excel,首先要为Excel建立一个OLE对象,然后通过设定该对象的属性和调用该对象的方法来操纵Excel。C++ Builder通过CreateOleObject()来建立OLE对象;用OlePropertySet(propname,value)来设置OLE对象的属性;用OlePropertyGet(propname)获得OLE对象的属性;通过OleFunction(oleFuncName,[val,...])和OleProcedure(oleProcName,[val,...])来调用OLE对象的方法。

C++ Builder中使用OLE自动化操纵Excel,必须掌握Excel的自动化对象及VBA关于Excel的对象方法和属性,这些都在Microsoft Office(完全安装)的VBAXL8.HLP帮助文件中可以找到,在此就不再赘述。下面以将数据库中的数据转到Excel工作薄中为例,说明C++ Builder操纵Excel的具体方法。

首先新建一个表单Form1,保存单元文件Unit1.cpp,保存工程文件Project1.bpr。然后在表单中加入数据访问控件TTable,将Name属性设为Table1,DatabaseName属性设为BCDEMOS,TableName属性设为Country.db。在表单中加入一个按钮控件TButton,将其Name属性设为Button1,Caption属性设为 “转换为Excel文件”。双击Button1,在Button1Click()函数中加入如下代码:

Variant ex,newxls;

int i,j=1;

try

{

ex=CreateOleObject(″Excel.Application″); //启动Excel

}

catch(...)

{

ShowMessage(

″无法启动Excel″);

}

ex.OlePropertySet(″Visible″,(Variant)true); //使Excel启动后可见

newxls=(ex.OleFunction(″Workbooks″)).OleFunction(″Add″);//新建一个工作薄

Table1-〉Active=true;

//打开数据库

Table1-〉First();

for(i=0;i〈Table1-〉FieldCount;i++)

//将字段名写到工作薄的第一行

{

(ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)1,(Variant)(i+1),(Variant)Table1-〉Fields[i]-〉FieldName);

}

while(!Table1-〉Eof)

//将数据库中的记录依次写到工作薄中

{

j=j+1;

for(i=0;i〈Table1-〉FieldCount;i++)

{

(ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)j,(Variant)(i+1),

(Variant)Table1-〉Fields[i]-〉AsString);

}

Table1-〉Next();

}

newxls.OleFunction(″SaveAs″,(Variant)filename);

//保存工作薄,filename是工作薄的全文件名

ex.OleFunction(″Quit″);

//退出Excel,释放OLE对象

注意,要使用OLE自动化对象,在编译之前还必须在Unit1.cpp文件前面加上#include ″ComObj.hpp″。

运行程序就可以实现将数据库中的数据转换到Excel工作薄中。同样的道理,使用OlePropertyGet()函数,也可以将Excel工作薄中的数据读到数据库中去。


对word
转贴:别恋轩
---- 要 在 应 用 程 序 中 控 制Word 97 的 运 行, 首 先 必 须 在 编 制 自 动 化 客 户 程 序 时 使 其 头 文 件 中 包 含 文 件ComObj.hpp, 写 入 #include 。 编 程 工 具C + + Builder 的 开 发 者 把 调 用Word 97 自 动 化 对 象 的 功 能 大 致 包 装 成 了 几 个Ole object class 函 数, 应 用 程 序 设 计 人 员 可 以 很 方 便 地 利 用 它 们。
* 设 定Ole 对 象 的 属 性:

OlePropertyGet(propname)
OlePropertySet(propname,value)
其 中value 是 任 何 可 以 转 换 为Variant 型 的 值
* 调 用Ole 对 象 的 方 法:

OleProcedure(OleProcName,[val,...])
OleFunction(OleFuncName,[val,...])
其 中val 是 任 何 可 以 转 换 为Variant 型 的 值
---- 可 以 通 过OleFunction(OleFuncName,[val,...]) 父 对 象 返 回 其 子 对 象, 句 法 是: 子 对 象 名= 父 对 象 名. OleFunction(OleFuncName,val)。 而 且 可 以 对 此 方 法 组 合 从 父 对 象 返 回 其 下 层 对 象 的 对 象。

---- C + + Builder 中 使 用OLE 自 动 化 控 制Word 97, 必 须 掌 握Word 97 的 自 动 化 对 象 及Microsoft Word Visual Basic 帮 助 文 件 中 关 于Word 的 对 象 方 法 和 属 性。Word 对 象 代 表 一 个 Word 的 元 素, 如 文 档、 段 落、 书 签 或 单 个 的 字 符。 集 合 是 一 个 对 象, 该 对 象 包 含 其 他 数 个 对 象, 通 常 这 些 对 象 属 于 相 同 的 类 型, 例 如

, 一 个 集 合 对 象 中 可 包 含 文 档 中 的 所 有 书 签 对 象。 通 过 使 用 属 性 和 方 法, 可 以 修 改 单 个 的 对 象, 也 可 修 改 整 个 的 对 象 集 合。 属 性 是 对 象 的 一 个 特 性 或 者 该 对 象 操 作 的 一 个 方 面。 例 如, 文 档 属 性 包 含 名 称、 内 容、 保 存 状 态, 以 及 是 否 启 用 修 订。 要 更 改 一 个 对 象 的 属 性, 可 以 修 改 属 性 的 值。 方 法 是 对 象 可 以 进 行 的 动 作。

---- 代 表Word 97 应 用 程 序 的 自 动 化 对 象 有 两 个:Word.Application 和 Word.Basic, 通 过Application 对 象 的WordBasic 属 性 可 以 允 许 它 们 之 间 进 行 变 换 赋 值。 在C + +Builder 中 通 过CreateOleObject(" …") 就 可 启 动Word 并 获 得 句 柄, 将 其 赋 给Variant 变 量。 如 有 两 个Variant 型 变 量V1 和V2, WordBasic 是Application 对 象 的 属 性:

V1=CreateOleObject("Word.Application");
V2=V1.OleFunction("WordBasic")。
---- 以 下 通 过 一 个 简 单 的 例 子, 具 体 说 明 如 何 在C + + Builder 中 实 现 Word 97 的 自 动 化 功 能, 其 功 能 是 打 开 或 创 建 新 文 档, 并 向 当 前 活 动 中 发 送 文 字、 插 入 位 图 和 画 条 直 线 等。 在C + + Builder 集 成 开 发 环 境IDE 下, 建 立 一 项 目Project1, 其 中 包 含Form1( 其Caption 为OLE Automation) 的 单 元 文 件Unit1.cpp。 表 单Form1 的OpenDialog1 对 象 的Filter 设 为 Word 文 档 或 位 图。Unit1.cpp 的 头 文 件 中 必 须 包 含"ComObj.hpp"。 代 码 如 下:

头 文 件Unit1.h 代 码 为:
#ifndef Unit1H
#define Unit1H
// - - - - - - - - - - - - -
#include

#include

#include

#include

#include

#include

#include

// - - - - - - - - - - - - -
class TForm1 : public TForm
{
__published: // IDE -managed Components
TButton *Button1;
TOpenDialog *OpenDialog1;
TButton *Button2;
TMemo *Memo1;
TBevel *Bevel1;
TButton *Button3;
TLabel *Label1;
TButton *Button5;
TBevel *Bevel2;
TLabel *Label2;
TLabel *Label3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
private:// User declarations
public:// User declarations
Variant V,Vdocuments,Vdocument1,Vdocument2,Vactive;
/ * 定 义Variant 型 全 局// 变 量,
分 别 指 代Application 对 象, V 的Documents
对 象, Vdocuments 的Document 对 象
(Vdocument1,Vdocument2) 以 及
V 的ActiveDocument 对 象 */
int tag; // 用 于 记 录Button3 被 点 击 的 次 数
__fastcall TForm1(TComponent *

Owner);
Variant __fastcall GetWordObject();
// 获 得Word 97 自 动 化 对 象 函 数
void __fastcall Add(int i);
// 编 辑 当 前 活 动 文 档 指 定 的
段 落 文 字 的 函 数
};
// - - - - - - - - - - - - -
extern PACKAGE TForm1 *Form1;
// - - - - - - - - - - - - -
#endif
Unit1.cpp 文 件 代 码 为:
#include

#pragma hdrstop
#include "Unit1.h"
#include

// - - - - - - - - - - - - -
#pragma package(smart_init)
#pragma resource " *.dfm"
TForm1 *Form1;
// - - - - - - - - - - - - -
__fastcall TForm1::TForm1(TComponent * Owner)
: TForm(Owner)
{
tag=1;// 令tag 的 初 值 为1,
其 将 随Button3 的 点 击 次 数 而 递 增
}
// - - - - - - - - - - - - -
Variant __fastcall TForm1::GetWordObject()
{
Variant Obj1;
AnsiString AppName="Word.Application" ;
HWND hPrevApp = ::FindWindow(NULL,
"Microsoft Word");
if(!hPrevApp)
{
Obj1=CreateOleObject(AppName) ;
//Word 没 启 动 就 启 动 它 返 回 一 自 动 化 对 象
}
else
Obj1=GetActiveOleObject(AppName);
// 否 则 返 回 正 在 运 行 的 实 例 自 动 化 对 象
Obj1.OlePropertySet("Visible",true);
return Obj1;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int j;
V=GetWordObject();
// 获 得Word 97 自 动 化 对 象Application
Vdocuments=V.OleFunction("Documents");
// 通 过Application 获 取Documents 对 象
if (OpenDialog1 ->Execute())
// 使 用Documents 对 象 的Open 方 法
打 开 文 件, 并 返 回Document 对 象
Vdocument1=Vdocuments.OleFunction
("Open",OpenDialog1 ->FileName);
j=Vdocument1.OleFunction("ComputeStatistics",2);
// 计 算 打 开 文 档 的 页 数
Label1 ->Caption=" 文 件" +
Vdocument1.OlePropertyGet("Name")
+" 页 数 是:" +IntToStr(j);
}
// - - - - - - - - - - - - -
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i,j;
i=tag;
Vactive=V.OleFunction("ActiveDocument");
// 获 取Application 的ActiveDocument 对 象
j=Vactive.OleFunction("ComputeStatistics",4);
// 计 算 当 前 文 档 的 段 落 数
// 的 的Paragraphs 集 合 对 象 增 加 一 段
Vactive.OleFunction("Paragraphs").OleFunction("Add");
i=j +i;// 当 前 文 档 被 编 辑 的 段 落 序 号
Add(i);// 调 用 编 辑 当 前 活 动 文 档
指 定 的 段 落 文 字 的 函 数
Memo1 ->Clear();// 清 除Memo1 的 内 容
tag=tag +1;
}
// - - - - - - - - - - - - - -
void __fastcall TForm1::Button2Click(TObject *Sender)
{
V=GetWordObject();
Vdocuments=V.OleFunction("");
Vdocument2=Vdocuments.OleFunction("Add");
// 使 用Documents 对 象 的Add 方 法 新 建 文 档
Vdocument2.OlePropertySet("Password","

12345");
// 设 置 新 建 文 档 的 口 令
}
// - - - - - - - - - - - - - -
void __fastcall TForm1::Add(int i)
{
Variant V1;
// 设 置 被 编 辑 段 的 内 容、 字 体 大 小、
颜 色 及 是 否 斜 体
V1=((Vactive.OleFunction("Paragraphs")).
OleFunction("Item",i)).OleFunction("Range");
(V1.OleFunction("Font")).OlePropertySet("Italic",true);
(V1.OleFunction("Font")).OlePropertySet("Size",18);
(V1.OleFunction("Font")).OlePropertySet("ColorIndex",6);
(V1.OleFunction("Font")).OlePropertySet("Size",18);
V1.OlePropertySet("Text",Memo1 ->Text);
}
// - - - - - - - - - - - - -
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Variant Vshape,Vactive1,Vline;
Vactive1=V.OleFunction("ActiveDocument");
Vshape=Vactive1.OleFunction("Shapes");
// 获 取 当 前 活 动 文 档 的Shapes 对 象
// 使 用Shapes 对 象 的AddLine 方 法 化 直 线
Vline=Vshape.OleFunction("AddLine",90,80,400,80);
if (OpenDialog1 ->Execute())
// 使 用Shapes 对 象 的AddPicture
方 法 插 入 指 定 位 图
Vshape.OleFunction("AddPicture",OpenDialog1



对word
.hpp
#include "Word_2K_SRVR.h"
#include

.cpp
void __fastcall TszTJForm::N9Click(TObject *Sender)
{
StatusBar1->SimpleText="正在启动 Word 请稍等...";
String NowTime;
NowTime=Now().DateTimeString();
TWordApplication *WordApp;
WordApp=new TWordApplication(Application);
WordApp->Documents->Add();
WordApp->Set_Caption(WideString(WordCaption()));

if(RadioButton1->Checked)
{
WordApp->Documents->Item(Variant(1))->Range()->Text=WideString(" 收入统计明细表: ");
}
else if(RadioButton2->Checked)
{
WordApp->Documents->Item(Variant(1))->Range()->Text=WideString(" 支出统计明细表: ");
}
else
{
WordApp->Documents->Item(Variant(1))->Range()->Text=WideString(" 收支统计明细表: ");
}
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(1))->Range->Font->Name=WideString("隶书");
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(1))->Range->Font->Size=16;



WordApp->Documents->Item(Variant(1))->Paragraphs->Add();
String FieldCaptions;
for(int i=0;iColumns->Count;i++)
{
if(DBGrid1->Columns->Items[i]->Title->Caption=="操作人")
{
DBGrid1->Columns->Items[i]->Title->Caption="操作";
}
if(DBGrid1->Columns->Items[i]->Title->Caption=="金额(人民币)")
{
DBGrid1->Columns->Items[i]->Title->Caption="金额";
}
FieldCaptions+=" "+DBGrid1->Columns->Items[i]->Title->Caption;


}
WordApp->Documents->Item(Variant(1))->Paragraphs->Add();
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(3))->Range->Text=WideString(" "+FieldCaptions);

WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Vari

ant(3))->Range->Font->set_Color(clGreen);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(3))->Range->Font->Size=12;
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(3))->Range->Font->Name=WideString("宋体");

//WordApp->Documents->Item(Variant(1))->Paragraphs->Add();

int j=4;
int CountNo=1;
while(!ADOQuery1->Eof)
{
WordApp->Documents->Item(Variant(1))->Paragraphs->Add();
String FieldString="";

for (int i=0;iColumns->Count;i++)
{


FieldString+=" "+ADOQuery1->Fields->Fields[i]->Value;

}
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(j))->Range->Text=WideString(IntToStr(CountNo)+"."+FieldString);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(j))->Range->Font->set_Color(clBlack);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(j))->Range->Font->Size=11;
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(j))->Range->Font->Name=WideString("宋体");
StatusBar1->SimpleText="正在写入第:"+String(ADOQuery1->RecNo)+"条记录.";
ADOQuery1->Next();
CountNo++;
j++;
}
StatusBar1->SimpleText="正在写入统计信息...";
int n;
n=j;
int Now;
WordApp->Documents->Item(Variant(1))->Paragraphs->Add();


n+=1;
for(int i=0;iLines->Count;i++)
{
int k;

k=n;
k+=i;
WordApp->Documents->Item(Variant(1))->Paragraphs->Add();




WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(k))->Range->Text=WideString(" "+Memo1->Lines->Strings[i]);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(k))->Range->Font->Name=WideString("隶书");
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(k))->Range->Font->set_Color(RGB(0,182,0));
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(k))->Range->Font->Size=12;
Now=k;
}
WordApp->Documents->Item(Variant(1))->Paragraphs->Add();

WordApp->Documents->Item(Variant(1))->Paragraphs->Add();

WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(Now+2))->Range->Text=WideString(" 报表结束时间: "+NowTime);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(Now+2))->Range->Font->Name=WideString("隶书");
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(Now+2))->Range->Font->set_Color(clRed);
WordApp->Documents->Item(Variant(1))->Paragraphs->Item(Variant(Now+2))->Range->Font->Size=13;


WordApp->Visible=true;
delete WordApp;
StatusBar1->SimpleText="完毕.";
}



对word
void __fastcall TPWordForm::BtnInsertRecordClick(TObject *Sender)
{
try
{
try
{
WordApplication->Connect();
}
catch (Exception &exception)
{
MessageDlg("Word may not be installed", mtError, TMsgDlgButtons() << mbYes, 0);
Abort;

}
WordApplication->Visible = True;
WordApplication->Caption = StringToOleStr("Borland automation");

TVariant FileName;
FileName = "e:\\tempmodel.doc";
Word_2k::WordDocumentPtr prop;

prop =WordApplication->Documents->Open((TVariant*)&FileName);
WordDocument->ConnectTo(prop);

WordApplication->Options->CheckSpellingAsYouType = False; //关闭拼写检查
WordApplication->Options->CheckGrammarAsYouType = False; //关闭语法检查

btnCloseWord->Enabled = True;
btnPrint->Enabled = True;
btnPreview->Enabled = True;

}
catch (Exception &exception)
{
Application->ShowException(&exception);
WordApplication->Disconnect();
}
}



void __fastcall TPWordForm::btnPreviewClick(TObject *Sender)
{
WordDocument->PrintPreview();
}


void __fastcall TPWordForm::btnPrintClick(TObject *Sender)
{
CommentsPtr fPtr,tempPtr;
fPtr=WordDocument->Get_Comments();
// >Get_Fields();
tempPtr=fPtr->Item(1);
WordDocument->PrintOut();
}

Microsoft Excel作为一个功能强大的电子表格处理软件,已经得到了广泛的应用。在数据库应用软件开发过程中,如果能实现数据库与Excel文件的数据交换,那么一方面能增加数据库数据的来源,另一方面也能方便用户对数据库数据的进一步处理。

C++ Builder是一个可视化快速应用程序开发工具,它提供的OLE Automation机制使得开发人员在应用程序中就能调用Excel,实现数据交换。

在C++ Builder中调用Excel,首先要为Excel建立一个OLE对象,然后通过设定该对象的属性和调用该对象的方法来操纵Excel。C++ Builder通过CreateOleObject()来建立OLE对象;用OlePropertySet(propname,value)来设置OLE对象的属性;用OlePropertyGet(propname)获得OLE对象的属性;通过OleFunction(oleFuncName,[val,...])和OleProcedure(oleProcName,[val,...])来调用OLE对象的方法。

C++ Builder中使用OLE自动化操纵Excel,必须掌握Excel的自动化对象及VBA关于Excel的对象方法和属性,这些都在Microsoft Office(完全安装)的VBAXL8.HLP帮助文件中可以找到,在此就不再赘述。下面以将数据库中的数据转到Excel工作薄中为例,说明C++ Builder操纵Excel的具体方法。

首先新建一个表单Form1,保存单元文件Unit1.cpp,保存工程文件Project1.bpr。然后在表单中加入数据访问控件TTable,将Name属性设为Table1,DatabaseName属性设为BCDEMOS,TableName属性设为Country.db。在表单中加入一个按钮控件TButton,将其Name属性设为Button1,Caption属性设为 “转换为Excel文件”。双击Button1,在Button1Click()函数中加入如下代码:


Variant ex,newxls;
int i,j=1;

try
{
ex=CreateOleObject("Excel.Application"); //启动Excel
}
catch(...)


{
ShowMessage("无法启动Excel");
}

ex.OlePropertySet("Visible",(Variant) true); //使Excel启动后可见
newxls=(ex.OleFunction("Workbooks")).OleFunction("Add");//新建一个工作薄

Table1->Active=true;//打开数据库
Table1->First();

for(i=0;iFieldCount;i++)//将字段名写到工作薄的第一行
{
ex.OleFunction("Cells").OlePropertySet("Item",(Variant)1,(Variant)(i+1),
(Variant)Table1->Fields->Fields[i]->FieldName);
}

while(!Table1->Eof)//将数据库中的记录依次写到工作薄中
{
j=j+1;

for(i=0;iFieldCount;i++)
{
(ex.OleFunction("Cells")).OlePropertySet("Item",(Variant)j,(Variant)(i+1),(Variant)Table1->Fields->Fields[i]->AsString);
}

Table1->Next();
}

newxls.OleFunction("SaveAs",(Variant)"C:\te.xls");//保存工作薄,C:\te.xls是工作薄的全文件名
ex.OleFunction("Quit");//退出Excel,释放OLE对象
}

注意,要使用OLE自动化对象,在编译之前还必须在Unit1.cpp文件前面加上#include ″ComObj.hpp″。

运行程序就可以实现将数据库中的数据转换到Excel工作薄中。同样的道理,使用OlePropertyGet()函数,也可以将Excel工作薄中的数据读到数据库中去。








相关文档
相关文档 最新文档