请问用Delphi 7 怎样将网格DBGrid中的数据导入到EXCEL呀??

解决方案 »

  1.   

    procedure TLogQueryForm.SaveAsExcel(FileName:string);
    var
        ExcelApp,WorkBook: Variant;
        i,j,k:integer;   //i列No,j行No,k可见列
        s:string;
        SavePlace: TBook;
        Range :Variant;
        ProgressThread:THSProgressThread;
        CurRecCount:integer;
    begin
        try
          ExcelApp := CreateOleObject( 'Excel.Application' );
          WorkBook := CreateOleObject('Excel.Sheet');
        Except
          Exception.Create('对不起,您的机器上没有安装Microsoft Excel,该文件不能生成!');
          Exit;
        End; //try...Except    if FileExists(FileName) then
          DeleteFile(FileName);     SavePlace:=nil;
         try
           SavePlace := QryLog.GetBook;
           QryLog.DisableControls;
           QryLog.First;
           ProgressThread :=THSProgressThread.Create(Format('正在导出到%s文档(共%d条)...',['Excel',QryLog.RecordCount]),'导出进度',QryLog.RecordCount,1);
           try
               ExcelApp.Visible := false;
               ExcelApp.Caption := '导出文件';
               WorkBook := ExcelApp.WorkBooks.Add;           ExcelApp.ActiveSheet.Name := '系统操作日志';           //导出标题...
               k:=0;
               for i := 0 to dbgLog.Columns.Count-1  do
               begin
                   if not dbgLog.Columns[i].Visible then Continue;
                   ExcelApp.Cells(1,k+1)  := dbgLog.Columns[i].Title.Caption;
                   if dbgLog.Columns[i].Field.DataType = ftString  then
                   begin
                     ExcelApp.ActiveSheet.Columns[k+1].numberformatlocal:= '@';
                     ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth:= Max(dbgLog.Columns[i].Field.Size,dbgLog.Columns[i].Width/8);
    {
                     if Assigned(DBGrid.Columns[i].Field.OnGetText) then
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := 30  //需要代码转名称字段默认长度30
                     else
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := DBGrid.Columns[i].Field.Size;
                     if Cardinal(DBGrid.Columns[i].Field.Size)<strlen(pchar(DBGrid.Columns[i].Title.Caption)) then
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := strlen(pchar(DBGrid.Columns[i].Title.Caption));
    }
                   end;
                   k:=k+1;
               end;           //导出每行数据...
               j:=2;
               while not QryLog.Eof do
               begin
                   k:=0;
                   for i:=0 to dbgLog.Columns.Count-1  do
                   begin
                       if not dbgLog.Columns[i].Visible then Continue;
                       s := dbgLog.Columns[i].Field.DisplayText;
                       ExcelApp.Cells(j,k+1) := s;
                       k:=k+1;
                   end;//i
                   j:=j+1;
                   QryLog.Next;               if ProgressThread.Terminated then  Exit;
                   ProgressThread.SetPosition(j);
    //               if Assigned(FOnSaveToFile) then FOnSaveToFile(Index,FileName,QuyRecordCount,j);
               end;           //标题栏字体,背景色
               ExcelApp.ActiveSheet.Rows[1].Font.Name   := '宋体';
               ExcelApp.ActiveSheet.Rows[1].Font.Color  := clBlack;           Range := ExcelApp.ActiveSheet.Range['A'+'1'+':'+DecTo26(k-1)+'1'];
               Range.interior.Color := clSilver;           //自动加外边框
               Range := ExcelApp.ActiveSheet.Range['A'+'1'+':'+DecTo26(k-1)+inttostr(j-1)];
               Range.Borders.LineStyle := 1;
               Range.WrapText:=True;
               Range.VerticalAlignMent:= 1;
               Range.HorizontalAlignment:=1;           //保存文件
               WorkBook.Saveas(FileName);
           except
             Application.MessageBox(PChar('生成Excel文件【'+FileName+'】出错!'),'提示',MB_OK+MB_ICONINFORMATION);
           end;
         finally
           ProgressThread.Free;
           QryLog.EnableControls;
           QryLog.GotoBook(SavePlace);
           QryLog.FreeBook(SavePlace);
           WorkBook.Close;
           ExcelApp.Quit;
         end;
    end;
      

  2.   


    procedure Tfrmptax.Button3Click(Sender: TObject);
      var  ExcelApp,WorkBook:OLEVariant;
           i,j :integer;
           xlsFileName:string;
           recycle_length:integer;
           s_date:string;   begin
       s_date:=edit2.Text;
       savedialog2.Execute;
       xlsFileName:=savedialog2.FileName ;
            if xlsfilename=''  then
            begin
            showmessage('操作成功取消!');
            end
            else
               begin
               if edit2.text=''then
               begin                with query4 do
                    begin
                    CommUtils.initialQuery(Query4,'select count(T_id),sum(T_taxable),sum(T_amountax) from tax');
                    open;
                    recycle_length:=query4.Fields[0].AsInteger ;                end;                progressbar1.Max := recycle_length;
                    progressbar1.position:=0;
                    try
                     ExcelApp:= CreateOleObject( 'Excel.Application' );
                     WorkBook:=CreateOleobject('Excel.Sheet');
                    except
                     application.Messagebox('无法打开Xls文件,请确认已 经安装EXCEL.','',mb_OK+mb_IconStop);                 Exit;
                     end;
                    //workBook:= ExcelApp.workBooks.Open(ExtractFileDir(Application.ExeName)+'excel.xls');
                    WorkBook:=ExcelApp.workbooks.Add;
                    ExcelApp.Cells(1,1):='条数';
                    ExcelApp.Cells(1,2):='工号';                ExcelApp.Cells(1,3):='姓名';
                    ExcelApp.Cells(1,4):='人民币合计';
                    ExcelApp.Cells(1,5):='减除费用额';                ExcelApp.Cells(1,6):='应纳税所得税';
                    ExcelApp.Cells(1,7):='税率';
                    ExcelApp.Cells(1,8):='速算扣除数';
                    ExcelApp.Cells(1,9):='扣缴所得税额';
                    j:=1;
                    //.
                    CommUtils.initialTable(table3,TBLNAME_TAX+'.dbf');
                    //.
                    table3.Open;
                    table3.First;
                    for i:=2 to recycle_length+1 do
                    begin                ExcelApp.Cells(i,1):=j;
                    ExcelApp.Cells(i,2):=table3.fieldbyname('T_id').Asstring;
                    ExcelApp.Cells(i,3):=table3.fieldbyname('T_name').Asstring;
                    ExcelApp.Cells(i,4):=table3.fieldbyname('T_total').Asfloat;
                    ExcelApp.Cells(i,5):=table3.fieldbyname('T_deduct').Asfloat;                ExcelApp.Cells(i,6):=table3.fieldbyname('T_taxable').Asstring;
                    ExcelApp.Cells(i,7):=FloatToStr(table3.fieldbyname('T_taxrate').asFloat*100)+'%';
                    ExcelApp.Cells(i,8):=table3.fieldbyname('T_quick').Asfloat;
                    ExcelApp.Cells(i,9):=table3.fieldbyname('T_amountax').Asfloat;                j:=j+1;                table3.next;
                    progressbar1.position:=progressbar1.position+1;
                    progressbar1.refresh ;
                    end;
                    ExcelApp.Cells(recycle_length+2,1):='合计';
                    ExcelApp.Cells(recycle_length+2,6):=query4.Fields[1].Asfloat;
                    ExcelApp.Cells(recycle_length+2,9):=query4.Fields[2].Asfloat;                WorkBook.SaveAS(xlsFileName);                WorkBook.close;
                     ShowMessage('导入Excel成功!');
                    end
                   else
                   begin
                     with query4 do
                     begin
                     CommUtils.initialQuery(Query4,'select count(T_id),sum(T_taxable),sum(T_amountax) from tax'
                      +' where T_date = '+ #39+s_date+#39);
                     open;
                     recycle_length:=query4.Fields[0].AsInteger ;
                     end;                 with query5 do
                     begin
                     CommUtils.initialQuery(Query5,'select T_id,T_name,T_total,T_deduct,T_taxrate,T_quick, T_taxable,T_amountax from tax '
                      +'where T_date ='+ #39+s_date+#39+'order by T_id');
                     open;
                     end;                progressbar1.Max := recycle_length;
                    progressbar1.position:=0;
                    try
                     ExcelApp:= CreateOleObject( 'Excel.Application' );
                     WorkBook:=CreateOleobject('Excel.Sheet');
                    except
                     application.Messagebox('无法打开Xls文件,请确认已 经安装EXCEL.','',mb_OK+mb_IconStop);                 Exit;
                     end;
                    //workBook:= ExcelApp.workBooks.Open(ExtractFileDir(Application.ExeName)+'excel.xls');
                    WorkBook:=ExcelApp.workbooks.Add;
                    ExcelApp.Cells(1,1):='条数';
                    ExcelApp.Cells(1,2):='工号';                ExcelApp.Cells(1,3):='姓名';
                    ExcelApp.Cells(1,4):='人民币合计';
                    ExcelApp.Cells(1,5):='减除费用额';                ExcelApp.Cells(1,6):='应纳税所得税';
                    ExcelApp.Cells(1,7):='税率';
                    ExcelApp.Cells(1,8):='速算扣除数';
                    ExcelApp.Cells(1,9):='扣缴所得税额';                j:=1;
                    CommUtils.initialTable(table3,TBLNAME_TAX+'.dbf');
                    table3.Open;
                    table3.First;
                    for i:=2 to recycle_length+1 do
                    begin                ExcelApp.Cells(i,1):=j;
                    ExcelApp.Cells(i,2):=Query5.fieldbyname('T_id').Asstring;
                    ExcelApp.Cells(i,3):=Query5.fieldbyname('T_name').Asstring;
                    ExcelApp.Cells(i,4):=Query5.fieldbyname('T_total').Asfloat;
                    ExcelApp.Cells(i,5):=Query5.fieldbyname('T_deduct').Asfloat;                ExcelApp.Cells(i,6):=Query5.fieldbyname('T_taxable').Asstring;
                    ExcelApp.Cells(i,7):=FloatToStr(Query5.fieldbyname('T_taxrate').asFloat*100)+'%';
                    ExcelApp.Cells(i,8):=Query5.fieldbyname('T_quick').Asfloat;
                    ExcelApp.Cells(i,9):=Query5.fieldbyname('T_amountax').Asfloat;                j:=j+1;                query5.next;
                    progressbar1.position:=progressbar1.position+1;
                    progressbar1.refresh ;
                    end;
                    ExcelApp.Cells(recycle_length+2,1):='合计';
                    ExcelApp.Cells(recycle_length+2,6):=query4.Fields[1].Asfloat;
                    ExcelApp.Cells(recycle_length+2,9):=query4.Fields[2].Asfloat;                WorkBook.SaveAS(xlsFileName);                WorkBook.close;
                     ShowMessage('导入Excel成功!');               end;           end;end;
      

  3.   

    uses ComObj;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      MSExcel:Variant;
      i,j:integer;
    begin
      SaveDialog1.Filter:='*.XLS|*.XLS';
      SaveDialog1.DefaultExt:='XLS';
      if SaveDialog1.Execute then
      begin
        MsExcel:=createOLEobject('excel.application');
        MsExcel.workBooks.add;
        Msexcel.visible:=false;
        with DataSource1.Dataset  do
        begin
          first;
          for i:=0 to fieldcount-1 do
          begin
            Msexcel.cells[1,i+1].value:=fields[i].DisplayLabel ;
          end;
          j:=2;
          while not eof do
          begin
            for i:=0 to fieldcount-1 do
            begin
              Msexcel.cells[j,i+1].numberformat:='@';
              Msexcel.cells[j,i+1].value:=fields[i].AsString ;
            end;
            inc(j);
            next;
          end;
        end;
        MSExcel.ActiveWorkBook.SaveAs(SaveDialog1.FileName);
        MSExcel.ActiveWorkBook.Saved:=True;
        MSExcel.Quit;
      end;
    end;
      

  4.   

    谢谢大家帮忙!!特别感谢workers,pdbird,alinsoft