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
方法,具体代码参考如下:
三、使用
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
函数代码可以进一步完善,日后再说吧,来活了!发现研究一个东西需要时间,整理研究成果的更长。
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.
相关文章推荐
- qt技巧--使用html导出表格替代excel
- 使用EasyPoi 导出简单的Excel表格。
- 使用Aspose.Cell控件实现Excel高难度报表的生成(一)导出表格控件
- 如何使用html表格自定义或采用tableexport.js第三方插件以excel格式导出
- ThinkPHP5 使用 PHPExcel 导出表格封装类
- 使用JavaScript将复杂表格导出为 Excel (1)
- 在ASP.NET Web Forms中使用页面导出伪xls Excel表格
- 使用tableExport导出bootstrap-table表格 支持中文的Excel等格式
- 使用C#写WPS的excel 使用“WPS表格”导出Excel文档
- 如何使用html表格自定义或采用tableexport.js第三方插件以excel格式导出
- Java 使用 poi 导出excel 表格
- 使用C#写WPS的excel 使用“WPS表格”导出Excel文档
- 使用poi实现导出excel数据表格
- jsp中使用EXCEL组件将表格导出为EXCEL文件
- java中使用poi导出excel表格数据并且可以手动修改导出路径
- js 使用前端导出excel,设置标题和页脚,实现特殊表格需求
- java 使用poi 结合Struts2导出execl表格
- 使用jxl 实现对Excel的导入与导出
- 使用struts2和poi导出excel文档
- MS-SQL使用xp_cmdshell命令导出数据到excel