delphi 将Query的结果导出到Excel

目标:将Query的查询结果输出到Excel

interface

uses
ComObj, DB;

var
    function DataSetToExcel(DataSet:TDataSet;FieldTagMax:Integer;Visible:Boolean;ExcelFileName:String=''): Boolean;
    function DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;

function DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
var
  Row,Col,FieldIndex :Integer;
  BK:TBookMark;
  //StrCell:string;
  //FFieldNames : TStrings;
begin 
     Result := False;
     if not Dataset.Active then exit;
       BK:=DataSet.GetBookMark;
       DataSet.DisableControls;

       Sheet.Activate;

     try
     //  FFieldNames:=TStringList.Create;
     //  FFieldNames.clear;
       // 列标题
       Row:=1;
       Col:=1;
       for FieldIndex:=0 to DataSet.FieldCount-1 do
         begin
           if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
           begin
              Sheet.Cells[Row,Col] :=DataSet.Fields[FieldIndex].DisplayLabel;
         //     FFieldNames.Add(dataset.Fields[fieldindex].FieldName);
              Inc(Col);
           end;
         end;
      // 表内容
       DataSet.First;
       while Not DataSet.Eof do
       begin
          Row:=Row+1;
          Col:=1;
          for FieldIndex:=0 to DataSet.FieldCount-1 do
            begin
               if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
                begin
                 if dataset.fields[fieldindex].DataType= ftfloat then
                  Sheet.Cells[Row,Col]:=DataSet.Fields[FieldIndex].asstring
                 else
                 // sheet.cells(row,col):=''''+dataset.fields[fieldindex].Asstring;
                //  sheet.Range(row,col).value:= dataset.fields[fieldindex].asstring;
                  begin
                    //StrCell:=GetColumnCharacters(col)+IntToStr(Row);
                    //sheet.range[strcell,strcell].value:=dataset.FieldByName(FFieldNames[fieldindex]).asstring ;//dataset.fields[fieldindex].asstring;
                    sheet.cells[row,col].numberformat:='@';
                    sheet.cells[row,col]:=dataset.fields[fieldindex].Asstring;
                  end;
                 Inc(Col);
                end;
            end;
          DataSet.Next;
       end;

        Result := True;
     finally
       DataSet.GotoBookMark(BK);
       //FFieldNames.free;
       DataSet.EnableControls;
     end;
end;

function DataSetToExcel(
DataSet:TDataSet;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
var
  ExcelObj, Excel, WorkBook, Sheet: OleVariant;
  OldCursor:TCursor;
  SaveDialog:TSaveDialog;
begin
   Result := False;
   if not Dataset.Active then exit;

   OldCursor:=Screen.Cursor;
   Screen.Cursor:=crHourGlass;

   try
     ExcelObj := CreateOleObject('Excel.Sheet');
     Excel := ExcelObj.Application;
     Excel.Visible := Visible ;
     WorkBook := Excel.Workbooks.Add ;
     Sheet:= WorkBook.Sheets[1];
   except
       MessageBox(GetActiveWindow,'无法调用Mircorsoft Excel! '+chr(13)+chr(10)+
       '请检查是否安装了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
       Screen.Cursor:=OldCursor;
       Exit;
   end;

   Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
   if Result then
      if Not Visible then
       begin
           if ExcelFileName<>'' then
              WorkBook.SaveAs(FileName:=ExcelFileName)
           else
           begin
            SaveDialog:=TSaveDialog.Create(Nil);
            SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
            Result:=SaveDialog.Execute;
            UpdateWindow(GetActiveWindow);
            if Result then
              WorkBook.SaveAs(FileName:=SaveDialog.FileName);
              SaveDialog.Free;
           end;
          Excel.Quit;
       end;
   Screen.Cursor:=OldCursor;
end;

按钮动作:
 if Application.MessageBox('要导出为Excel文件吗?', '提示', MB_YESNO + 
    MB_ICONQUESTION) = IDYES then
    begin
      DataSetToExcel(dm.qry1,1,false,'');
      Application.MessageBox('恭喜,导出成功!', '提示', MB_OK +
      MB_ICONINFORMATION);
    end
 else
    Exit;


使用方便,功能强大。 type FileCheckResult = (fcrNotExistend,fcrNotXSLFile,fcrValidXSL); //文件不存在,不是XSL文件,合法的XSL文件 TOLEExcel = class(TComponent) private FExcelCreated: Boolean; FVisible: Boolean; FExcel: Variant; //Excel程序对象 FWorkBook: Variant; //Excel工作簿对象 FWorkSheet: Variant; //Excel工作簿 工作表对象 FCellFont: TFont; //单元格字体对象 FTitleFont: TFont; // FFontChanged: Boolean; FIgnoreFont: Boolean; FFileName: TFileName; //********************************************自己添加*****************************// FCreateFromFile:Boolean; //指示是否打开已有文件 FExcelCaption:string; //用程序打开Excel的窗体标 //*********************************来自U_Report*****************************// FRCPrePage:Integer; //每页显示的记录数 FMax:Integer; //最大的数组个数 procedure SetExcelCellFont(var Cell: Variant); procedure SetExcelTitleFont(var Cell: Variant); procedure GetTableColumnName(const Table: TTable; var Cell: Variant); procedure GetQueryColumnName(const Query: TQuery; var Cell: Variant); procedure GetFixedCols(const StringGrid: TStringGrid; var Cell: Variant); procedure GetFixedRows(const StringGrid: TStringGrid; var Cell: Variant); procedure GetStringGridBody(const StringGrid: TStringGrid; var Cell: Variant); protected procedure SetCellFont(NewFont: TFont); procedure SetTitleFont(NewFont: TFont); procedure SetVisible(DoShow: Boolean); function GetCell( ARow,ACol: Integer): string; procedure SetCell(ACol, ARow: Integer; const Value: string); function GetDateCell(ACol, ARow: Integer): TDateTime; procedure SetDateCell(ACol, ARow: Integer; const Value: TDateTime); //*********************************************自己添加************************************// procedure SetCaption(ACaption:string);//设置打开文件后,Excel主程序的窗体标题 function GetCapiton:string;//返回打开文件后,Excel主程序的窗体标题 public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值