怎么把DATASET里的数据导出为Excel,(不用OLE,因为目标机器可能没Excel,不要控件,控件太烦,要Excel 2000的格式)(谁要是教我读懂DB

  • 主题发起人 主题发起人 易名烦
  • 开始时间 开始时间
将其输出为Text文件或csv文件,用excell打开时选择相应的类型即可
最好为text文件类型,否则数据库中若有身份证号或其它数值较大的字段,
则显示不正常。
procedure TForm1.Button2Click(Sender: TObject);
var f:textfile;
fs,str:string;
i,j:integer;
begin
table1.DisableControls;
if not table1.IsEmpty then
begin
if savedialog1.execute then
begin
fs:=savedialog1.filename;
assignfile(f,fs);
rewrite(f);
for i:=0 to table1.FieldCount-1 do
begin
if table1.Fields.Fields.Visible then
begin
str:='"'+table1.Fields.Displaylabel+'"';
write(f,str);
write(f,',');
end;
end;
writeln(f,'');
table1.first;
for i:=0 to table1.RecordCount-1 do
begin
for j:=0 to table1.FieldCount-1 do
begin
if table1.Fields.Fields[j].Visible then
begin
str:='"'+table1.Fields[j].Displaytext+'"';
write(f,str);
write(f,',');
end;
end;
writeln(f,'');
table1.next;
end;
closefile(f);
end;
end
else
begin
showmessage('数据库中无记录');
end;
showmessage('数据完成转换');
table1.First;
table1.EnableControls;
end;
 
老哥,这个导出后全在第一列,没实际作用!
 
唉,谁要是能把DBGridEH里的导出教给我就好了,我分全给他!
 
你看它的源代码不就可以了吗?
 
(*----------------------------------------------------------------------*)
(* 将数据库中的数据导出到EXcel中,参数:要转换的数据集,字段的Tag值如果大 *)
(*于这个值,就不导出到Excel,是否让做转换工作的Excel可见,Excel文件名,*.xls *)
(* 引用单元:uses Dialogs,Db,ComObj, StdCtrls, ADODB, Grids, DBGrids; *)
(*-----------------------------------------------------------------------*)
Function DataSetToExcel(DataSet:TAdotable;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
var
ExcelObj, Excel, WorkBook, Sheet: OleVariant;
OldCursor:TCursor;
SaveDialog:TSaveDialog;
begin
Result := False;
if not Dataset.Active then exit;
OldCursor:=Screen.Cursor;
Screen.Cursor:=crHourGlass;
try
ExcelObj := CreateOleObject('Excel.Sheet');
Excel := ExcelObj.Application;
Excel.Visible := Visible ;
WorkBook := Excel.Workbooks.Add ;
Sheet:= WorkBook.Sheets[1];
except
MessageBox(GetActiveWindow,'无法调用Mircorsoft Excel! '+chr(13)+chr(10)+
'请检查是否安装了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
Screen.Cursor:=OldCursor;
Exit;
end;
Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
if Result then
if Not Visible then
begin
if ExcelFileName<>''then
WorkBook.SaveAs(FileName:=ExcelFileName)
else
begin
SaveDialog:=TSaveDialog.Create(Nil);
SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
Result:=SaveDialog.Execute;
UpdateWindow(GetActiveWindow);
if Result then
WorkBook.SaveAs(FileName:=SaveDialog.FileName);
SaveDialog.Free;
end;
Excel.Quit;
end;
Screen.Cursor:=OldCursor;
end;

Function DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
var
Row,Col,FieldIndex :Integer;
BK:TBookMark;
begin
Result := False;
if not Dataset.Active then exit;
BK:=DataSet.GetBookMark;
DataSet.DisableControls;
Sheet.Activate;
try
// 列标题
Row:=1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col) :=DataSet.Fields[FieldIndex].DisplayLabel;
Inc(Col);
end;
end;
// 表内容
DataSet.First;
while Not DataSet.Eof do
begin
Row:=Row+1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;
Inc(Col);
end;
end;
DataSet.Next;
end;
Result := True;
finally
DataSet.GotoBookMark(BK);
DataSet.EnableControls;
end;
end;


 
既然和我一样嫌写程序麻烦,那就用EMS QuickExport控件组好啦^_^
 
求你们了,审审题,哪位高人给答答吧!
 
易名烦 你这个家伙嘴很臭!
 
我嘴臭,我承认,你要有水平给俺答出来吧,谢你了!
 
不用其它控件,delphi中本身就有现成的控件,f1book,即使系统
没有excel,也可以导出、导入。只不过要先把数据导入到f1book,
再用f1book1.write()函数输出即可。速度还可以。
 
我现在要下班啦,明天再告诉你怎么转换,很简单的!
 
to alicewen:
听说F1BOOK是老版本的,所以不行啊。
to fwcy:
老哥,简单那就快快帮我搞定吧,谢谢你了,拜托了 。
 
小问题,送分吧!
SaveDBGridEhToExportFile(TDBGridEhExportAsXLS,DBGridEh1,'d:/file1.xls',True);
注意要引用单元DBGridEhImpExp
 
>to 易名烦
writeln(f,'');----你看不见这一行吗?这一行的作用就是换行,数据这样就不会在
一行里了。我平时就是用这个程序进行转换的,你不要试都不试就下定论。
???????????
啊好心没好报!!!!!!!!!!!!!!1
 
TO codesmall:
你说的是用DBGRIDEH吧,对不起,我说了不用第三方控件!
TO lyq2276959:
虽然我没看见,但是你的做法给把文本文件的.txt改成.xls不一样吗?对不起,我要的
是真正的Excel文件,而不是让Excel去自行转换!
 
何必自己研究,将DBGridEhImpExp单元稍微改造一下,就可以直接导出TDATASET到EXCEL
 
to codesmall:
对啊,我就是这意思,但我水平有限,看不懂,所以想找个老师;
to lyq2276959:
谢谢,我不是这意思,客户要求高,没办法,人家也不是一点都不懂,不能这样的!
 
DBGridEH里的SaveDBGridEhToExportFile已经是比较简单的了,很容易看得懂。
相比之下ExpressQuantumGrid中的就复杂一些了。不过这两个控件中的代码生
成的都不是Excel 2000的格式。Excel 2000的格式似乎还要复杂一些。你的分
看来也太难要了。
 
不是这样的,我是分给的少,主要是我有很多问题要问,所以只有这样了,你看看,我平均
每次一点五个问题,你说我的分怎么够,而且我能挣的分很少,所以问个问题当然要弄懂啊。
不能不懂装懂!
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部