以下是程序源码。
问题:第一次点击“导出按钮”时数据导出速度可以,但再次查询数据并第二次点击“导出按钮”时,Excel2000的界面显示不全但能导出数据。
我不知道该程序有哪些不足,请指教,谢谢。
//导出到Excel2000表格。
procedure Tfmjiandingsee.btExportClick(Sender: TObject);
var
i,row,column:integer;
begin
if messagedlg('查询数据将被导出到Excel电子表,继续此项操作吗?',mtconfirmation,[mbyes,mbno],0)<>mryes then
exit;
try
excelapplication1.Connect ;
except
messagedlg('是否已经正确安装Excel?',mterror,[mbok],0);
abort;
end; ////连接Excel////
excelapplication1.Visible [0]:=true;
excelapplication1.caption:='Excel应用';
excelapplication1.Workbooks.Add(null,0);
excelworkbook1.ConnectTo(excelapplication1.Workbooks [1]);
excelworksheet1.ConnectTo(excelworkbook1.Worksheets[1] as _worksheet); ////导出数据////
excelworksheet1.Cells.Item[1,1]:='工号';
excelworksheet1.Cells.Item[1,2]:='姓名';
excelworksheet1.Cells.Item[1,3]:='出生日期';
excelworksheet1.Cells.Item[1,4]:='车间';
excelworksheet1.Cells.Item[1,5]:='班组队';
excelworksheet1.Cells.Item[1,6]:='现岗位';
excelworksheet1.Cells.Item[1,7]:='职务';
excelworksheet1.Cells.Item[1,8]:='日期';
excelworksheet1.Cells.Item[1,9]:='鉴定职务';
excelworksheet1.Cells.Item[1,10]:='原等级';
excelworksheet1.Cells.Item[1,11]:='鉴定等级'; row:=2;
while not adodataset1.Eof do
begin
column:=1;
for i:=1 to adodataset1.FieldCount do
begin
excelworksheet1.Cells.Item [row,column]:=adodataset1.Fields[i-1].AsString ;
column:=column+1;
end;
adodataset1.Next;
row:=row+1;
end; if savedialog1.Execute then
excelworksheet1.SaveAs(savedialog1.FileName ) ; ////断开Excel////
excelapplication1.Quit ;
excelapplication1.Disconnect ;
end;
//查询数据(adodataset1)
procedure Tfmjiandingsee.btsearchClick(Sender: TObject);
var
str:string;
tongji1:integer;
begin
str:='select personnel.工号,姓名,出生日期,车间,班组队,现岗位,职务,日期,鉴定职务,原等级,鉴定等级 from personnel inner join jishudengji on personnel.工号 =jishudengji.工号 where 1=1 ';
if edtname.Text<>'' then
str:=str+' and 姓名 like '''+'%'+edtname.Text+'%'+'''';
if cmboxdate.Text<>'' then
str:=str+' and 日期= '''+trim(formatdatetime('yyyy-mm-dd',strtodate(cmboxdate.Text)))+'''';
if cmboxzhiwu.Text<>'' then
str:=str+' and 鉴定职务 like '''+cmboxzhiwu.Text+'%'+'''';
if cmboxdengji.Text<>'' then
str:=str+' and 鉴定等级 like '''+cmboxdengji.Text+'%'+'''';
str:=str+' order by 车间 asc,班组队 asc,现岗位 asc '; adodataset1.Active :=false;
adodataset1.CommandText :=str;
adodataset1.Open ;
adodataset1.First ;
tongji1:=adodataset1.RecordCount ;
edit1.Text :=inttostr(tongji1)+' 条';end;
问题:第一次点击“导出按钮”时数据导出速度可以,但再次查询数据并第二次点击“导出按钮”时,Excel2000的界面显示不全但能导出数据。
我不知道该程序有哪些不足,请指教,谢谢。
//导出到Excel2000表格。
procedure Tfmjiandingsee.btExportClick(Sender: TObject);
var
i,row,column:integer;
begin
if messagedlg('查询数据将被导出到Excel电子表,继续此项操作吗?',mtconfirmation,[mbyes,mbno],0)<>mryes then
exit;
try
excelapplication1.Connect ;
except
messagedlg('是否已经正确安装Excel?',mterror,[mbok],0);
abort;
end; ////连接Excel////
excelapplication1.Visible [0]:=true;
excelapplication1.caption:='Excel应用';
excelapplication1.Workbooks.Add(null,0);
excelworkbook1.ConnectTo(excelapplication1.Workbooks [1]);
excelworksheet1.ConnectTo(excelworkbook1.Worksheets[1] as _worksheet); ////导出数据////
excelworksheet1.Cells.Item[1,1]:='工号';
excelworksheet1.Cells.Item[1,2]:='姓名';
excelworksheet1.Cells.Item[1,3]:='出生日期';
excelworksheet1.Cells.Item[1,4]:='车间';
excelworksheet1.Cells.Item[1,5]:='班组队';
excelworksheet1.Cells.Item[1,6]:='现岗位';
excelworksheet1.Cells.Item[1,7]:='职务';
excelworksheet1.Cells.Item[1,8]:='日期';
excelworksheet1.Cells.Item[1,9]:='鉴定职务';
excelworksheet1.Cells.Item[1,10]:='原等级';
excelworksheet1.Cells.Item[1,11]:='鉴定等级'; row:=2;
while not adodataset1.Eof do
begin
column:=1;
for i:=1 to adodataset1.FieldCount do
begin
excelworksheet1.Cells.Item [row,column]:=adodataset1.Fields[i-1].AsString ;
column:=column+1;
end;
adodataset1.Next;
row:=row+1;
end; if savedialog1.Execute then
excelworksheet1.SaveAs(savedialog1.FileName ) ; ////断开Excel////
excelapplication1.Quit ;
excelapplication1.Disconnect ;
end;
//查询数据(adodataset1)
procedure Tfmjiandingsee.btsearchClick(Sender: TObject);
var
str:string;
tongji1:integer;
begin
str:='select personnel.工号,姓名,出生日期,车间,班组队,现岗位,职务,日期,鉴定职务,原等级,鉴定等级 from personnel inner join jishudengji on personnel.工号 =jishudengji.工号 where 1=1 ';
if edtname.Text<>'' then
str:=str+' and 姓名 like '''+'%'+edtname.Text+'%'+'''';
if cmboxdate.Text<>'' then
str:=str+' and 日期= '''+trim(formatdatetime('yyyy-mm-dd',strtodate(cmboxdate.Text)))+'''';
if cmboxzhiwu.Text<>'' then
str:=str+' and 鉴定职务 like '''+cmboxzhiwu.Text+'%'+'''';
if cmboxdengji.Text<>'' then
str:=str+' and 鉴定等级 like '''+cmboxdengji.Text+'%'+'''';
str:=str+' order by 车间 asc,班组队 asc,现岗位 asc '; adodataset1.Active :=false;
adodataset1.CommandText :=str;
adodataset1.Open ;
adodataset1.First ;
tongji1:=adodataset1.RecordCount ;
edit1.Text :=inttostr(tongji1)+' 条';end;
解决方案 »
- 为啥我的模拟按钮单击没有反应??
- 请教,如果将一个exe嵌入到我的程序里?
- 试着写了一个多线程程序,却出错了。
- intraweb中的iwflash控件问题.大家帮帮忙呀
- 在edit中第一字符大写并且要把空格之后的第一个字母都大写??
- 如何将一个a.exe文件和一个a.dll文件合并成一个b.exe?运行b.exe时再释放出a.exe和a.dll???(在线)
- 在开发三层数据库应用中要不主张用DBgrid??????
- 计算一个点在不在一个区域里?
- 想结交用DELPHI做过类似进销存的朋友!
- 我应该怎样写这条SQL语句呢?
- 使用图象列表的问题
- 我自己做了一个form模板,但现在要修改,不知道怎么才能修改
以下是我用的过程,供参考:
Procedure DBGridCreateExcel(GridName: TDBGrid; RepCapt:string); //Print the Data to Excel
var XLApp, sheet, Range: Variant;
I,J,t:Integer;
begin
t := 1;
XLApp:=CreateOleobject('Excel.Application');
XLApp.visible := False;
XLApp.Workbooks.add(XlWBatWorkSheet);
XLApp.Workbooks[1].worksheets[1].name:='XXXX';
Range:=XLApp.workbooks[1].Worksheets['XXXX'].Columns;
sheet:=XLApp.Workbooks[1].worksheets['XXXX'];
sheet.cells[t,1]:='XXXX Electronic Industrial Co.Ltd';
sheet.cells[t+2,GridName.Columns.Count-1]:='Date:'+DateTimeToStr(Now);
sheet.cells[t+2,(GridName.Columns.Count-1) div 2] := RepCapt;
sheet.cells[t+2,(GridName.Columns.Count-1) div 2].Font.Color := clRed;
sheet.cells[t+2,(GridName.Columns.Count-1) div 2].Font.Size := 14;
Sheet.cells[t+2,(GridName.Columns.Count-1) div 2].Font.FontStyle := 'Bold';
Inc(t,3);
For J:=1 to GridName.Columns.Count do
begin
Range.Columns[J].Columnwidth := GridName.Columns[J-1].Width Div 6;
sheet.cells[t,J] := GridName.Columns[J-1].Title.Caption;
end;
Inc(t);
with GridName.DataSource.DataSet do
begin
First;
I := 0;
while not eof do
begin
For J:=0 to GridName.Columns.Count-1 do
sheet.cells[I+t,J+1] := FieldByName(GridName.Columns[J].FieldName).AsString;
Inc(I);
Next;
end;
end;
XLApp.visible := True;
end;
导出时有时直接用组件(exlcelapplication)或有时用OLE ,不清楚究竟该选哪一个。 有区别吗?