在delphi程序里已经将数据库表的数据转写到excel表里,请问在delphi程序里怎样保存该excel文件到硬盘

解决方案 »

  1.   

    procedure tform1.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 := TDBGrid(Args[I].VObject).Name;
        Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];    if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then
        begin
          Screen.Cursor := crDefault;
          Exit;
        end;    TDBGrid(Args[I].VObject).DataSource.DataSet.first;
        for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
          Sheet.Cells[1, iCount + 1] :=
        TDBGrid(Args[I].VObject).Columns.Items[iCount].Title.Caption;    jCount := 1;
        while not TDBGrid(Args[I].VObject).DataSource.DataSet.Eof do
        begin
          for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
            Sheet.Cells[jCount + 1, iCount + 1] :=
          TDBGrid(Args[I].VObject).Columns.Items[iCount].Field.AsString;      Inc(jCount);
          TDBGrid(Args[I].VObject).DataSource.DataSet.Next;
        end;
        XlApp.Visible := True;
      end;
      Screen.Cursor := crDefault;
    end;
    procedure tform1.Button4Click(Sender: TObject);
    begin
      inherited;
      CopyDbDataToExcel([dbgrid1]);
    end;
      

  2.   

    这样也可以,报错时弹出一个保存对话框,代码如下://参数说明:
    //filename:保存的文件名
    //DataSet: 就是表格连接的数据集
    //DispTxt:打开xls文件后看到的标题(XXX报表)
    function SavetoFile(filename:String;DataSet:TDataSet; DispTxt:String): Integer;
      var
      i,j,k:integer;
      ColTitle,FieldData,Msg :string;
      StrList :Tstringlist;
      SaveDlg: TSaveDialog;
    begin
      try
        //初始化
        Result :=0;
        if DataSet=nil then
          Exit;
        FieldData := '';
        ColTitle  := '';
        StrList:=TStringList.Create;    //加入字段名(列标题首先须改为汉字)
        for k :=0 to (DataSet.FieldCount-1) do
        begin
          if not DataSet.Fields[K].Visible then
            continue
          else
            ColTitle :=ColTitle+(DataSet.Fields[K].DisplayLabel)+#9;
        end;
        StrList.add(ColTitle);
        //加入数据
        with DataSet do
        begin
            First;
            for j:=0 to (RecordCount-1) do
            begin
              FieldData:='';
              for i:=0 to (FieldCount-1) do
              begin
                if not fields[i].Visible then
                  continue
                else
                begin
                  if i< FieldCount-1 then
                    FieldData:=FieldData+(DataSet.FieldByName(fields[i].FieldName).AsString)+#9
                  else
                    FieldData:=FieldData+(DataSet.FieldByName(fields[i].FieldName).AsString);
                end;
              end;
              StrList.add(FieldData);
              Next;
            end;
        end;
        //文件覆盖提示
        if FileExists(filename) then
        begin
          Msg := '已存在文件(' + filename + '),是否覆盖?';
          if ShowAsk(PChar(Msg)) then
          begin
            //删除文件
            DeleteFile(filename)
          end
          else
            exit;
        end;
        //保存文件
        StrList.savetofile(filename);
        Result := DataSet.RecordCount; //返回记录数
      finally
        StrList.Free;
      end;
    end;