Delphi dbgrid 导出 excel 方法
<p>delphi dbgrid 导出Excel表 <br><br>///////// 利用剪贴板,速度很快!适合装有Excel的机器///////////////////// <br> <br> USES Clipbrd,ComObj; <br> <br> procedure TForm1.Button1Click(Sender: TObject); <br> var <br> str:string; <br> i:Integer; <br> excelapp,sheet:Variant; <br> begin <br> // lbl2.Caption:=DateTimeToStr(Now); <br> str:=''; <br> dbgrd1.DataSource.DataSet.DisableControls; <br> for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do <br> str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); <br> str:=str+#13; <br> dbgrd1.DataSource.DataSet.First; <br> while not(dbgrd1.DataSource.DataSet.eof) do begin <br> for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do <br> str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); <br> str:=str+#13; <br> dbgrd1.DataSource.DataSet.next; <br> <br> lbl1.Caption:=IntToStr(dbgrd1.DataSource.DataSet.RecNo); <br> Application.ProcessMessages; <br> <br> end;//end while <br> <br> dbgrd1.DataSource.DataSet.EnableControls; <br> <br> clipboard.Clear; <br> Clipboard.Open; <br> Clipboard.AsText:=str; <br> Clipboard.Close; <br> excelapp:=createoleobject('excel.application'); <br> excelapp.workbooks.add(1); // excelapp.workbooks.add(-4167); <br> sheet:=excelapp.workbooks.worksheets; <br> sheet.name:='sheet1'; <br> sheet.paste; <br> Clipboard.Clear; <br> // sheet.columns.font.Name:='宋体'; <br> // sheet.columns.font.size:=9; <br> // sheet.Columns.AutoFit; <br> excelapp.visible:=true; <br> // lbl3.Caption:=DateTimeToStr(Now); <br> <br> end; <br> <br> /////////////////////////////////////////////<br><br><br><br>////////////利用TStringList,速度很快!适合没有装Excel的机器//////////////////////// <br> <br> procedure TForm1.Button1Click(Sender: TObject); <br> var <br> s:TStringList; <br> str:string; <br> i:Integer; <br> begin <br> // lbl1.Caption:=DateTimeToStr(Now); <br> str:=''; <br> dbgrd1.DataSource.DataSet.DisableControls; <br> for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do <br> str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); <br> str:=str+#13; <br> dbgrd1.DataSource.DataSet.First; <br> while not(dbgrd1.DataSource.DataSet.eof) do begin <br> for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do <br> str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); <br> <br> str:=str+#13; <br> dbgrd1.DataSource.DataSet.next; <br> <br> // lbl3.Caption:=IntToStr(dbgrd1.DataSource.DataSet.RecNo); <br> // Application.ProcessMessages; <br> <br> end;//end while <br> <br> dbgrd1.DataSource.DataSet.EnableControls; <br> s:=TStringList.Create; <br> s.Add(str); <br> s.SaveToFile('c:\temp.xls');//保存到c:\temp.xls <br> s.Free; <br> // lbl2.Caption:=DateTimeToStr(Now); <br> <br> end; <br> ////////////////////////////////////////////////<br>***********************************************************<br>(Delphi)Excel的快速导入<br>***********************************************************<br><br>(Delphi)Excel的快速导入<br>//怎样可以提高EXCEL的导出速度?<br><br>uses ADODB,excel97,adoint;<br><br>function TForm1.ExportToExcel: Boolean;<br>var<br> xlApp,xlBook,xlSheet,xlQuery: Variant;<br> adoConnection,adoRecordset: Variant;<br>begin<br> adoConnection := CreateOleObject('ADODB.Connection');<br> adoRecordset := CreateOleObject('ADODB.Recordset');<br> adoConnection.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Tree.mdb;Persist Security Info=False');<br> adoRecordset.CursorLocation := adUseClient;<br> adoRecordset.Open('SELECT * FROM tree',adoConnection,1,3);<br><br> try<br> xlApp := CreateOleObject('Excel.Application');<br> xlBook := xlApp.Workbooks.Add;<br> xlSheet := xlBook.Worksheets['sheet1'];<br> <br> //设置这一列为 文本列 ,让 "00123" 正确显示,而不是自动转换为"123"<br> xlSheet.Columns['C:C'].NumberFormatLocal := '@';<br><br> xlApp.Visible := True;<br><br> //把查询结果导入EXCEL数据<br> xlQuery := xlSheet.QueryTables.Add(adoRecordset,xlSheet.Range['A1']); //关键是这一句<br> xlQuery.FieldNames := True;<br> xlQuery.RowNumbers := False;<br> xlQuery.FillAdjacentFormulas := False;<br> xlQuery.PreserveFormatting := True;<br> xlQuery.RefreshOnFileOpen := False;<br> xlQuery.BackgroundQuery := True;<br> //xlQuery.RefreshStyle := xlInsertDeleteCells;<br> xlQuery.SavePassword := True;<br> xlQuery.SaveData := True;<br> xlQuery.AdjustColumnWidth := True;<br> xlQuery.RefreshPeriod := 0;<br> xlQuery.PreserveColumnInfo := True;<br> xlQuery.FieldNames := True;<br> xlQuery.Refresh;<br><br> xlBook.SaveAs('d:\fromD.xls',xlNormal,'','',False,False);<br><br> finally<br> if not VarIsEmpty(XLApp) then begin<br> XLApp.displayAlerts:=false;<br> XLApp.ScreenUpdating:=true;<br> XLApp.quit;<br> end;<br> end;<br>end;<br><br><br><br><br><br><br>///////////////////////////////////////////////////<br>procedure saveToExcel();<br>var<br> Eclapp,workbook:variant;<br> i,n:integer;<br>begin<br> if not adoquery1.Active then exit;<br> if adoquery1.RecordCount<=0 then exit;<br><br> if application.MessageBox('确认导出excel表吗?','提示',mb_okcancel+mb_iconinformation)=idcancel then exit;<br> Eclapp := createoleobject('Excel.Application');<br> Eclapp.workbooks.add;<br> for i:=0 to dbgrid2.FieldCount-1 do<br> begin<br> Eclapp.cells:=dbgrid2.Columns.Title.Caption;<br> end;<br> Eclapp.cells:='签字';<br><br> adoquery1.First;<br> n:=2;<br> while not adoquery1.Eof do<br> begin<br> eclapp.cells := adoquery1.Fields.AsString;<br> eclapp.cells := adoquery1.Fields.AsString;<br> eclapp.cells := adoquery1.Fields.AsString;<br> eclapp.cells := adoquery1.Fields.AsString;<br> eclapp.cells :=' ';<br> inc(n);<br> adoquery1.Next;<br> end;<br><br> eclapp.cells := '满足条件记录的总数为:'+inttostr(adoquery1.RecordCount)+'条';<br> application.MessageBox('数据导出完成!','提示',mb_ok+mb_iconinformation);<br> eclapp.visible := true;<br><br>end;</p><p> </p>
<p> <br>方法二<br>procedure CopyDbDataToExcel(Args: array of const); <br>var <br> iCount, jCount: Integer; <br> XLApp: Variant; <br> Sheet,range: Variant; <br> I: Integer; <br>begin <br> Screen.Cursor := crHourGlass; <br> if not VarIsEmpty(XLApp) then <br> begin <br> XLApp.DisplayAlerts := False; <br> XLApp.Quit; <br> VarClear(XLApp); <br> end;<br><br> try <br> XLApp:=CreateOleObject(Excel.Application); <br> except <br> Screen.Cursor := crDefault; <br> Exit; <br> end;<br><br> XLApp.WorkBooks.Add; <br> XLApp.SheetsInNewWorkbook := High(Args) + 1;<br><br> for I := Low(Args) to High(Args) do <br> begin <br> XLApp.WorkBooks.WorkSheets.Name := TDBGrid(Args.VObject).Name; <br> Sheet := XLApp.Workbooks.WorkSheets.VObject).Name];<br><br> if not TDBGrid(Args.VObject).DataSource.DataSet.Active then <br> begin <br> Screen.Cursor := crDefault; <br> Exit; <br> end; <br> TDBGrid(Args.VObject).DataSource.DataSet.first; <br> for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do <br> range:=sheet.range,sheet.cells]; <br> range.select; <br> range.merge; <br> sheet.cells:=[+fqueryhuman.dbedit2.text+]+个人报销记录(普通报销、特殊报销)查询; <br> jCount :=2; <br> for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do <br> Sheet.Cells:=TDBGrid(Args.VObject).Columns.Items.Title.Caption; <br> while not TDBGrid(Args.VObject).DataSource.DataSet.Eof do <br> begin <br> for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do <br> Sheet.Cells := <br> TDBGrid(Args.VObject).Columns.Items.Field.AsString;<br><br> Inc(jCount); <br> TDBGrid(Args.VObject).DataSource.DataSet.Next; <br> end; <br> XlApp.Visible := True; <br> end; <br> Screen.Cursor := crDefault; <br>end;<br><br><br>方法三<br><br><br>delphi导入/导出excel<br>2008年03月02日 星期日 16:39<br>从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:<br><br>--如果接受数据导入的表已经存在<br>insert into 表 select * from<br>OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br>,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)<br>--如果导入数据并生成表<br>select * into 表 from<br>OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br>,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)<br><br><br><br>--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:<br>insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br>,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)<br>select * from 表<br><br><br>--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:<br>--导出表的情况<br>EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'<br><br>--导出查询的情况<br>EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:\test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'<br><br><br><br><br>--下面是导出真正Excel文件的方法:<br><br>if exists (select * from dbo.sysobjects where id = object_id(N'.') and OBJECTPROPERTY(id, N'IsProcedure') = 1)<br>drop procedure .<br>GO<br><br><br><br><br>create proc p_exporttb<br>@tbname sysname, --要导出的表名<br>@path nvarchar(1000), --文件存放目录<br>@fname nvarchar(250)='' --文件名,默认为表名<br>as<br>declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int<br>declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)<br><br>--参数检测<br>if isnull(@fname,'')='' set @fname=@tbname+'.xls'<br><br>--检查文件是否已经存在<br>if right(@path,1)<>'\' set @path=@path+'\'<br>create table #tb(a bit,b bit,c bit)<br>set @sql=@path+@fname<br>insert into #tb exec master..xp_fileexist @sql<br><br>--数据库创建语句<br>set @sql=@path+@fname<br>if exists(select 1 from #tb where a=1)<br>set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'<br> +';CREATE_DB="'+@sql+'";DBQ='+@sql<br>else<br>set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'<br> +';DATABASE='+@sql+'"'<br><br><br>--连接数据库<br>exec @err=sp_oacreate 'adodb.connection',@obj out<br>if @err<>0 goto lberr<br><br>exec @err=sp_oamethod @obj,'open',null,@constr<br>if @err<>0 goto lberr<br><br><br><br>--创建表的SQL<br>select @sql='',@fdlist=''<br>select @fdlist=@fdlist+',['+a.name+']'<br>,@sql=@sql+',['+a.name+'] '<br> +case<br> when b.name like '%char'<br> then case when a.length>255 then 'memo'<br> else 'text('+cast(a.length as varchar)+')' end<br> when b.name like '%int' or b.name='bit' then 'int'<br> when b.name like '�tetime' then 'datetime'<br> when b.name like '%money' then 'money'<br> when b.name like '%text' then 'memo'<br> else b.name end<br>FROM syscolumns a left join systypes b on a.xtype=b.xusertype<br>where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')<br>and object_id(@tbname)=id<br>select @sql='create table ['+@tbname<br>+']('+substring(@sql,2,8000)+')'<br>,@fdlist=substring(@fdlist,2,8000)<br>exec @err=sp_oamethod @obj,'execute',@out out,@sql<br>if @err<>0 goto lberr<br><br>exec @err=sp_oadestroy @obj<br><br>--导入数据<br>set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;IMEX=1<br> ;DATABASE='+@path+@fname+''',['+@tbname+'$])'<br><br>exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)<br><br>return<br><br>lberr:<br>exec sp_oageterrorinfo 0,@src out,@desc out<br>lbexit:<br>select cast(@err as varbinary(4)) as 错误号<br> ,@src as 错误源,@desc as 错误描述<br>select @sql,@constr,@fdlist<br>go<br><br><br><br>if exists (select * from dbo.sysobjects where id = object_id(N'.') and OBJECTPROPERTY(id, N'IsProcedure') = 1)<br>drop procedure .<br>GO<br><br><br><br><br>create proc p_exporttb<br>@sqlstr varchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent<br>@path nvarchar(1000), --文件存放目录<br>@fname nvarchar(250), --文件名<br>@sheetname varchar(250)='' --要创建的工作表名,默认为文件名<br>as<br>declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int<br>declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)<br><br>--参数检测<br>if isnull(@fname,'')='' set @fname='temp.xls'<br>if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')<br><br>--检查文件是否已经存在<br>if right(@path,1)<>'\' set @path=@path+'\'<br>create table #tb(a bit,b bit,c bit)<br>set @sql=@path+@fname<br>insert into #tb exec master..xp_fileexist @sql<br><br>--数据库创建语句<br>set @sql=@path+@fname<br>if exists(select 1 from #tb where a=1)<br>set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'<br> +';CREATE_DB="'+@sql+'";DBQ='+@sql<br>else<br>set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'<br> +';DATABASE='+@sql+'"'<br><br>--连接数据库<br>exec @err=sp_oacreate 'adodb.connection',@obj out<br>if @err<>0 goto lberr<br><br>exec @err=sp_oamethod @obj,'open',null,@constr<br>if @err<>0 goto lberr<br><br>--创建表的SQL<br>declare @tbname sysname<br>set @tbname='##tmp_'+convert(varchar(38),newid())<br>set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'<br>exec(@sql)<br><br>select @sql='',@fdlist=''<br>select @fdlist=@fdlist+',['+a.name+']'<br>,@sql=@sql+',['+a.name+'] '<br> +case<br> when b.name like '%char'<br> then case when a.length>255 then 'memo'<br> else 'text('+cast(a.length as varchar)+')' end<br> when b.name like '%int' or b.name='bit' then 'int'<br> when b.name like '�tetime' then 'datetime'<br> when b.name like '%money' then 'money'<br> when b.name like '%text' then 'memo'<br> else b.name end<br>FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype<br>where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')<br>and a.id=(select id from tempdb..sysobjects where name=@tbname)<br><br>if @@rowcount=0 return<br><br>select @sql='create table ['+@sheetname<br>+']('+substring(@sql,2,8000)+')'<br>,@fdlist=substring(@fdlist,2,8000)<br><br>exec @err=sp_oamethod @obj,'execute',@out out,@sql<br>if @err<>0 goto lberr<br><br>exec @err=sp_oadestroy @obj<br><br>--导入数据<br>set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES<br> ;DATABASE='+@path+@fname+''',['+@sheetname+'$])'<br><br>exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')<br><br>set @sql='drop table ['+@tbname+']'<br>exec(@sql)<br>return<br><br>lberr:<br>exec sp_oageterrorinfo 0,@src out,@desc out<br>lbexit:<br>select cast(@err as varbinary(4)) as 错误号<br> ,@src as 错误源,@desc as 错误描述<br>select @sql,@constr,@fdlist<br>go</p><br><br>
来源:https://www.cnblogs.com/lenovo512023499/p/15851636.html
頁:
[1]