Delphi表格控件DBGridEh应用实例6.docx
- 文档编号:7664241
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:9
- 大小:19.57KB
Delphi表格控件DBGridEh应用实例6.docx
《Delphi表格控件DBGridEh应用实例6.docx》由会员分享,可在线阅读,更多相关《Delphi表格控件DBGridEh应用实例6.docx(9页珍藏版)》请在冰豆网上搜索。
Delphi表格控件DBGridEh应用实例6
6.输入/输出
1)导入导出数据
导入/导出数据在实际处理过程中是比较烦琐的。
但是Enlib3.0提供了一系
列函数让你轻松实现此功能,而且支持的文件格式很多:
Text,Csv,HTML,RTF,XLS和内部数据格式。
除此之外,还可对任意选择的数据区域进行操作。
函数如下:
Pascal:
SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:
\temp\file1.txt',F
alse);
C++:
SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c:
\\temp\\file1.txt",false);
说明:
其中false参数表示导出的是选中的局部数据区域数据,true则为整个表格数据。
例:
将当前表格中数据导出为EXCELS格式文件。
在窗体中添加一个SaveDialog组件和导出”按钮B_exp,在导出”按钮的click事件中添加如下代码:
procedureTForm1.B_expClick(Sender:
TObject);
var
ExpClass:
TDBGridEhExportClass;
Ext:
String;
Begin
SaveDialog1.FileName:
='file1';
if(ActiveControlisTDBGridEh)then
ifSaveDialog1.Executethen
begin
caseSaveDialog1.FilterIndexof
1:
beginExpClass:
=TDBGridEhExportAsText;Ext:
='txt';end;
2:
beginExpClass:
=TDBGridEhExportAsCSV;Ext:
='csv';end;
3:
beginExpClass:
=TDBGridEhExportAsHTML;Ext:
='htm';end;
4:
beginExpClass:
=TDBGridEhExportAsRTF;Ext:
='rtf';end;
5:
beginExpClass:
=TDBGridEhExportAsXLS;Ext:
='xls';end;
else
ExpClass:
=nil;Ext:
='';
end;
ifExpClassnilthen
begin
ifUpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3))UpperCase(Ext)then
SaveDialog1.FileName:
=SaveDialog1.FileName+'.'+Ext;
SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,False);//其中false为局部数据
end;
end;
end;
2)从多种格式导入/导出数据到TDBGridEh
EhLib的函数集可以从DBGridEh导出数据到Text,Csv,HTML,RTF,XI以及其内部格式。
它可以保存数据到流(TStream对象)或文件。
例子Pascal:
SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:
/temp/file1.txt',F
alse);C++:
SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c:
//temp//file1.txt",false);EhLib的函数集可以从Text以及其内部格式的数据导入到
DBGridEh的数据集中。
它可以从文件中读取数据或读取数据到流(TStream
对象)。
3)DBGRID生成EXCEL报表
从盒子上下载了一个别人做的单元文件,可以用来让DBGRID生成EXCE报
表。
可是公司内部由于有多个门店,也就是我需要分别连接这些服务器然后通过这个单元生成一个EXCELXL文件,里面会有多个sheet,代表各个门店的数据。
sheet的名字会以门店名字为主。
现在我将这个单元修改了一下,已经可以实现如上效果,大致原理就是通过checklistbox这个控件取出所有门店信息,可以勾选。
点击按钮,自动取出checklistbox控件被勾选门店的IP地址并进行逐个连接,然后查询并显示DBGRID之后全部写入EXCEL
可是问题来了,当某个店数据超过EXCEI的限制:
65536行时,如何修改可以使其自动新增一个SHEE,T
并将多余的数据插入另一页面?
而且不能影响后续的其他门店数据跑取。
请高手们抽个空,帮忙看看改一
改。
谢谢了。
函数有点乱。
请大家不要笑话。
函数使用方式:
DBGridToExcel(dbgrid1,nil);
函数内容:
type
functionDBGridToExcel2(dgrSource:
TDBGrid;
UpAniInfo:
TUpAniInfoProc=nil):
Integer;
functionDBGridToExcel(dgrSource:
TDBGrid;UpAniInfo:
TUpAniInfoProc):
Integer;const//从DBGrid导出到Excel(2005.8.23改进至可以导入几乎无限的数据)
//Excel每Sheet最大行数
MAX_VAR_ONCE=65535;一//次导出的条数
var//返回导出记录条数
MyExcel,varCells:
Variant;
MySheet,MyCells,Cell1,Cell2,Range:
OleVariant;
iRow,iCol,iSheetIdx,iVarCount,iCurRow:
integer;
CurPos:
TBookmark;
i:
integer;
MAX_SHEET_ROWS:
integer;
begin
dgrSource.DataSource.DataSet.DisableControls;
dgrSource.DataSource.DataSet.First;
MyExcel:
=CreateOleObject('Excel.Application');
MyExcel.WorkBooks.Add;
MyExcel.Visible:
=False;
begin
ifdgrSource.DataSource.DataSet.RecordCount<=MAX_VAR_ONCEthen
iVarCount:
=
dgrSource.DataSource.DataSet.RecordCount
else
iVarCount:
=
MAX_VAR_ONCE;
varCells:
=VarArrayCreate([1,
iVarCount,
1,
dgrSource.FieldCount],varVariant);
end;
iSheetIdx:
=1;
iRow:
=0;
Result:
=0;
//这里是循环从checklistbox取门店IP进行连接
fori:
=0tosqltoexcel.clb1.Items.Count-1do
ifsqltoexcel.clb1.Checked[i]then
begin
sqltoexcel.qrycon.Locate('sto_name',sqltoexcel.clb1.Items.Strings[i],[loCaseInse
nsitive]);ifsqltoexcel.qrycon.fieldbyname('sto_serverip').AsString<>''then
begin
withsqltoexceldo
begin
query1.Close;
con1.Connected:
=false;
con1.ConnectionString:
='Provider=SQLOLEDB.1;Password=123456;';
con1.ConnectionString:
=con1.ConnectionString+'PersistSecurityInfo=True;';
con1.ConnectionString:
=con1.ConnectionString+'UserID=sa;Initial
Catalog=test;';con1.ConnectionString:
=con1.ConnectionString+'Data
Source='+qrycon.fieldbyname('sto_serverip').AsStri
ng;
//导入SQL语句
query1.Close;
query1.SQL.Clear;
memo1.Lines.SaveToFile('C:
\1234.txt');
query1.SQL.LoadFromFile('c:
\1234.txt');
query1.Open;
end;
dgrSource.DataSource.DataSet.First;
//新增一个Sheet
ifiSheetIdx<=MyExcel.WorkBooks[1].WorkSheets.Countthen
MySheet:
=MyExcel.WorkBooks[1].WorkSheets[iSheetIdx]
else
MySheet:
=MyExcel.WorkBooks[1].WorkSheets.Add(NULL,MySheet);
//加在后面
//设置名字
iflength(sqltoexcel.qrycon.fieldbyname('sto_name').AsString)>16then
MyExcel.workbooks[1].WorkSheets[iSheetIdx].name:
=copy(sqltoexcel.qrycon.fieldbyname('sto_name').As
String,16,length(sqltoexcel.qrycon.fieldbyname('sto_name').AsString)-15)
else
MyExcel.workbooks[1].WorkSheets[iSheetIdx].name:
=sqltoexcel.qrycon.fieldbyname('sto_name').AsStrin
g;
MyCells:
=MySheet.Cells;
Inc(iSheetIdx);
iRow:
=1;
foriCol:
=1todgrSource.FieldCountdo
begin
MySheet.Cells[1,iCol]:
=dgrSource.Fields[iCol-1].DisplayName;
MySheet.Cells[1,iCol].Font.Bold:
=True;
MySheet.Columns[iCol].ColumnWidth:
=dgrSource.Fields[iCol-1].DisplayWidth;
if(dgrSource.Fields[iCol-1].DataType=ftString)
or(dgrSource.Fields[iCol-1].DataType=ftWideString)then
begin//对于字符串”型数据则设ExceI单元格为文本”型
MySheet.Columns[iCol].NumberFormatLocal:
='@';
end;
end;
Inc(iRow);
MAX_SHEET_ROWS:
=65535;
whiIenotdgrSource.DataSource.DataSet.Eofdo
begin
iCurRow:
=1;
whiIenotdgrSource.DataSource.DataSet.Eofdo
begin
foriCoI:
=1todgrSource.FieIdCountdo
begin
varCeIIs[iCurRow,iCoI]:
=dgrSource.FieIds[iCoI-1].AsString;
end;
Inc(iRow);
Inc(iCurRow);
Inc(ResuIt);
dgrSource.DataSource.DataSet.Next;
if(iCurRow>iVarCount)or(iRow>MAX_SHEET_ROWS+1)then
begin
ifAssigned(UpAniInfo)then
UpAnilnfo(Format('(已导出%d条儿[Result]));//显示已导出条数Application.ProcessMessages;
Break;
end;
end;
Cell1:
=MyCells.ltem[iRow-iCurRow+1,1];
Cell2:
=MyCells.ltem[iRow-1,
dgrSource.FieldCount];
Range:
=MySheet.Range[Cell1,Cell2];
Range.Value:
=varCells;
if(iRow>MAX_SHEET_ROWS+1)ther一个Sheet导出结束begin
MySheet.Select;
MySheet.Cells[1,1].Select;〃使得每一Sheet均定位在第一格end;
Cell1:
=Unassigned;
Cell2:
=Unassigned;
Range:
=Unassigned;
end;//endofbigwhile
end;//endofif
end;//endoffor
MyCells:
=Unassigned;
varCells:
=Unassigned;
MyExcel.WorkBooks[1].WorkSheets[1].Select;//必须先选Sheet
MyExcel.WorkBooks[1].WorkSheets[1].Cells[1,1].Select;
MyExcel.Visible:
=True;
MyExcel.WorkBooks[1].Saved:
=True;
MyExcel:
=Unassigned;dgrSource.DataSource.DataSet.EnableControls;end;
4)使用TPrintDBGridEh组件
在Delphi的IDE组件面板中选择TPrintDBGridEh并拖放其到form上。
在其
DBGridEh属性中设置为相应的TDBGridEh组件。
使用Print以及Preview方法在打印机上打印网格或者在预览窗体中预览网格。
5)打印时确定Ehlib定义的报表表头颜色?
在执行打印之前,加上下面的语句:
DBGridEh1.FixedColor:
二clLime;//clLime可以换成你想要的颜色比如cIRed是红色等等PrintDBgridEh1.Options:
二[pghColored,pghFITingByColWidths];方括号里的
"pghColored"是必需的,其它的根据你的需要决定取舍
6)Ehlib中的PrintDBGridEh如何印页码,即第几页共几页
PrintDBGridEh.PageFooter.CenterText:
第&[Page]页共&[Pages页'
在对象管理器中的相关位置有设
7)怎么让PrintDBGridEh只打印DbGridEh中指定的列
1、才15列,我一般都会有30列以上,PrintDBGridEh可以支持
正好打印在一页上(按宽度)
2、如果实在想指定列,了不起用代码在打印的时候将其他列全部Hide然
后打印,打印完成后再将隐藏的列显示出来不就结了,对吧?
仅对Column.visible进行操作就好了
8)怎样进行横向打印/打印预览?
TPrintDBGridEh并没有专六的属性来设置页面特性。
在调用打印或打印预览方法前,你必须设置你将要执行打印的打印源(Orientation)。
uses,PrViewEh,Printers.
procedureTForm1.bPreviewClick(Sender:
TObject);
begin
PrintERPreview.Orientation:
=poLandscape;
PrintDBGridEh1.Preview;
end;
9)将存在的DBGrid组件转换为DBGridEh组件
通过笔者上述介绍,想必你已经对Enlib组件包产生好感而且越越欲试了,
那就赶快下载使用吧。
但是,使用一段时间并且喜欢上它后,你又有新的问题产生了,那就是为了保持界面风格一致,能否将已经开发完成的应用程序中的DBGrid组件能否转换为DBGridEh组件,进行一次彻底革命?
答案是肯定的。
尽管DBGridEh并不是继承于CustomDBGrid组件,但是DBGridEh和DBGrid它们之间有许多相同之处.因此可以相互转换。
具体步骤如下:
在DelphiIDE下打开TDBGrid组件;
通过组合键Alt-F12将form以文本方式显示;
将所有TDBGrid对象名改变为TDBGridEh对象名,如:
DBGridl:
TDBGrid改为DBGrid1:
TDBGridEh;
再次通过组合键Alt-F12将文本方式恢复为form显示;
将form各相关事件中定义的所有TDBGrid改为TDBGrideh如DBGrid1:
TDBGrid改为DBGrid1:
TDBGridEh;
重新编译应用程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 表格 控件 DBGridEh 应用 实例