关于导出到Excel及对Excel设置问题?

yifeiming 2005-09-01 10:39:29
用ADOQuery连接SQL Server得到的数据导出到Excel表中,用的是一行一行的导出,但是数据量很大,效率低CPU使用率很高。想请教怎样一次性的导出?是不是可以先复制到粘贴板,再粘贴到Excel表。
另外还有一个问题,Delphi怎样设置Excel整列都居中或左对齐?
...全文
198 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
亮剑_ 2005-09-02
  • 打赏
  • 举报
回复
可能考虑先用上面我提的利用Excel内置的数据集功能导出数据(试了一下,导出2000多条记录,有三个字段,导出共用了1.5秒左右),然后再用OLE连上导出的文件设置格式
yifeiming 2005-09-02
  • 打赏
  • 举报
回复
还有没有人帮忙回答一下第一个问题啊?
不要一条一条的来导出,效率太低了,有没有别的方法?
楼上各位朋友回答的还是不太理解,
今天下班前就结帖。
yeweimian1 2005-09-02
  • 打赏
  • 举报
回复
/******* 导出到excel
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

/*********** 导入Excel
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
luvera 2005-09-01
  • 打赏
  • 举报
回复
用这个最快-----uTDS2Excel.pas

调用如下:
ADOQuery3.Close;
ADOQuery3.Open;
if ADOQuery3.RecordCount > 0 then
begin
with TDS2Excel.Create(TDataSet(ADOQuery3)) do
try
Save2File('c:\产品.xls', True);
finally
Free;
end;
ShowMessage('产品已经导出到C盘');
end;
end;
psp2003 2005-09-01
  • 打赏
  • 举报
回复
顶一把
befree 2005-09-01
  • 打赏
  • 举报
回复
当一个JET表,一个SQL就可以导一个表了
yeweimian1 2005-09-01
  • 打赏
  • 举报
回复
请问如何建立宏并且看代码啊????3、4楼的兄弟。
yeweimian1 2005-09-01
  • 打赏
  • 举报
回复
[Fatal Error] DBGridEhToExcel.pas(6): File not found: 'DBGridEh.dcu'

这个是第3方控件单元么????
human_2 2005-09-01
  • 打赏
  • 举报
回复
copyfromrecordset
range('a').align=.....
我一般都是在EXCEL里面建立宏,然后在看宏代码
human_2 2005-09-01
  • 打赏
  • 举报
回复
xls.range('a').copyrecord rs
大概这个写法,copyrecordset
Dreamnest 2005-09-01
  • 打赏
  • 举报
回复

http://blog.csdn.net/Dreamnest/archive/2005/08/24/463490.aspx
yeweimian1 2005-09-01
  • 打赏
  • 举报
回复
上午我也想尝试使用”剪贴板来完成“,但是导出来的中文字却变成乱码了,我晕!

uses Clipbrd;

function TForm1.ToExcel: boolean;
var
y:integer;
tslist:TstringList;
s:string;
aSheet:variant;
begin
result:=true;

ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
aSheet:=ExcelApplication1.Worksheets.Item[1];

tslist:=TStringlist.Create;

with adoquery1 do
begin
open;
first;
while not Eof do
begin
s:='';
for y:=0 to fieldcount-1 do
begin
s:=s+fields[y].AsString+char(9);
application.ProcessMessages;
end;
tslist.Add(s);
next;
end;
close;
end;

Clipboard.AsText:=tslist.Text;

tslist.Free;

ExcelApplication1.Disconnect;
aSheet.paste;
result:=true;

end;

为了实验就没用try finally结构呵呵。
导出来数据结果是:
==========================================================
30308 ???è ·?????ê??± 30308 public
31389 ?£á? ·?????ê??± 31389 public
31677 ??áá ·???1¤3ìê| 31677 public
31834 ?×ì??? ·????÷1ü 31834 master
31835 ?×?·oì 2ù×÷1¤ 31835 public
31908 ??è? 2ù×÷1¤ 31908 public
31914 ?ì′oà× ·???1¤3ìê| 31914 public
31948 óà??D? ·???1¤3ìê| 31948 public
31955 ?a?÷ó¢ 2ù×÷1¤ 31955 public
32016 í????? áì°à 32016 public
32080 3??? ??DT?÷1ü 32080 master
32103 ·??2?? ·?????ê??± 32103 public
======================================================================
SQL数据库中正常的数据是:
30308 倪娜 分析技术员 30308 public NULL
31389 郑峥 分析技术员 31389 public NULL
31677 付亮 分析工程师 31677 public NULL
31834 孔条香 分析主管 31834 master NULL
31835 孔梅红 操作工 31835 public NULL
31908 孙蓉 操作工 31908 public NULL
31914 朱春雷 分析工程师 31914 public NULL
31948 余乾新 分析工程师 31948 public NULL
31955 吴明英 操作工 31955 public NULL
32016 汪文女 领班 32016 public NULL
32080 陈强 维修主管 32080 master NULL


不知道如何处理?请高手指教啊!
yifeiming 2005-09-01
  • 打赏
  • 举报
回复
谢谢各位了!
但是能不能COPY到粘贴板呢?
用SQL查询分析器查询的时候,我们可以直接对查询结果进行复制的。
那是不是也可以直接从DBGrid复制,怎么用程序实现?

还有第二个问题怎么都没人帮忙解答?
亮剑_ 2005-09-01
  • 打赏
  • 举报
回复
如果要带格式,用OLE来导出的话速度不可能很快的。不要格式则可以利用Excel内置的数据集功能快一些,关键代码:
var
Sheet, xlQuery: OleVariant;
begin
...
xlQuery := Sheet.QueryTables.Add(ADOQuery1.Recordset, Sheet.Range['A3']);
//xlQuery.FieldNames := false;
xlQuery.Refresh;
...
end;

当然速度最快的应该是直接写文件,只是MS没有公开Excel文件格式,估计也不会公开的:)
yeweimian1 2005-09-01
  • 打赏
  • 举报
回复
用这个最快-----uTDS2Excel.pas

这个是安装什么第3方控件才有的啊????请问。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧