没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
正文:
Delphi 与 Excel 的亲密接触
Delphi 作为一个出色的 RAD,强大的数据库功能是其最重要的特色之一,但是操纵困难的
QuickReport 控件常常不能满足数据库报表的需要。如果你的报表非常复杂,或者要求灵活地改变格式,
那么使用 Excel 作为报表服务器是一个不错的选择。Delphi 从版本 5 开始提供的 Excel 组件极大地简化
了 OLE 自动化技术的应用。不过缺漏多多的帮助文件一直是 Delphi 最令人诟病的地方,这些新组件也不
例外,本文试图对此作一较详细地介绍。
Excel 的对象模型是一个树状的层次结构,根是应用程序本身,工作簿 WorkBook 是根对象的属性对象,
本文主要讨论的用于数据交换的 WorkSheet 则是工作簿的属性对象,详情参阅 MSOce 提供的 Excel
VBA 帮助文件。在 Delphi 中控制 Excel 首先要与服务器程序建立连接,打开工作簿,然后与目标工作表
交换数据,最后断开连接。
打开 Excel 工作簿
我们的例子从一个带有 TStringGrid(当然要填上一些数据)和两个按钮的主窗体开始,从控制面
板的 Servers 页签中拖一个 TExcelApplication 控件放到窗体上。首先把 ConnectKind 设为
ckRunningOrNew,表示如果能够检测到运行的 Excel 实例则与其建立联系,否则启动 Excel。另外,
如果希望程序一运行即与服务器程序建立联系,可以把 AutoConnect 属性设为 True。
与 Excel 建立联系只要一条语句就可以了:
Excel . Connect;
也许你已经注意到 Servers 页签上还有其他几个 Excel 控件,这些控件通过 ConnectTo 方法可以与前
面的 Excel 联系在一起:
ExcelWorkbook1.ConnectTo(Excel . ActiveWorkbook);
ExcelWorksheet1.ConnectTo(Excel . ActiveSheet as _Worksheet);
ExcelWorksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] as _Worksheet);
要注意,使用 ConnectTo 方法前必须先打开相应的工作簿或工作表,另外这些控件在多数情况下并不
会带来额外的便利,因此最好只使用一个 TExcelApplication。
一旦与 Excel 服务器建立联系,就可以创建新的工作簿:
var
wkBook : _WorkBook;
LCID : Integer;
...
LCID := GetUserDefaultLCID();
wkBook := Excel.Workbooks.Add(EmptyParam, LCID);
Add 函数的第一个参数用于定义新建工作簿所使用的模板,可以使用
xlWBATChart、xlWBATExcel4IntlMacroSheet、 xlWBATExcel4MacroSheet 或者
xlWBATWorksheet 常量,也可以是已有的 xls 文件名。这里的 EmptyParam 是 Variants 单元与定义
的变量,表示使用默认的通用模板创建新工作簿。
如果打开已有的 xls 文档,则应把要打开的文件名作为第一个参数传递给 Open 函数:
wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,LCID);
要知道,所有的数据操作主要是针对活动工作表而言的,下面的语句使用一个_WorkSheet 变量代表当
前的活动单元格。如果知道工作表的名称,其中的索引号可以用工作表名代替:
wkSheet:=wkBook.Sheets[1] as _WorkSheet;
完成数据交换后需要保存工作簿:
Excel.ActiveWorkBook.SaveAs ('MyOutput', EmptyParam,EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, LCID);
或者:
Excel.ActiveWorkBook.Save(LCID);
最后要关闭工作簿并断开与 Excel 的连接:
wkBook.Close(True, SaveAsName, EmptyParam, LCID);
//Excel.Quit;
Excel.Disconnect;
这里的 Close 方法包含有保存的功能,第一个参数说明在关闭工作簿之前是否保存所做的修改,第二个
参数给出要保存的文件名,第三个参数用于多位作者处理文档的情况。第二行要求终止 Excel 的运行。
与工作表交换数据
输入数据是对活动工作表的某个单元格或区域进行的,Range 与 cells 都是工作表的对象属性。
Cells 是单元格的集合,如果没有指定具体位置可以代表整个工作表的所有单元格,但一般使用它是为了
引用某个具体的单元格,比如 WS.Cells.Item[1,1]就表示最左上角的单元格 A1,注意在 VBA 中 Item
是 Cells 的默认属性可以省略,但在 Delphi 中就没有这种便利了。为单元格赋值要引用其 Value 属性,
不言而喻,该属性是一个 Variant 变量,例如:
wkSheet.Cells.Item[1, 1].Value := '通讯录';
当然你也可以为单元格指定公式:
var
AFormula:String;
……
AFormula:='=Rand()';
wkSheet.Range['F3','G6'].Value:=AFormula;
上面的方法非常直接简单,但是速度非常慢,不适合作大型报表。那么能不能把所有的数据依次传递给
Excel 呢?我们可以使用 Range,这个对象代表工作表中的一个区域,象我们用鼠标拖出的那样,一般
是一个矩形区域,只要给定其左上角和右下角单元格的位置就可以了,如 Range['C3','J42']。
这里还有一个小问题,因为如果数据超出 26 列(比如有 100 列)或者需要在运行中确定目标区域范围
的话,使用字符名称标记单元格就比较麻烦。回想一下,既然"C3"是单元格的标记,那么我们当然也可
以使用 Cells,比如 Range[Cells.Item[1,1], Cells.Item[100,100]]。
可以想象,Range 的值应该是数组,但是绝对不能用 Delphi 中的 Array 给它赋值!要记住,在
Delphi 中,Excel 对象的值总是 Variant 类型的。
var
Datas : Variant;
Ir, ic: Integer;
……
Datas:= varArrayCreate([1,ir,1,ic],varVariant); //这里创建 100*100 的动态数组
…… //这里为数组元素赋值
with wkSheet do
Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas;
要注意,工作表与 Range 都有 Cells 属性,为了明确起见,这里使用了 with 语句。此外,Range 是有
方向性的,用 VarArrayCreate 建立的一维数组只能赋给单行的 Range,如果要为单列的 Range 定义值,
必须使用二维数组,比如:
Datas:=VarArrayCreate([1,100,1,1], varVariant);//创建 100*1 的动态数组。
顺便提一下,Cells.Item[]实际上返回的也是 Range 对象。
从工作表中取回数据基本上是写数据的逆过程,稍微需要注意的是如何确定工作表的数据范围:
var
ir, ic : Integer;
……
wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
ir := Excel.ActiveCell.Row;
ic := Excel.ActiveCell.Column;
这里巧妙地利用特殊单元格函数 SpecialCells 取得包含数据的最后一个单元格。
数据编辑
下面是数据编辑的两个例子。
var
DestRange: OleVariant;
begin
DestRange := Excel.Range['C1', 'D4'];
Excel.Range['A1', 'B4'].Copy(DestRange);
上面的例子复制了 8 个单元格的内容。如果给 Copy 函数传递一个空参数,则该区域的数据被复制到剪
贴板,以后可以用 Paste 方法粘贴到别的位置。
var
WS: _Worksheet;
……
Excel.Range['A1', 'B4'].Copy(EmptyParam); //在一个工作表中复制数据到剪贴板
WS := Excel.Activesheet as _Worksheet; //改变活动工作表
WS.Range['C1', 'D4'].Select;
WS.Paste(EmptyParam, EmptyParam, lcid); //把剪贴板中的内容粘贴到新的工作表中
格式设置
选择 Excel 作为报表服务器主要是因为它强大的格式化能力。我们首先把标题"通讯录"进行单元格合并,
居中显示,然后修改字体为 18 磅的"隶书",粗体:
with wkSheet.Range['A1','D1'],Font do
begin
Merge(True); //合并单元格
HorizontalAlignment:= xlCenter;
Size:=18;
Name:='隶书';
FontStyle:=Bold;
end;
剩余10页未读,继续阅读
hu62310030
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python 版冒泡排序算法源代码
- tensorflow-gpu-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp39-cp39-manylinux2010-x86-64.whl
- Python版本快速排序源代码
- Python 语言版的快速排序算法实现
- 450815388207377安卓_base.apk
- 超微主板 X9DRE-TF+ bios 支持 nvme启动
- 基于Python通过下载气象数据和插值拟合离散数据曲线实现对寒潮过程的能量分析
- 智能车仿真软件.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页