我在网上找了个导出EXCEL的代码,是可以使用的,但是每次查询的结果不一样,导出总会是DBGRIDEH显示的重复数据。
查询几次,就重复几次。重复的数据只是列重复:比如
A B
1 2
导出来则是
A B A B A B
1 2 1 2 1 2我只用了几个控件:adoconnection ,adoquery,datasource, dbgrideh。其实这个代码是用在DBGRID上的没有问题我用的是DBGRIDEH,,就把代码改成了代码里的TDBGRID改成了TDBGRIDEH.可以导出但就出重复的问题了高手帮我看看是代码还是TDBGRIDEH控件的什么问题呢procedure CopyDbDataToExcel(Args: array of const);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
I: Integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end; try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end; XLApp.WorkBooks.Add;
XLApp.SheetsInNewWorkbook := High(Args) + 1; for I := Low(Args) to High(Args) do
begin
XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrideh(Args[I].VObject).Name;
Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrideh(Args[I].VObject).Name]; if not TDBGrideh(Args[I].VObject).DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end; TDBGrideh(Args[I].VObject).DataSource.DataSet.first;
for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
Sheet.Cells[1, iCount + 1] :=
TDBGrideh(Args[I].VObject).Columns.Items[iCount].Title.Caption; jCount := 1;
while not TDBGrideh(Args[I].VObject).DataSource.DataSet.Eof do
begin
for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
Sheet.Cells[jCount + 1, iCount + 1] :=
TDBGrideh(Args[I].VObject).Columns.Items[iCount].Field.AsString; Inc(jCount);
TDBGrideh(Args[I].VObject).DataSource.DataSet.Next;
end;
XlApp.Visible := True;
end;
Screen.Cursor := crDefault;
end;
查询几次,就重复几次。重复的数据只是列重复:比如
A B
1 2
导出来则是
A B A B A B
1 2 1 2 1 2我只用了几个控件:adoconnection ,adoquery,datasource, dbgrideh。其实这个代码是用在DBGRID上的没有问题我用的是DBGRIDEH,,就把代码改成了代码里的TDBGRID改成了TDBGRIDEH.可以导出但就出重复的问题了高手帮我看看是代码还是TDBGRIDEH控件的什么问题呢procedure CopyDbDataToExcel(Args: array of const);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
I: Integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end; try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end; XLApp.WorkBooks.Add;
XLApp.SheetsInNewWorkbook := High(Args) + 1; for I := Low(Args) to High(Args) do
begin
XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrideh(Args[I].VObject).Name;
Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrideh(Args[I].VObject).Name]; if not TDBGrideh(Args[I].VObject).DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end; TDBGrideh(Args[I].VObject).DataSource.DataSet.first;
for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
Sheet.Cells[1, iCount + 1] :=
TDBGrideh(Args[I].VObject).Columns.Items[iCount].Title.Caption; jCount := 1;
while not TDBGrideh(Args[I].VObject).DataSource.DataSet.Eof do
begin
for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
Sheet.Cells[jCount + 1, iCount + 1] :=
TDBGrideh(Args[I].VObject).Columns.Items[iCount].Field.AsString; Inc(jCount);
TDBGrideh(Args[I].VObject).DataSource.DataSet.Next;
end;
XlApp.Visible := True;
end;
Screen.Cursor := crDefault;
end;
解决方案 »
- 问一个Access的问题
- 子窗口里给父窗口里的TreeView加节点,现在在子窗口里如何给刚加的节点Node.Data赋值?
- cxGRID中如何实现通过单机按钮实现预定义的数据分组
- 帮忙想一个数据结构,合适就给分![数据结构醒目]
- 测试连网问题
- ClearCase免费课程,欢迎参加!
- 感谢Nyf1220!接分!
- 请问各位我想在深圳找工作,可是深圳市人才大市场全是厂招人,又没有公司招人,请问有谁知道公司一般在哪招人,我应该去哪找工作啊!
- 如何在dbgrid中实现多行表头?
- (再问)谁能告诉我cards.dll(扑克牌游戏需要的)怎么用?有哪些函数?
- 关于多个Tclientsocket 的onRead事件
- 统计问题。
用ADO也可导出EXCEL。
这两个混合起来用就出错啦!
procedure saveToExcel();
var
Eclapp,workbook:variant;
i,n:integer;
begin
if not adoquery1.Active then exit;
if adoquery1.RecordCount<=0 then exit; if application.MessageBox('确认导出excel表吗?','提示',mb_okcancel+mb_iconinformation)=idcancel then exit;
Eclapp := createoleobject('Excel.Application');
Eclapp.workbooks.add;
for i:=0 to dbgrid2.FieldCount-1 do
begin
Eclapp.cells[1,i+1]:=dbgrid2.Columns[i].Title.Caption;
end;
Eclapp.cells[1,5]:='签字'; adoquery1.First;
n:=2;
while not adoquery1.Eof do
begin
eclapp.cells[n,1] := adoquery1.Fields[0].AsString;
eclapp.cells[n,2] := adoquery1.Fields[1].AsString;
eclapp.cells[n,3] := adoquery1.Fields[2].AsString;
eclapp.cells[n,4] := adoquery1.Fields[4].AsString;
eclapp.cells[n,6] :=' ';
inc(n);
adoquery1.Next;
end; eclapp.cells[n,1] := '满足条件记录的总数为:'+inttostr(adoquery1.RecordCount)+'条';
application.MessageBox('数据导出完成!','提示',mb_ok+mb_iconinformation);
eclapp.visible := true;end;
必须在uses 中加入 DBgridehimpexp
主要命令:
SaveDBGridEhToExportFile(TDBGridEhExportAsXLS, DBGridEh, FileName, False);
例程
procedure TFrimFiveReport.FlatButton1Click(Sender: TObject);
var
ExpClass:TDBGridEhExportClass;
Ext:String;
begin
SaveDialog1.FileName :='五日报';
if SaveDialog1.Execute then
begin
case SaveDialog1.FilterIndex of
1: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
2: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
3: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
4: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
5: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
else
ExpClass := nil; Ext := '';
end;
if ExpClass <> nil then
begin
if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <> UpperCase(Ext) then
SaveDialog1.FileName := SaveDialog1.FileName+'.'+Ext;
try
SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,true);
except
msshow('保存失败!');
end;
end;
end;
end;上面那个是ADO直接导出
这个是dbgrideh志出。
代码是网上搜的。
二楼直接用ADO是可以导出的,但 eclapp.cells[n,1] := adoquery1.Fields[0].AsString;
eclapp.cells[n,2] := adoquery1.Fields[1].AsString;
eclapp.cells[n,3] := adoquery1.Fields[2].AsString;
eclapp.cells[n,4] := adoquery1.Fields[4].AsString;
......
需要手工操作,很麻烦
三楼的,编译通过,但没有反应!!!!
这个可以用 for i:=0 to .ADOQuery1.FieldCount-1 来实现的,
var
ColEh:TColumnEh;
begin
//列属性初始化
ColEh:=DBGridEh1.Columns.Add;
ColEh.FieldName:='商品代码';
ColEh.Title.TitleButton:=True;
......................我这样做是为了点击列标题后自动排序,但每查询一次就会生成新的列我现在把代码都放到窗体初始化里,就没有问题了。。谢谢大家的回答,学到了很多东西!