紫薰衣草 發表於 2022-1-27 23:38:00

Delphi dbgrid 导出 excel 方法

<p>delphi dbgrid 导出Excel表 &nbsp;<br><br>///////// &nbsp;利用剪贴板,速度很快!适合装有Excel的机器///////////////////// &nbsp;<br>&nbsp;<br>&nbsp;&nbsp;USES &nbsp;Clipbrd,ComObj; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;procedure &nbsp;TForm1.Button1Click(Sender: &nbsp;TObject); &nbsp;<br>&nbsp;&nbsp;var &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:string; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i:Integer; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excelapp,sheet:Variant; &nbsp;<br>&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;lbl2.Caption:=DateTimeToStr(Now); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=''; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.DisableControls; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for &nbsp;i:=0 &nbsp;to &nbsp;dbgrd1.DataSource.DataSet.FieldCount-1 &nbsp;do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+#13; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.First; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while &nbsp;not(dbgrd1.DataSource.DataSet.eof) &nbsp;do &nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for &nbsp;i:=0 &nbsp;&nbsp;&nbsp;to &nbsp;dbgrd1.DataSource.DataSet.FieldCount-1 &nbsp;do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+#13; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.next; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbl1.Caption:=IntToStr(dbgrd1.DataSource.DataSet.RecNo); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.ProcessMessages; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;//end &nbsp;while &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.EnableControls; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clipboard.Clear; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clipboard.Open; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clipboard.AsText:=str; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clipboard.Close; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excelapp:=createoleobject('excel.application'); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excelapp.workbooks.add(1); &nbsp;// &nbsp;excelapp.workbooks.add(-4167); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sheet:=excelapp.workbooks.worksheets; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sheet.name:='sheet1'; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sheet.paste; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clipboard.Clear; &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;sheet.columns.font.Name:='宋体'; &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;sheet.columns.font.size:=9; &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;sheet.Columns.AutoFit; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;excelapp.visible:=true; &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;lbl3.Caption:=DateTimeToStr(Now); &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;end; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;/////////////////////////////////////////////<br><br><br><br>////////////利用TStringList,速度很快!适合没有装Excel的机器//////////////////////// &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;procedure &nbsp;TForm1.Button1Click(Sender: &nbsp;TObject); &nbsp;<br>&nbsp;&nbsp;var &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:TStringList; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:string; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i:Integer;&nbsp;&nbsp;<br>&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;lbl1.Caption:=DateTimeToStr(Now); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=''; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.DisableControls; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for &nbsp;i:=0 &nbsp;to &nbsp;dbgrd1.DataSource.DataSet.FieldCount-1 &nbsp;do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+#13; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.First; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while &nbsp;not(dbgrd1.DataSource.DataSet.eof) &nbsp;do &nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for &nbsp;i:=0 &nbsp;&nbsp;&nbsp;to &nbsp;dbgrd1.DataSource.DataSet.FieldCount-1 &nbsp;do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str:=str+#13; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.next; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbl3.Caption:=IntToStr(dbgrd1.DataSource.DataSet.RecNo); &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.ProcessMessages; &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;//end &nbsp;while &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbgrd1.DataSource.DataSet.EnableControls; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:=TStringList.Create; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.Add(str); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.SaveToFile('c:\temp.xls');//保存到c:\temp.xls &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.Free; &nbsp;<br>&nbsp;&nbsp;// &nbsp;&nbsp;&nbsp;&nbsp;lbl2.Caption:=DateTimeToStr(Now); &nbsp;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;end; &nbsp;<br>&nbsp;////////////////////////////////////////////////<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>&nbsp;&nbsp;xlApp,xlBook,xlSheet,xlQuery: Variant;<br>&nbsp;&nbsp;adoConnection,adoRecordset: Variant;<br>begin<br>&nbsp;&nbsp;adoConnection := CreateOleObject('ADODB.Connection');<br>&nbsp;&nbsp;adoRecordset := CreateOleObject('ADODB.Recordset');<br>&nbsp;adoConnection.Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Tree.mdb;Persist Security Info=False');<br>&nbsp;&nbsp;adoRecordset.CursorLocation := adUseClient;<br>&nbsp;&nbsp;adoRecordset.Open('SELECT * FROM tree',adoConnection,1,3);<br><br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;xlApp := CreateOleObject('Excel.Application');<br>&nbsp;&nbsp;&nbsp;&nbsp;xlBook := xlApp.Workbooks.Add;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlSheet := xlBook.Worksheets['sheet1'];<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;//设置这一列为 文本列 ,让 "00123" 正确显示,而不是自动转换为"123"<br>&nbsp;&nbsp;&nbsp;xlSheet.Columns['C:C'].NumberFormatLocal := '@';<br><br>&nbsp;&nbsp;&nbsp;&nbsp;xlApp.Visible := True;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//把查询结果导入EXCEL数据<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery := xlSheet.QueryTables.Add(adoRecordset,xlSheet.Range['A1']); &nbsp;//关键是这一句<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.FieldNames := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.RowNumbers := False;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.FillAdjacentFormulas := False;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.PreserveFormatting := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.RefreshOnFileOpen := False;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.BackgroundQuery := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;//xlQuery.RefreshStyle := xlInsertDeleteCells;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.SavePassword := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.SaveData := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.AdjustColumnWidth := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.RefreshPeriod := 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.PreserveColumnInfo := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.FieldNames := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;xlQuery.Refresh;<br><br>&nbsp;&nbsp;&nbsp;xlBook.SaveAs('d:\fromD.xls',xlNormal,'','',False,False);<br><br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;if not VarIsEmpty(XLApp) then begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XLApp.displayAlerts:=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XLApp.ScreenUpdating:=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XLApp.quit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br><br><br><br><br><br>///////////////////////////////////////////////////<br>procedure saveToExcel();<br>var<br>&nbsp;&nbsp;&nbsp;Eclapp,workbook:variant;<br>&nbsp;&nbsp;&nbsp;i,n:integer;<br>begin<br>&nbsp;&nbsp;&nbsp;if not adoquery1.Active then exit;<br>&nbsp;&nbsp;&nbsp;if adoquery1.RecordCount&lt;=0 then exit;<br><br>&nbsp;&nbsp;&nbsp;if application.MessageBox('确认导出excel表吗?','提示',mb_okcancel+mb_iconinformation)=idcancel then exit;<br>&nbsp;&nbsp;&nbsp;Eclapp := createoleobject('Excel.Application');<br>&nbsp;&nbsp;&nbsp;Eclapp.workbooks.add;<br>&nbsp;&nbsp;&nbsp;for i:=0 to dbgrid2.FieldCount-1 do<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Eclapp.cells:=dbgrid2.Columns.Title.Caption;<br>&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;Eclapp.cells:='签字';<br><br>&nbsp;&nbsp;&nbsp;adoquery1.First;<br>&nbsp;&nbsp;&nbsp;n:=2;<br>&nbsp;&nbsp;&nbsp;while not adoquery1.Eof do<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;eclapp.cells := adoquery1.Fields.AsString;<br>&nbsp;&nbsp;&nbsp;&nbsp;eclapp.cells := adoquery1.Fields.AsString;<br>&nbsp;&nbsp;&nbsp;&nbsp;eclapp.cells := adoquery1.Fields.AsString;<br>&nbsp;&nbsp;&nbsp;&nbsp;eclapp.cells := adoquery1.Fields.AsString;<br>&nbsp;&nbsp;&nbsp;&nbsp;eclapp.cells :=' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';<br>&nbsp;&nbsp;&nbsp;&nbsp;inc(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;adoquery1.Next;<br>&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;eclapp.cells := '满足条件记录的总数为:'+inttostr(adoquery1.RecordCount)+'条';<br>&nbsp;&nbsp;application.MessageBox('数据导出完成!','提示',mb_ok+mb_iconinformation);<br>&nbsp;&nbsp;&nbsp;eclapp.visible := true;<br><br>end;</p>
<p>&nbsp;</p>
<p>&nbsp;<br>方法二<br>procedure CopyDbDataToExcel(Args: array of const); &nbsp;<br>var &nbsp;<br>&nbsp;&nbsp;iCount, jCount: Integer; &nbsp;<br>&nbsp;&nbsp;XLApp: Variant; &nbsp;<br>&nbsp;&nbsp;Sheet,range: Variant; &nbsp;<br>&nbsp;&nbsp;I: Integer; &nbsp;<br>begin &nbsp;<br>&nbsp;&nbsp;Screen.Cursor := crHourGlass;&nbsp;&nbsp;<br>&nbsp;&nbsp;if not VarIsEmpty(XLApp) then &nbsp;<br>&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;XLApp.DisplayAlerts := False; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;XLApp.Quit; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;VarClear(XLApp); &nbsp;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;try &nbsp;<br>&nbsp;&nbsp;&nbsp;XLApp:=CreateOleObject(Excel.Application); &nbsp;<br>&nbsp;&nbsp;except &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Screen.Cursor := crDefault; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit; &nbsp;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;XLApp.WorkBooks.Add; &nbsp;<br>&nbsp;&nbsp;XLApp.SheetsInNewWorkbook := High(Args) + 1;<br><br>&nbsp;&nbsp;for I := Low(Args) to High(Args) do &nbsp;<br>&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;XLApp.WorkBooks.WorkSheets.Name := TDBGrid(Args.VObject).Name; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Sheet := XLApp.Workbooks.WorkSheets.VObject).Name];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if not TDBGrid(Args.VObject).DataSource.DataSet.Active then &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Screen.Cursor := crDefault; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;end; &nbsp;<br>&nbsp;&nbsp;&nbsp;TDBGrid(Args.VObject).DataSource.DataSet.first; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do &nbsp;<br>&nbsp;&nbsp;&nbsp;range:=sheet.range,sheet.cells]; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;range.select; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;range.merge; &nbsp;<br>&nbsp;&nbsp;&nbsp;sheet.cells:=[+fqueryhuman.dbedit2.text+]+个人报销记录(普通报销、特殊报销)查询; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;jCount :=2; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Sheet.Cells:=TDBGrid(Args.VObject).Columns.Items.Title.Caption; &nbsp;<br>&nbsp;&nbsp;while not TDBGrid(Args.VObject).DataSource.DataSet.Eof do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;begin &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for iCount := 0 to TDBGrid(Args.VObject).Columns.Count - 1 do &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet.Cells := &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDBGrid(Args.VObject).Columns.Items.Field.AsString;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(jCount); &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDBGrid(Args.VObject).DataSource.DataSet.Next; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;end; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;XlApp.Visible := True; &nbsp;<br>&nbsp;&nbsp;end; &nbsp;<br>&nbsp;&nbsp;Screen.Cursor := crDefault; &nbsp;<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, &nbsp;&nbsp;&nbsp;--要导出的表名<br>@path nvarchar(1000), &nbsp;&nbsp;--文件存放目录<br>@fname nvarchar(250)='' &nbsp;&nbsp;--文件名,默认为表名<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)&lt;&gt;'\' 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+';CREATE_DB="'+@sql+'";DBQ='+@sql<br>else<br>set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'<br>&nbsp;&nbsp;&nbsp;&nbsp;+';DATABASE='+@sql+'"'<br><br><br>--连接数据库<br>exec @err=sp_oacreate 'adodb.connection',@obj out<br>if @err&lt;&gt;0 goto lberr<br><br>exec @err=sp_oamethod @obj,'open',null,@constr<br>if @err&lt;&gt;0 goto lberr<br><br><br><br>--创建表的SQL<br>select @sql='',@fdlist=''<br>select @fdlist=@fdlist+',['+a.name+']'<br>,@sql=@sql+',['+a.name+'] '<br>&nbsp;&nbsp;&nbsp;+case<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%char'<br>&nbsp;&nbsp;&nbsp;&nbsp;then case when a.length&gt;255 then 'memo'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else 'text('+cast(a.length as varchar)+')' end<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%int' or b.name='bit' then 'int'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '�tetime' then 'datetime'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%money' then 'money'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%text' then 'memo'<br>&nbsp;&nbsp;&nbsp;&nbsp;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&lt;&gt;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>&nbsp;&nbsp;&nbsp;;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>&nbsp;&nbsp;&nbsp;,@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), &nbsp;&nbsp;--查询语句,如果查询语句中使用了order by ,请加上top 100 percent<br>@path nvarchar(1000), &nbsp;&nbsp;--文件存放目录<br>@fname nvarchar(250), &nbsp;&nbsp;--文件名<br>@sheetname varchar(250)='' &nbsp;--要创建的工作表名,默认为文件名<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)&lt;&gt;'\' 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+';CREATE_DB="'+@sql+'";DBQ='+@sql<br>else<br>set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'<br>&nbsp;&nbsp;&nbsp;&nbsp;+';DATABASE='+@sql+'"'<br><br>--连接数据库<br>exec @err=sp_oacreate 'adodb.connection',@obj out<br>if @err&lt;&gt;0 goto lberr<br><br>exec @err=sp_oamethod @obj,'open',null,@constr<br>if @err&lt;&gt;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>&nbsp;&nbsp;&nbsp;+case<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%char'<br>&nbsp;&nbsp;&nbsp;&nbsp;then case when a.length&gt;255 then 'memo'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else 'text('+cast(a.length as varchar)+')' end<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%int' or b.name='bit' then 'int'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '�tetime' then 'datetime'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%money' then 'money'<br>&nbsp;&nbsp;&nbsp;&nbsp;when b.name like '%text' then 'memo'<br>&nbsp;&nbsp;&nbsp;&nbsp;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&lt;&gt;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>&nbsp;&nbsp;&nbsp;;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>&nbsp;&nbsp;&nbsp;,@src as 错误源,@desc as 错误描述<br>select @sql,@constr,@fdlist<br>go</p><br><br>
来源:https://www.cnblogs.com/lenovo512023499/p/15851636.html
頁: [1]
查看完整版本: Delphi dbgrid 导出 excel 方法