以下是程序源码。
问题:第一次点击“导出按钮”时数据导出速度可以,但再次查询数据并第二次点击“导出按钮”时,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;

解决方案 »

  1.   

    在导出数据的过程再写 ADODataset.First 吧
    以下是我用的过程,供参考:
    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;
      

  2.   

    谢谢热情的朋友。
    导出时有时直接用组件(exlcelapplication)或有时用OLE ,不清楚究竟该选哪一个。 有区别吗?