Delphi 用文件流的方式将客户端数据集写到EXCEL中去

最近有个需求,就是将客户端数据集导入到EXCEL中,当然很多控件都是用文件流的方式导出的,但格式很麻烦,所以需要自己写个函数,把数据导入到EXCEL中,然后再修改EXCEL的标题和结尾什么的。。所以就上网查了很多资料,这个函数写的很好,我就放到网上一起共享下。。



Var
arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
arXlsEnd: array[0..1] of Word = ($0A, 00);
arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);
arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);


Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);


implementation


Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
var
i,j: integer;
Col , row: word;
ABookMark: TBookMark;
aFileStream: TFileStream;
procedure incColRow; //增加行列号
begin
if Col = ADataSet.FieldCount - 1 then
      begin
         Inc(Row);
         Col :=0;
      end
else
        Inc(Col);
end;


procedure WriteStringCell(AValue: string);//写字符串数据
var
L: Word;
begin
   L := Length(AValue);
   arXlsString[1] := 8 + L;
   arXlsString[2] := Row;
   arXlsString[3] := Col;
   arXlsString[5] := L;
   aFileStream.WriteBuffer(arXlsString, SizeOf (arXlsString));
   aFileStream.WriteBuffer(Pointer(AValue)^, L);
   IncColRow;
end;


procedure WriteIntegerCell(AValue: integer);//写整数
var
V: Integer;
begin
arXlsInteger[2] := Row;
arXlsInteger[3] := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
IncColRow;
end;


procedure WriteFloatCell(AValue: double );//写浮点数
begin
   arXlsNumber[2] := Row;
   arXlsNumber[3] := Col;
   aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
   aFileStream.WriteBuffer(AValue, 8);
   IncColRow;
end;


begin
   if FileExists(FileName) then DeleteFile(FileName); //文件存在,先删除
      aFileStream := TFileStream.Create(FileName, fmCreate);
   Try    //写文件头  
      aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));   //写列头  
      Col := 0; Row := 0;
      if bWriteTitle then 
         begin 
            for i := 0 to aDataSet.FieldCount - 1 do
                WriteStringCell(aDataSet.Fields[i].FieldName);
         end;       //写数据集中的数据   
      aDataSet.DisableControls;
      ABookMark := aDataSet.GetBookmark;
      aDataSet.First ;


      while not aDataSet.Eof do
          begin
             for i := 0 to aDataSet.FieldCount - 1 do
               case ADataSet.Fields[i].DataType of
                    ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
                    WriteIntegerCell(aDataSet.Fields[i].AsInteger);
                    ftFloat, ftCurrency, ftBCD:
                    WriteFloatCell(aDataSet.Fields[i].AsFloat)
                else
                    WriteStringCell(aDataSet.Fields[i].AsString);
                end;
                aDataSet.Next;
           end;
          //写文件尾  
           AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
           if ADataSet.BookmarkValid(ABookMark) then aDataSet.GotoBookmark(ABookMark);
    Finally
         AFileStream.Free;
         ADataSet.EnableControls;
    end;
end;





以上是一个函数,现在只需要调用下就行了,


ExportExcelFile('huangx.xls',true,adoquery1);  
//'huangx.xls' 文件名,adoquery1数据集

一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean; const xlNormal=-4143; var y : integer; tsList : TStringList; s,filename :string; aSheet :Variant; excel :OleVariant; savedialog :tsavedialog; begin Result := true; try excel:=CreateOleObject('Excel.Application'); excel.workbooks.add; except //screen.cursor:=crDefault; showmessage('无法调用Excel!'); exit; end; savedialog:=tsavedialog.Create(nil); savedialog.FileName:=sfilename; //存入文件 savedialog.Filter:='Excel文件(*.xls)|*.xls'; if savedialog.Execute then begin if FileExists(savedialog.FileName) then try if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then DeleteFile(PChar(savedialog.FileName)) else begin Excel.Quit; savedialog.free; //screen.cursor:=crDefault; Exit; end; except Excel.Quit; savedialog.free; screen.cursor:=crDefault; Exit; end; filename:=savedialog.FileName; end; savedialog.free; if filename='' then begin result:=true; Excel.Quit; //screen.cursor:=crDefault; exit; end; aSheet:=excel.Worksheets.Item[1]; tsList:=TStringList.Create; //tsList.Add('查询结果'); //加入标题 s:=''; //加入字段名 for y := 0 to adoquery.fieldCount - 1 do begin s:=s+adoQuery.Fields.Fields[y].FieldName+#9 ; Application.ProcessMessages; end; tsList.Add(s); try try ADOQuery.First; While Not ADOQuery.Eof do begin s:=''; for y:=0 to ADOQuery.FieldCount-1 do begin s:=s+ADOQuery.Fields[y].AsString+#9; Application.ProcessMessages; end; tsList.Add(s); ADOQuery.next; end; Clipboard.AsText:=tsList.Text; except result:=false; end; finally tsList.Free; end; aSheet.Paste; 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值