您的位置:首页 > 其它

DxDbGrid与DbGridEh表格使用及导出Excel

2011-05-16 09:47 435 查看
前言:二者都是非常不错的第三方表格控件,都可实现多表头的表格及分组汇总功能;在导出
Excel
方面,个人觉得
DxDbGrid
做的比
DbGridEh
出色,几乎是
Grid
原样导出,
DbGridEh
导出表格模式的单元格与
Grid
显示有所出入。

一、所用版本及安装:

1
、版本:
DevExQuantumGrid v3.22 Pro for D7

EhLib 5.2.84

2
、安装:
DevExQuantumGrid
直接
Setup.exe

OK

EhLib

Delphi7
的安装稍微啰嗦点,具体步骤参考
readme.txt
或如下步骤:

(1).

EhLib 5.2.84
解压缩到目标目录。

(2).
打开
Delphi 7
,将
EhLib

/Delphi7
子目录加到
Delphi

Library path


(
菜单操作路径为:
Tools|Environment Options...|Library|Library path)

(3).

EhLib
目标安装目录中的
common

DataService
子目录的文件移动到
EhLib

/Delphi7
子目录中。

(4).

Delphi 7
中打开
EhLib70.dpk
,编译,但不要安装。

(5).

Delphi 7
中打开
DclEhLib70.dpk
,编译并安装。

(6).
组件面板中出现一个
EhLib
的组件页。

(7).
打开附带的
DEMOS
,编译并运行,测试安装成功。

二、使用
DxDbGrid

1
、窗体拖入
dxDBGrid1

ADOConnection1

ADOQuery1

DataSource1

Button1

SaveDialog1
,然后完成数据的链接及相关控件关联,如何操作,你应该懂的;接下来完成如下图所示的一个表格:



2
、双击
dxDBGrid1
,在
Bands
栏增加
TdxTreeListBand
并填写
Caption
,注意要将
dxDBGrid1

ShowBands
属性设置为
True
才能显示
Bands
栏;同样双击
dxDBGrid1
,在
Columns
栏,添加多个
dxGridColumn
(根据需要选择不同的类型)并使其与数据库字段形成关联,涉及如下几个属性,
BandIndex
选择对应的
Band
从而形成二级表头,
Caption

FieldName

HeaderAlignment

width
等,如此完成了基本的表格设计,如果喜欢表头平滑更改
LookAndFeel
属性为
lfFlat
即可。

如果增加排序功能,
edgoAutoSort(True)

edgoLoadAllRecords(True)

KeyField
(数据库表主键字段)。

如果需要
Footer
汇总,首先设置属性
showSummeryFooter

True
,然后选择需要汇总的
dxGridColum
根据需要更改其
summaryFooterType
属性如
cstSum
(或
cstAvg
),如需要显示汉字,可设置
SummaryFooterFormat
如(平均年龄=
0.00
)。

导出
Excel
可直接利用
dxDbGrid

SaveToXLS
方法,具体代码参考如下:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBGrid,
DB, ADODB, dxDBTLCl, dxGrClms;
type
TSaveMethod = procedure (const FileName: String; ASaveAll: Boolean) of object;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
dxDBGrid1: TdxDBGrid;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
dxDBGrid1Column2: TdxDBGridColumn;
dxDBGrid1Column1: TdxDBGridMaskColumn;
dxDBGrid1Column3: TdxDBGridColumn;
dxDBGrid1Column4: TdxDBGridCheckColumn;
dxDBGrid1Column5: TdxDBGridDateColumn;
dxDBGrid1Column6: TdxDBGridColumn;
dxDBGrid1Column7: TdxDBGridColumn;
dxDBGrid1Column8: TdxDBGridColumn;
Button1: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
private
procedure Save(ADefaultExt, AFilter, AFileName: String; AMethod: TSaveMethod);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Save(ADefaultExt, AFilter, AFileName: String; AMethod: TSaveMethod);
begin
with SaveDialog1 do
begin
DefaultExt := ADefaultExt;
Filter := AFilter;
FileName := AFileName;
if Execute then
AMethod(FileName, true);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Save('xls', 'Microsoft Excel 4.0 Worksheet (*.xls)|*.xls', 'ExpGrid.xls', dxDBGrid1.SaveToXLS);
end;
end.


三、使用
DbGridEh

1
、窗体拖入
DBGridEh1

ADOConnection1

ADOQuery1

DataSource1

Button1

SaveDialog1
,然后完成数据的链接及相关控件关联;接下来完成如下图所示的一个表格:



2
、双击
DbgridEh1
,新增多个
Columns
并使之与数据字段对应,
DbgridEh
设计多表头的关键在于
Culumn
属性
Title
的设定,如上表格“编号”、“名称”需要将
Title->Caption
分别设置为“地址
|
编号”、“地址
|
名称”,原来起作用的关键在于“
|
”这个分隔符;当然还需要设置其他的属性,
FieldName
对应显示的字段,如果需要
Footer
,则在
Column

Footer
属性完成相关设置,如上表格,设置“编号”列的
Footer-

Value
为“合计:”,
ValueType
为“
fvtStaticText
”;“名称”列的
Footer-

FieldName
为“
id

(
此处只是为了将第一列
ID
的和显示在第二列姓名的汇总栏,只为测试没有什么实际意义
)

ValueType
为“
fvtSum
”。

导出
Excel
,以下导出
Excel
函数代码可以进一步完善,日后再说吧,来活了!发现研究一个东西需要时间,整理研究成果的更长。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBGridEhGrouping, DB, ADODB, GridsEh, DBGridEh, Grids, DBGrids,
StdCtrls, DBGridEhImpExp, ComObj, excel2000, oleserver ;
type
TForm1 = class(TForm)
DBGridEh1: TDBGridEh;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure ExportToExcel;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ExportToExcel;
var
XLApp: Variant;
Sheet: Variant;
s1, s2: string;
Caption: String;
Row, Col: integer;
iCount, jCount: Integer;
FBookMark: TBookmark;
FileName: String;
SaveDialog1: TSaveDialog;
TitleName: string;
begin
//如果数据集为空或没有打开则退出
if not DBGridEh1.DataSource.DataSet.Active then  Exit;
SaveDialog1 := TSaveDialog.Create(Nil);
SaveDialog1.FileName := 'TitleName' + '_' + FormatDateTime('YYMMDD', Date);
SaveDialog1.Filter := 'Excel文件|*.xls';
if SaveDialog1.Execute then
FileName := SaveDialog1.FileName;
SaveDialog1.Free;
if FileName = '' then  Exit;
Application.ProcessMessages;
Screen.Cursor := crHourGlass;

if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
//通过ole创建Excel对象
try
XLApp := CreateOleObject('Excel.Application');
except
MessageDlg('创建Excel对象失败,请检查你的系统是否正确安装了Excel软件!', mtError, [mbOk], 0);
Screen.Cursor := crDefault;
Exit;
end;

//生成工作页
XLApp.WorkBooks.Add[xlWBatWorkSheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := 'TitleName';
Sheet := XLApp.Workbooks[1].WorkSheets['TitleName'];
//写标题
sheet.cells[1, 1] := 'TitleName';
sheet.range[sheet.cells[1, 1], sheet.cells[1, DBGridEh1.Columns.Count]].Select; //选择该列
XLApp.selection.HorizontalAlignment := $FFFFEFF4;                               //居中
XLApp.selection.MergeCells := True;                                             //合并
//写表头
Row := 1;
jCount := 3;
for iCount := 0 to DBGridEh1.Columns.Count - 1 do
begin
Col := 2;
Row := iCount+1;
Caption := DBGridEh1.Columns[iCount].Title.Caption;
while POS('|', Caption) > 0 do
begin
jCount := 4;
s1 := Copy(Caption, 1, Pos('|',Caption)-1);
if s2 = s1 then
begin
sheet.range[sheet.cells[Col, Row-1],sheet.cells[Col, Row]].Select;
XLApp.selection.HorizontalAlignment := $FFFFEFF4;
XLApp.selection.MergeCells := True;
end
else
Sheet.cells[Col,Row] := Copy(Caption, 1, Pos('|',Caption)-1);
Caption := Copy(Caption,Pos('|', Caption)+1, Length(Caption));
Inc(Col);
s2 := s1;
end;
Sheet.cells[Col, Row] := Caption;
Inc(Row);
end;
//合并表头并居中
if jCount = 4 then
for iCount := 1 to DBGridEh1.Columns.Count do
if Sheet.cells[3, iCount].Value = '' then
begin
sheet.range[sheet.cells[2, iCount],sheet.cells[3, iCount]].Select;
XLApp.selection.HorizontalAlignment := $FFFFEFF4;
XLApp.selection.MergeCells := True;
end
else begin
sheet.cells[3, iCount].Select;
XLApp.selection.HorizontalAlignment := $FFFFEFF4;
end;
//读取数据
DBGridEh1.DataSource.DataSet.DisableControls;
FBookMark := DBGridEh1.DataSource.DataSet.GetBookmark;
DBGridEh1.DataSource.DataSet.First;
while not DBGridEh1.DataSource.DataSet.Eof do
begin
for iCount := 1 to DBGridEh1.Columns.Count do
Sheet.cells[jCount, iCount] := DBGridEh1.Columns.Items[iCount-1].Field.AsString;
Inc(jCount);
DBGridEh1.DataSource.DataSet.Next;
end;
if DBGridEh1.DataSource.DataSet.BookmarkValid(FBookMark) then
DBGridEh1.DataSource.DataSet.GotoBookmark(FBookMark);
DBGridEh1.DataSource.DataSet.EnableControls;
//读取表脚
if DBGridEh1.FooterRowCount > 0 then
begin
for Row := 0 to DBGridEh1.FooterRowCount-1 do
begin
for Col := 0 to DBGridEh1.Columns.Count-1 do
Sheet.cells[jCount, Col+1] := DBGridEh1.GetFooterValue(Row,DBGridEh1.Columns[Col]);
Inc(jCount);
end;
end;
//调整列宽
for iCount := 1 to DBGridEh1.Columns.Count do
Sheet.Columns[iCount].EntireColumn.AutoFit;
sheet.cells[1, 1].Select;
XlApp.Workbooks[1].SaveAs(FileName);
XlApp.Visible := True;
XlApp := Unassigned;
Screen.Cursor := crDefault;

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExportToExcel;
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: