我想实现把数据导出到execl中.可"系统状态:数据正在导出中.."显示不了,而且界面象死机了一样,最后数据还是导出的.
能不能把代码修改一下,谢谢各位了
procedure TForm12.Button1Click(Sender: TObject);
var
  eclApp, WorkBook: Variant;
  xlsFileName: String;
  i, j: Integer;
  FieldValue: String;
  SaveDialog: TSaveDialog;
    begin
      SaveDialog:=TSaveDialog.Create(Application);
      SaveDialog.DefaultExt:='.xls';
      SaveDialog.Filter:= 'Excel文件|*.xls|所有文件|*.*';
   if savedialog.Execute then
      begin
          xlsFileName:= SaveDialog.FileName;
          try
            eclApp:=CreateOleObject('Excel.Application');
            WorkBook:=CreateOleobject('Excel.Sheet');
          except
            ShowMessage('您的机器里未安裝Microsoft Excel!');
            Exit;
          end;
          form2.statusbar1.Panels[1].Text:='系统状态:数据正在导出中....';
          try
             screen.Cursor:=crAppStart;
             p1.Visible:=true;
             WorkBook:= eclApp.workBooks.Add;
             DBGrid1.DataSource.DataSet.First;
             p1.min:=0;
             p1.max:=DBGrid1.DataSource.DataSet.RecordCount+DBGrid1.Columns.Count;
             p1.step:=1;
             for i:= 0 to DBGrid1.Columns.Count - 1 do
              begin
                eclApp.Cells[1,i+1]:=DBGrid1.Columns.Items[i].Title.Caption;
              end;
              for i:= 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do
              begin
                 for j:= 0 to DBGrid1.Columns.Count - 1 do
                   begin                       FieldValue:=DBGrid1.Columns[j].Field.AsString;
                       eclApp.Cells[i + 2, j + 1]:=FieldValue;
                    end;
                p1.stepit;
                DBGrid1.DataSource.DataSet.Next;
              end;
            form2.statusbar1.Panels[1].Text:='系统状态:数据导出完毕';
            if FileExists(xlsFileName) then
              begin
                if Application.MessageBox('文件已经存在!' + #13 + #10 +
                           '是否进行替换?', '提示', MB_OKCANCEL +
                           MB_ICONQUESTION + MB_SYSTEMMODAL) = IDOK then
                  begin
                    DeleteFile(PChar(xlsFileName));
                    WorkBook.Saveas(xlsFileName);
                    WorkBook.Close;
                    eclApp.Quit;
                    eclApp:= Unassigned;
                  end;
              end
            else
              begin
                screen.Cursor:= crdefault;
                WorkBook.Saveas(xlsFileName);
                showmessage('保存EXECL文件成功,路径为:'+xlsFileName);
                WorkBook.Close;
                eclApp.Quit;
                eclApp:= Unassigned;
              end;
          except
            screen.Cursor:= crdefault;
            form2.statusbar1.Panels[1].Text:='系统状态:数据导出出错';
            ShowMessage('不能正确操作Excel文件。可能是該文件已被其他程序打开, 或系統错误。');
            WorkBook.Close;
            eclApp.Quit;
            eclApp:=Unassigned;
          end;
        end;
   end;

解决方案 »

  1.   

    可能已经有一个Excel的进程了
    eclApp要释放加上VarClear(eclApp)这一句
      

  2.   

    这是我写的一段代码使用肯定没问题
    procedure TfrmSelectSum.BitBtn1Click(Sender: TObject);
    var
    asheet,rang:variant;
    i,j:integer;
    begin
    Screen.Cursor:=crHourGlass;
    ExcelApplication1.Visible[0]:=True;
    ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
    asheet:=ExcelApplication1.Worksheets.Item[1];for i:=0 to frmDataModule.QhzSum.RecordCount-1 do begin
     for j:=0 to frmDataModule.QhzSum.FieldCount-1 do
     asheet.cells[i+1,j+1].FormulaR1C1:=Trim(frmDataModule.QhzSum.Fields[j].AsVariant);
    frmDataModule.QhzSum.Next;
    end;
    frmDataModule.QhzSum.First;
    ExcelApplication1.Disconnect;
    Screen.Cursor:=crDefault;
    end;
      

  3.   

    代码是参照别人的写的.(适用于MS ACCESS 数据库.不能用于BDE) 测试通过.querys.close;
    querys.sql.clear;
    querys.sql.add('select * into [excel 8.0;database=c:\abc.xls].book1 from temp');
    querys.sql.execsql;
      

  4.   

    WorkBook:=CreateOleobject('Excel.Sheet');这个不用再创建吧
      

  5.   

    你建立了一个excel的进程,很耗资源的,也慢,用ado吧,不过有些格式不行