卓航论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 107|回复: 2
打印 上一主题 下一主题

用OLE操作Excel

[复制链接]
[至尊红钻5级]发帖数量≥8000篇 [未点亮至尊黄钻]威望不足10点 [未点亮至尊蓝钻]在线时间不足10小时 [未点亮至尊绿钻]贡献度不足10点 [至尊紫钻4级]金币≥20000个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 论坛元老
 UID:  7   [未点亮普号显示]钻石不足3个
 阁 分: 36567
 阁 望: 0
 阁 献: 0
 活 跃: 0
 发 贴: 12405 (0)
 阁 币: 24162  
性 别: I'm 火星人!
阅读权限: 90
在线时长: 0 小时
注册时间: 2016-10-16
最后登录: 2016-10-18
go
楼主
发表于 2016-10-17 16:25:44 |只看该作者 |倒序浏览
本帖发表于 2016-10-17 16:25:44...阅读 108 人...加油,亲爱的楼主:[db:作者]
用OLE操作Excel(目前最全的资料)(04.2.19更新)
本文档部分资料来自互联网,大部分是ccrun(老妖)在Excel中通过录制宏-->察看宏代码-->转为CB代码而来.本文档不断更新中.欢迎大家关注.
要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp
#include "Comobj.hpp"
C++ Builder把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:void    OlePropertySet(属性名,参数……);
获得对象属性:Variant   OlePropertyGet(属性名,参数……);
调用对象方法:1) Variant OleFunction(函数名,参数……);
2) void   OleProcedure(过程名,参数……);
在程序中可以用宏定义来节省时间:
#define  PG  OlePropertyGet
#define  PS  OlePropertySet
#define  FN  OleFunction
#define  PR  OleProcedure
举例:
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add");
可写为
ExcelApp.PG("workbooks").FN("Add");
C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。---www.bianceng.cn
首先定义以下几个变量:
Variant ExcelApp,Workbook1,Sheet1,Range1;
1、Excel中常用的对象是:Application,Workbooks,Worksheets等。
★创建应用对象★
Variant ExcelApp;
ExcelApp = Variant::CreateObject ("Excel.Application");
或者
ExcelApp = CreateOleObject ("Excel.Application");
★创建工作簿对象★
Variant WorkBook1;
WorkBook1 = ExcelApp.PG("ActiveWorkBook");
★创建工作表对象★
Variant Sheet1;
Sheet1 = WorkBook1.PG("ActiveSheet");
★创建区域对象★
Variant Range;
Range = Sheet1.PG("Range","A1:A10");
或者使用
Excel.Exec(PropertyGet("Range")
               
2、常用的属性操作:
★使Excel程序不可见★
ExcelApp.PS("Visible", (Variant)false);
★新建EXCEL文件★
◎ 新建系统模板的工作簿
ExcelApp.PG("workbooks").FN("Add")   //默认工作簿
ExcelApp.PG("workbooks").FN("Add", 1)  //单工作表
ExcelApp.PG("workbooks").FN("Add", 2)  //图表
ExcelApp.PG("workbooks").FN("Add", 3)  //宏表
ExcelApp.PG("workbooks").FN("Add", 4)  //国际通用宏表
ExcelApp.PG("workbooks").FN("Add", 5)  //与默认的相同
ExcelApp.PG("workbooks").FN("Add", 6)  //工作簿且只有一个表
或者使用ExcelApp的Exec方法
Excel.Exec(PropertyGet("Workbooks")).Exec(Procedure("Add"));
◎ 新建自己创建的模板的工作簿
ExcelApp.PG("workbooks").FN("Add", "C:\\Temp\\result.xlt");
★打开工作簿★
ExcelApp.PG("workbooks").FN("open", "路径名.xls")
★保存工作簿★
WorkBook1.FN("Save");      //保存工作簿
WorkBook1.FN("SaveAs", "文件名");//工作簿保存为,路径注意用"\\"
★退出EXCEL★
ExcelApp.FN ("Quit");
ExcelApp = Unassigned;
或者
ExcelApp.Exec(Procedure("Quit"));
★操作工作表★
◎ 选择选择工作表中第一个工作表
Workbook1.PG("Sheets", 1).PR("Select");
Sheet1 = Workbook1.PG("ActiveSheet");
◎ 重命名工作表
Sheet1.PS("Name", "Sheet的新名字");
◎ 当前工作簿中的工作表总数
int nSheetCount=Workbook1.PG("Sheets").PG("Count");
               
★操作行和列★
◎ 获取当前工作表中有多少行和多少列:
Sheet1.PG("UsedRange").PG("Columns").PG("Count"); //列数
Sheet1.PG("UsedRange").PG("Rows").PG("Count");  //行数
◎ 设置列宽
ExcelApp.PG("Columns", 1).PS("ColumnWidth", 22);
或者
Range = ExcelApp.PG("Cells", 1, 3);
Range.PS("ColumnWidth", 22);
◎ 设置行高
ExcelApp.PG("Rows", 2).PS("RowHeight", 25);
或者
Range = ExcelApp.PG("Cells", 2, 1);
Range.PS("RowHeight", 25);
◎ 在工作表最前面插入一行
Sheet1.PG("Rows", 1).PR("Insert");
◎ 删除一行
ExcelApp.PG("Rows", 2).PR("Delete"); //将第2行删除
// 本文作者:ccrun ,如转载请保证本文档的完整性,并注明出处。
// 欢迎光临 C++ Builder 研究 www.ccrun.com
// 摘自:http://www.ccrun.com/doc/go.asp?id=529
★操作单元格★
◎ 设置单元格字体
Sheet1.PG("Cells", 1, 1).PG("Font").PS("Name", "隶书"); //字体
Sheet1.PG("Cells", 2, 3).PG("Font").PS("size", 28);   //大小
◎ 设置所选区域字体
Range.PG("Cells").PG("Font").PS("Size", 28);
Range.PG("Cells").PG("Font").PS("Color", RGB(0, 0, 255));
其中参数的设置:
Font  Name : "隶书"        //字体名称
Size : 12          //字体大小
Color : RGB(*,*,*)      //颜色
Underline : true/false      //下划线
Italic: true/false      //斜体
◎ 设置单元格格式为小数百分比
Sheet1.PG("Cells", 1, 1).PS("NumberFormatLocal", "0.00%");
◎ 设定单元格的垂直对齐方式
Range = ExcelApp.PG("Cells", 3, 4);
// 1=靠上 2=居中 3=靠下对齐 4=两端对齐 5=分散对齐
Range.PS("VerticalAlignment", 2);
◎ 设定单元格的文本为自动换行
Range = ExcelApp.PG("Cells", 3, 4);
Range.PS("WrapText", true);
               
★单元格的合并★
◎ Range = Sheet1.PG("Range", "A1:A2");     //A1和A2单元格合并
String strRange = "A" + IntToStr(j) + ":" + "C" + IntToStr(j); //比如:A1:C5
Range1=Sheet1.PG("Range", strRange.c_str()); //可以用变量控制单元格合并
Range1.FN("Merge", false);
★读写单元格★
◎ 指定单元格赋值
String strValue = "abcdefg";
Sheet1.PG("Cells", 3, 6).PS("Value", strValue.c_str());
Sheet1.PG("Cells", j, 1).PS("Value", "总记录:" + String(j-6));
或者使用
Excel.Exec(PropertyGet("Cells")
               
3、操作图表
★添加图表
Variant Chart;
   Chart = ExcelApp.Exec(PropertyGet("Charts")).Exec(Function("Add"));
   ExcelApp.Exec(PropertySet("Visible")
★滚动图表
for(int nRotate=5; nRotate = 0; nRotate -= 5)
   {
      Chart.Exec(PropertySet("Rotation")
另外,为保证程序能正常运行,需要在程序中判断目标机器是否安装了Office;
try
{
   ExcelApp = Variant::CreateObject ("Excel.Application");
}
catch(...)
{
   ShowMessage("运行Excel出错,请确认安装了Office");
   return;
}
#include "comobj.hpp"
//---------------------------------------------------------------------------
// 对指定Excel文件中的指定列进行排序
// strExcelFileName : excel文件名
// nCol : 指定的列号
// nSortStyle : 1:升序,2:降序
void SortExcelColumn(String strExcelFileName, int nCol, int nSortStyle)
{
   Variant vExcelApp, vWorkbook, vRange;
   vExcelApp = Variant::CreateObject("Excel.Application");
   vExcelApp.OlePropertySet("Visible", false);
   vExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open", strExcelFileName.c_str());
   vWorkbook = vExcelApp.OlePropertyGet("ActiveWorkbook");
   vExcelApp.OlePropertyGet("Columns", nCol).OleProcedure("Select");
   vExcelApp.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", 1, nCol).OleProcedure("Select");
   vRange = vExcelApp.OlePropertyGet("Selection");
   vRange.Exec(Function("Sort")
分享到: QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 支持支持0 反对反对0

使用道具 举报

[至尊红钻3级]发帖数量≥1000篇 [至尊黄钻1级]威望≥10点 [未点亮至尊蓝钻]在线时间不足10小时 [至尊绿钻1级]贡献度≥10点 [至尊紫钻9级]金币≥8000000个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 高级会员
 UID:  4   [未点亮普号显示]钻石不足3个
 阁 分: 999851780
 阁 望: 100
 阁 献: 101
 活 跃: 0
 发 贴: 1381 (0)
 阁 币: 999850098  
性 别: I'm 火星人!
阅读权限: 50
在线时长: 1 小时
注册时间: 2016-10-14
最后登录: 2016-10-24
沙发
发表于 2016-10-18 11:05:30 |只看该作者
本回复帖发表于 2016-10-18 11:05:30,感谢沙漠虫子对本帖的认真回复,你的回复是对楼主莫大的鼓舞
有道理。。。

使用道具 举报

[至尊红钻2级]发帖数量≥100篇 [未点亮至尊黄钻]威望不足10点 [未点亮至尊蓝钻]在线时间不足10小时 [未点亮至尊绿钻]贡献度不足10点 [未点亮至尊紫钻]金币不足100个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 中级会员
 UID:  18   [未点亮普号显示]钻石不足3个
 阁 分: 223
 阁 望: 3
 阁 献: 3
 活 跃: 0
 发 贴: 204 (0)
 阁 币: 10  
性 别: I'm 火星人!
阅读权限: 30
在线时长: 1 小时
注册时间: 2011-1-6
最后登录: 2016-10-21
板凳
发表于 2016-10-19 22:55:35 |只看该作者
本回复帖发表于 2016-10-19 22:55:35,感谢tairgee对本帖的认真回复,你的回复是对楼主莫大的鼓舞
不知该说些什么。。。。。。就是谢谢

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、每个贴内连续回复请勿多余3贴,每个版面回复请勿多余10贴!
4、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!

手机版| 百度搜索:vkee.pw

2012-2015 卓航旗下 GMT+8, 2024-6-2 11:14 , Processed in 0.609766 second(s), 30 queries . Powered by Discuz! X3.2  

禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.如遇版权问题,请及时联系站长(QQ:5213513)

今天是: | 本站已经安全运行: //这个地方可以改颜色

快速回复 返回顶部 返回列表