分享
 
 
 

在Delphi中创建的简单的Excel报表类

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作为一个开发各种信息系统的程序员,写报表是家常便饭的事,以至于曾经写个一个为报表而报表的项目^_^

我用过报表的控件不多,用过Quick Report,Rave Report还有以前用VB时用过十分低版本的Crystal Report,当然还有这篇文章的主角Excel。Excel做报表有什么好处与坏处。我就不说了,大家都明白。(写了浪费大家时间)

在Delphi中有专门的控件去调用Word、Excel等的Office组件。但这些控件的功能太多了,之间又有不少的联系,如果只是为调用Excel生成报表的话,我觉得还不如我自己这个类方便。

我先来介绍一下我这个类的用法,各位看官,主看以下代码:

procedure TForm1.FormCreate(Sender: TObject);

begin

AFER := TFlexExcelReport.Create;

AFER.ModelFile := ExtractFilePath(Application.ExeName) + 'Book1.xls';

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

AFER.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

p1, p2 : TPoint;

begin

p1.X := 2;

p1.Y := 3;

p2.X := 10;

p2.Y := 20;

AFER.Connect;

AFER.Cells[1, 2] := 'FlexExcelReport Test';

AFER.SelectCell(1, 2);

AFER.Copy;

AFER.SelectRange(p1, p2);

AFER.Paste;

AFER.SelectCell(1, 2);

AFER.Clear;

AFER.SetPrintArea(p1, p2);

end;

程序运行后,点击Button2,就会马上创建一个Excel的实例,这个实例是以Book1.xls为模板来打开的,打开后Excel会自动把这个文档命名为Book11。然后在1,2这个格里面填入内容,选择这个格子,复制,跟着选择2,3 -10,20这个区域,把刚才复制在剪贴板的内容复制进去。接下来就清除掉1,2中的内容,最后设置打印区域。

每次点击Button2都会重复上面的操作。反正用户点击多少次Button2,就会生成多少个Excel的实例。你不必担心,当你退出这个程序时,这些Excel都会随之关闭并释放对像。这里为什么要以Book1.xls为模板呢?原因是我懒,我不想用Delphi操纵VBScript,在空白的WorkSheet中画报表(这是一件会做死人的事)。而是先把报表的式样画好在Book1.xls中,这样每次只要用Delphi填内容就可以了。

是不是很简单呢?(我不是黄婆,不过还是要自夸一下!)

下面是整个FlexExcel Unit的内容:

unit FlexExcel;

interface

uses

SysUtils, Classes, Types, ComObj, Variants;

type

TFlexExcelReport = class(TObject)

private

FList: TList;

FModelFile: string;

function CoordsToXLS(ACol, ARow: integer): string;

procedure SetCells(ACol, ARow: Integer; const Value: string);

public

constructor Create;

destructor Destroy; override;

procedure Clear;

function Connect: Boolean;

procedure Copy;

procedure Paste;

procedure SelectCell(ACol, ARow : integer);

procedure SelectRange(TopLeft, RightBottom : TPoint);

procedure SetPrintArea(TopLeft, RightBottom : TPoint);

property Cells[ACol, ARow: Integer]: string write SetCells;

property ModelFile: string read FModelFile write FModelFile;

end;

implementation

type

TFlexExcelHandle = class(TObject)

private

FConnected: Boolean;

FXlsHandle: Variant;

end;

{

******************************* TFlexExcelReport *******************************

}

constructor TFlexExcelReport.Create;

begin

FList := TList.Create;

end;

destructor TFlexExcelReport.Destroy;

var

i: Integer;

hd: TFlexExcelHandle;

begin

for i := 0 to FList.Count - 1 do

begin

hd := FList[i];

if hd.FConnected then

begin

hd.FXlsHandle.DisplayAlerts := false;

hd.FXlsHandle.Quit;

hd.FXlsHandle := UnAssigned;

end;

hd.Free;

end;

FList.Free;

inherited;

end;

procedure TFlexExcelReport.Clear;

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.Selection.Clear;

end;

function TFlexExcelReport.Connect: Boolean;

var

hd: TFlexExcelHandle;

begin

result := false;

hd := TFlexExcelHandle.Create;

try

hd.FXlsHandle := CreateOleObject('Excel.Application');

hd.FConnected := true;

except

on E : Exception do

begin

hd.Free;

exit;

end;

end;

hd.FXlsHandle.Visible := true;

hd.FXlsHandle.Workbooks.Add [FModelFile];

FList.Add(hd);

result := true;

end;

function TFlexExcelReport.CoordsToXLS(ACol, ARow: integer): string;

var

i: Integer;

begin

result := '';

i := (ACol - 1) div 26;

if i > 0 then result := Chr(64 + i);

i := (ACol - 1) mod 26;

result := result + Chr(64 + i + 1) + IntToStr(ARow);

end;

procedure TFlexExcelReport.Copy;

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.Selection.Copy;

end;

procedure TFlexExcelReport.Paste;

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.ActiveWorkBook.ActiveSheet.PasteSpecial;

end;

procedure TFlexExcelReport.SelectCell(ACol, ARow : integer);

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.ActiveWorkBook.ActiveSheet.Range[CoordsToXLS(ACol, ARow)].Select;

end;

procedure TFlexExcelReport.SelectRange(TopLeft, RightBottom : TPoint);

begin

if (TopLeft.X = RightBottom.X) and (TopLeft.Y = RightBottom.Y) then

SelectCell(TopLeft.X, TopLeft.Y)

else

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.ActiveWorkBook.ActiveSheet.Range[CoordsToXLS(TopLeft.X, TopLeft.Y) + ':' + CoordsToXLS(RightBottom.X, RightBottom.Y)].Select;

end;

procedure TFlexExcelReport.SetCells(ACol, ARow: Integer; const Value: string);

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.ActiveWorkBook.ActiveSheet.Cells[ARow, ACol] := Value;

end;

procedure TFlexExcelReport.SetPrintArea(TopLeft, RightBottom : TPoint);

begin

TFlexExcelHandle(FList[FList.Count - 1]).FXlsHandle.ActiveWorkBook.ActiveSheet.PageSetup.PrintArea := CoordsToXLS(TopLeft.X, TopLeft.Y) + ':' + CoordsToXLS(RightBottom.X, RightBottom.Y);

end;

end.

说明一下:

function CoordsToXLS(ACol, ARow: integer): string;

这个函数的作用是把我们常用的坐标表列1,行2 (1,2 )转换为Excel的表标方式A2,因为我查VBScript时只找到用, 如A2: C5这种方法去选择范围及设定打印区域。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有