var
  excelapplication: texcelapplication;
  excelworkbook: texcelworkbook;
  excelworksheet: texcelworksheet;
  i, j: integer;
  str, filename: string;
begin
  filename := extractfilepath(application.ExeName) + '1.xls';
  try    excelapplication := texcelapplication.Create(application);
    excelworkbook    := texcelworkbook.Create(application);
    excelworksheet   := texcelworksheet.Create(application);
    excelapplication.Connect;
  except
    Application.messagebox('Excel 没有安装!', 'Hello', MB_ICONERROR + mb_Ok);
    Abort;
  end;
  try
    excelapplication.Workbooks.Add(emptyparam, 0);
    excelworkbook.ConnectTo(ExcelApplication.Workbooks[1]);
    excelworksheet.ConnectTo(ExcelWorkbook.Worksheets[1] as _worksheet);
    with adoquery1 do
    begin
      Close;
      sql.Clear;
      sql.Add('select * from bmbh');
      Open;
      for i := 0 to FieldCount - 1 do
      begin
        ExcelWorksheet.Cells.Item[1, i + 1] := Fields[i].DisplayLabel;
      end;
      for I := 2 to RecordCount + 1 do
      begin
        for j := 0 to fieldcount - 1 do
        begin
          excelworksheet.cells.item[i, j + 1] := fields[j].AsString;        end;
        Next;
      end;
    end;
    ExcelWorksheet.Columns.AutoFit;
    ExcelWorksheet.SaveAs(filename);
    Application.messagebox(PChar('数据成功导出' + filename), '信', 64);
  finally
    ExcelApplication.Disconnect;
    ExcelApplication.Quit;
    ExcelApplication.Free;
    ExcelWorksheet.Free;
    ExcelWorkbook.Free;
  end;
end;
解释一下红色部分是什么意思

解决方案 »

  1.   

    ExcelApplication.Disconnect; 好象是断开的意思``
      

  2.   

    建议楼主不要用这种循环的方法进行导出,数据量稍多就会很慢的。用数据流的方法:
    这有一个类:uExportXls:
    //======================================
    { 功能:将数据集的数据导入Excel;
        用法:With ExportXls.Create(TDataSet(ADOQuery1)) do
              Try
                Save2File(SaveDialog1.FileName+'.xls', True);
              finally
                Free;
              end;}unit uExportXls;interfaceuses
      DB,Classes;var
      CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
      CXlsEof: array[0..1] of Word = ($0A, 00);
      CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
      CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
      CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
      CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);type
      TFldRec = record
        Title: string;
        Width: Integer;
      end;  ExportXls = class(TObject)
      Private
        FCol: word;
        FRow: word;
        FDataSet: TDataSet;
        Stream: TStream;
        FWillWriteHead: boolean;
        FBookMark: TBook;
        procedure IncColRow;
        procedure WriteBlankCell;
        procedure WriteFloatCell(const AValue: Double);
        procedure WriteIntegerCell(const AValue: Integer);
        procedure WriteStringCell(const AValue: string);
        procedure WritePrefix;
        procedure WriteSuffix;
        procedure WriteTitle;
        procedure WriteDataCell;    procedure Save2Stream(aStream: TStream);
      Public
        procedure SaveToXlsFile(FileName: string; WillWriteHead: Boolean);
        constructor Create(aDataSet: TDataSet);
      end;
    procedure ExportToXls(const FileName: string; DataSet: TDataSet);// Boolean;
    implementationuses SysUtils;procedure ExportToXls(const FileName: string; DataSet: TDataSet);// Boolean;
    begin
      //if DataSet.Active then
     // Result := False;
      with ExportXls.Create(DataSet) do
      try
        SaveToXlsFile(FileName, True);
     //   Result := True;
      finally
        Free;
      end;
    end;constructor ExportXls.Create(aDataSet: TDataSet);
    begin
      inherited Create;
      FDataSet := aDataSet;
    end;procedure ExportXls.IncColRow;
    begin
      if FCol = FDataSet.FieldCount - 1 then
      begin
        Inc(FRow);
        FCol := 0;
      end
      else
        Inc(FCol);
    end;procedure ExportXls.WriteBlankCell;
    begin
      CXlsBlank[2] := FRow;
      CXlsBlank[3] := FCol;
      Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
      IncColRow;
    end;procedure ExportXls.WriteFloatCell(const AValue: Double);
    begin
      CXlsNumber[2] := FRow;
      CXlsNumber[3] := FCol;
      Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
      Stream.WriteBuffer(AValue, 8);
      IncColRow;
    end;procedure ExportXls.WriteIntegerCell(const AValue: Integer);
    var
      V: Integer;
    begin
      CXlsRk[2] := FRow;
      CXlsRk[3] := FCol;
      Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
      V := (AValue shl 2) or 2;
      Stream.WriteBuffer(V, 4);
      IncColRow;
    end;procedure ExportXls.WriteStringCell(const AValue: string);
    var
      L: Word;
    begin
      L := Length(AValue);
      CXlsLabel[1] := 8 + L;
      CXlsLabel[2] := FRow;
      CXlsLabel[3] := FCol;
      CXlsLabel[5] := L;
      Stream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
      Stream.WriteBuffer(Pointer(AValue)^, L);
      IncColRow;
    end;procedure ExportXls.WritePrefix;
    begin
      Stream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
    end;procedure ExportXls.WriteSuffix;
    begin
      Stream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
    end;procedure ExportXls.WriteTitle;
    var
      n: word;
    begin
      for n := 0 to FDataSet.FieldCount - 1 do
        WriteStringCell(FDataSet.Fields[n].DisplayLabel); //显示标签名
    end;procedure ExportXls.WriteDataCell;
    var
      Idx: word;
    begin
      WritePrefix;
      if FWillWriteHead then
        WriteTitle;
      FDataSet.DisableControls;
      FBookMark := FDataSet.GetBook;
      FDataSet.First;
      while not FDataSet.Eof do
      begin
        for Idx := 0 to FDataSet.FieldCount - 1 do
        begin
          if FDataSet.Fields[Idx].IsNull then
            WriteBlankCell
          else
          begin
            case FDataSet.Fields[Idx].DataType of
              ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
                WriteIntegerCell(FDataSet.Fields[Idx].AsInteger);
              ftFloat, ftCurrency, ftBCD:
                WriteFloatCell(FDataSet.Fields[Idx].AsFloat);
            else
              if Assigned(FDataSet.Fields[Idx].OnGetText) then
                WriteStringCell(FDataSet.Fields[Idx].Text)
              else
                WriteStringCell(FDataSet.Fields[Idx].AsString);
            end;
          end;
        end;
        FDataSet.Next;
      end;
      WriteSuffix;
      if FDataSet.BookValid(FBookMark) then
        FDataSet.GotoBook(FBookMark);
      FDataSet.EnableControls;
    end;procedure ExportXls.Save2Stream(aStream: TStream);
    begin
      FCol := 0;
      FRow := 0;
      Stream := aStream;
      WriteDataCell;
    end;procedure ExportXls.SaveToXlsFile(FileName: string; WillWriteHead: Boolean);
    var
      aFileStream: TFileStream;
    begin
      FWillWriteHead := WillWriteHead;
      if FileExists(FileName) then
        DeleteFile(FileName);
      aFileStream := TFileStream.Create(FileName, fmCreate);
      try
        Save2Stream(aFileStream);
      finally
        aFileStream.Free;
      end;
    end;end.//======================================
      

  3.   

    你打开excel表实际上用的是ole自动化服务,ExcelApplication.Disconnect; 是断开服务的意思。
      

  4.   

    ExcelApplication.Disconnect,断开与excel的连接
      

  5.   

    如果只是写excel报表之类, 
    写成 
    1,2,3 
    4,5,6 
    这样的文件个是后缀只要是“csv/xls”就可以了 
    速度比ole快100倍
      

  6.   

    请看 
    http://blog.csdn.net/xjq2003/archive/2005/07/29/439344.aspx