用DELPH执行查询的时候,返回一些数据,怎样将这些数据写入excel,送100分(100分)

  • 主题发起人 主题发起人 qing588
  • 开始时间 开始时间
Q

qing588

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥,小弟在用DELPH执行查询的时候,返回一些数据,怎样将这些数据写入excel
用的库是PARADOX,那位高手能发一完整的程式给我(包括库及其它所有文件)?
我的E—MAIL:zqingsong@cnuninet.com
我会送分的。
 
研究一下BatchMove,应该可以实现,否则就用一点一点的写入,应该是OLE吧。
 
Smexport Suite 3.90
 
query1为查询结果,filename为EXCEL中的模板文件,
将其按照模板格式导出到EXECL中并保存:

if dm1.Query1.RecordCount=0 then
messageDlg('当前表格中没有记录可供导出!',mtInformation,[mbOK],0)
else
begin
try
ExcelApp:=CreateOleObject('Excel.Application');
MyWorkBook1:=CreateOleobject('Excel.Sheet');
MyWorkBook:=CreateOleobject('Excel.Sheet');
except
on Exception do raise exception.Create('系统需要在EXCEL中输出数据,请确认您的机器是否已经安装EXCEL')
end;

filename:=modeldir+'/OUTPUT.XLS';

if NOT DirectoryExists(modeldir) then
begin
beep;
ExcelApp.Quit;
ExcelApp:=Unassigned;
raise exception.Create('不能连接服务器上指定模板目录'+modeldir+',请检查此刻网络连接是否正常!')
end
else
if not FileExists(filename) then
begin
beep;
ExcelApp.Quit;
ExcelApp:=Unassigned;
raise exception.Create('无法打开模板文件:'+modeldir+'/OUTPUT.XLS,请与系统维护人员联系!')
end
else
MyworkBook1:= ExcelApp.workBooks.Open(modeldir+'/OUTPUT.XLS');

//取模板格式
Myworkbook.worksheets[1].Rows[3].Value := Myworkbook1.worksheets[1].Rows[3].Value;
Myworkbook.worksheets[1].Rows[4].Value := Myworkbook1.worksheets[1].Rows[4].Value;
Myworkbook.worksheets[1].Rows[5].Value := Myworkbook1.worksheets[1].Rows[5].Value;
MyworkBook1.Close;

MyWorkBook.WorkSheets[1].Cells[3,3].font.size :=20;
MyWorkBook.WorkSheets[1].Cells[4,2].font.size :=11;
Myworkbook.worksheets[1].Rows[3].font.color :=clBlue;
Myworkbook.worksheets[1].Rows[4].font.color :=clBlue;
Myworkbook.worksheets[1].Rows[5].font.color :=clBlue;
Myworkbook.worksheets[1].Columns[1].ColumnWidth :=1;
Myworkbook.worksheets[1].Columns[2].ColumnWidth :=12;
Myworkbook.worksheets[1].Columns[3].ColumnWidth :=25;
Myworkbook.worksheets[1].Columns[4].ColumnWidth :=20;
Myworkbook.worksheets[1].Columns[5].ColumnWidth :=17;

//write to Excel:
dm1.query1.First;
i:=0;
while not dm1.query1.eof do
begin
MyWorkBook.WorkSheets[1].Cells[6+i,2].Value := dm1.Query1ORDNO.Value;
MyWorkBook.WorkSheets[1].Cells[6+i,3].Value := dm1.Query1TRANSCORP.Value+':';
MyWorkBook.WorkSheets[1].Cells[6+i,4].Value := dm1.Query1TRADEWAY.Value;
MyWorkBook.WorkSheets[1].Cells[6+i,5].Value := dm1.Query1CNO.Value;
Inc(i);
dm1.query1.next;
end; //end of while

//save output file
filename:=localdir+'/NewOuput.XLS';
SaveDialog1.InitialDir:=localdir;
SaveDialog1.FileName:=filename;
if SaveDialog1.Execute then
begin
filename:=SaveDialog1.FileName;
try
if FileExists(filename) then
DeleteFile(FileName);
MyWorkBook.saveas(filename);
MyWorkBook.close;
beep;beep;
showmessage('输出记录到 '+filename+' 执行完毕!');
except
MyWorkBook.close;
end;
end;
ExcelApp.Quit;
ExcelApp:=Unassigned;
end;
end;
 
to chinahawk:
我也同样的问题,我想问的是怎样通过StoredProc1控件来返回一批SQL数据,
并查询的到。
 
写入Word的要不要,我做了一个,自我感觉良好
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,row,column:integer;
begin
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel 没有安装',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Caption:='Excel Not Istalled!';
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
query1.Open;
row:=1;
column:=1;
for j:= 0 to Query1.FieldCount-1 do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query1.fields[j].FieldName;
column:=column+1;
end;
row:=2;
While Not(query1.Eof) do
begin
column:=1;
for i:=1 to query1.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:=query1.fields[i-1].AsString;
column:=column+1;
end;
query1.Next;
row:=row+1;
end;
query1.first;
ExcelWorkbook1.Disconnect;
ExcelWorksheet1.Disconnect;
ExcelApplication1.DisConnect;
end;
需要放几个控件的,这就不用我说了吧?
 
先写到GRID再写到EXCEL
有的GRID可以直接转成EXCEL
 
ole 方式太慢了,我一万多条记录,10分钟还没导完,这样的速度怎么接受
 
用ADO试试,根据文档表明它什么都能连上。
 
to pigdong:非常感谢你的代码,这个问题在国庆节前我就想解决了,可是6天过去了,没解决
今天,一下子,说不上来的高兴,祝你工作顺利!小鱼今天吃的饱饱!
 
其实excel文件可以当数据库用,知道了这一点,解决就简单了

1.先做一个excel文件,格式自定,第一行是放字段名,每一列都是一个field
存为 file1.xls
2. datasource1 用bde直接连paradox库, 查出数据,放在query1
3. odbc 连 excel 文件:在控制面板的odbc32, 选excel files, 文件名选file1.xls
datasource2 用odbc 连excel files, table 名输 $sheet1, 放在table2
4. 现在用batchmove 在query1 和 table2 间移数据, 没什么好说了吧?
设好对应的filed,让他exec一次就可以了

前提:装好excel, odbc数据源必须安装正常
 
stlont的方法可以。效率也不错。
如果还要求更好的效率。那你就得了解EXCEL的文件格式了,不过DBGRIDEH有这个功能,它就
是直接写文件的,非常快。
。OLE的方法肯定是比较慢的。我自己写了个数据集-》EXCEL的函数,写入1000条数据(有30个字段)
大概要30秒。
 
在ehlib2.1控件中有这个转换查找到的数据放入DBGridEh中再导出,很快!
 
Excel 可以直接打开 DBF 文件,将你的查询结果存入到 DBF 文件中就行了。
 
后退
顶部