ToExcel.pas
Upload User: sqdhmy
Upload Date: 2022-05-16
Package Size: 2930k
Code Size: 4k
Category:

Graph program

Development Platform:

Delphi

  1. {
  2.    功能:将数据集的数据导入Excel;
  3.    用法:With TDS2Excel.Create(TDataSet(ADOQuery1)) do
  4.          Try
  5.            Save2File(SaveDialog1.FileName, True);
  6.          finally
  7.            Free;
  8.          end;
  9.    作者:Caidao (核心代码来自Ehlib)
  10.    时间:2003-04-09
  11.    地点:汕头
  12. }    
  13. unit ToExcel;
  14. interface
  15. Uses
  16.  DB, Classes;
  17. var
  18.  CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
  19.  CXlsEof: array[0..1] of Word = ($0A, 00);
  20.  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
  21.  CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
  22.  CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
  23.  CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
  24. Type
  25.  TDS2Excel = Class(TObject)
  26.  Private
  27.    FCol: word;
  28.    FRow: word;
  29.    FDataSet: TDataSet;
  30.    Stream: TStream;
  31.    FWillWriteHead: boolean;
  32.    FBookMark: TBookmark;
  33.    procedure IncColRow;
  34.    procedure WriteBlankCell;
  35.    procedure WriteFloatCell(const AValue: Double);
  36.    procedure WriteIntegerCell(const AValue: Integer);
  37.    procedure WriteStringCell(const AValue: string);
  38.    procedure WritePrefix;
  39.    procedure WriteSuffix;
  40.    procedure WriteTitle;
  41.    procedure WriteDataCell;
  42.    procedure Save2Stream(aStream: TStream);
  43.  Public
  44.    procedure Save2File(FileName: string; WillWriteHead: Boolean);
  45.    Constructor Create(aDataSet: TDataSet);
  46.  end;
  47. implementation
  48. uses SysUtils;
  49. Constructor TDS2Excel.Create(aDataSet: TDataSet);
  50. begin
  51.  inherited Create;
  52.  FDataSet := aDataSet;
  53. end;
  54. procedure TDS2Excel.IncColRow;
  55. begin
  56.  if FCol = FDataSet.FieldCount - 1 then
  57.  begin
  58.    Inc(FRow);
  59.    FCol :=0;
  60.  end
  61.  else
  62.    Inc(FCol);
  63. end;
  64. procedure TDS2Excel.WriteBlankCell;
  65. begin
  66.  CXlsBlank[2] := FRow;
  67.  CXlsBlank[3] := FCol;
  68.  Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
  69.  IncColRow;
  70. end;
  71. procedure TDS2Excel.WriteFloatCell(const AValue: Double);
  72. begin
  73.  CXlsNumber[2] := FRow;
  74.  CXlsNumber[3] := FCol;
  75.  Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
  76.  Stream.WriteBuffer(AValue, 8);
  77.  IncColRow;
  78. end;
  79. procedure TDS2Excel.WriteIntegerCell(const AValue: Integer);
  80. var
  81.  V: Integer;
  82. begin
  83.  CXlsRk[2] := FRow;
  84.  CXlsRk[3] := FCol;
  85.  Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
  86.  V := (AValue shl 2) or 2;
  87.  Stream.WriteBuffer(V, 4);
  88.  IncColRow;
  89. end;
  90. procedure TDS2Excel.WriteStringCell(const AValue: string);
  91. var
  92.  L: Word;
  93. begin
  94.  L := Length(AValue);
  95.  CXlsLabel[1] := 8 + L;
  96.  CXlsLabel[2] := FRow;
  97.  CXlsLabel[3] := FCol;
  98.  CXlsLabel[5] := L;
  99.  Stream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
  100.  Stream.WriteBuffer(Pointer(AValue)^, L);
  101.  IncColRow;
  102. end;
  103. procedure TDS2Excel.WritePrefix;
  104. begin
  105.  Stream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
  106. end;
  107. procedure TDS2Excel.WriteSuffix;
  108. begin
  109.  Stream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
  110. end;
  111. procedure TDS2Excel.WriteTitle;
  112. var
  113.  n: word;
  114. begin
  115.  for n := 0 to FDataSet.FieldCount - 1 do
  116.    WriteStringCell(FDataSet.Fields[n].FieldName);
  117. end;
  118. procedure TDS2Excel.WriteDataCell;
  119. var
  120.  n: word;
  121. begin
  122.  WritePrefix;
  123.  if FWillWriteHead then WriteTitle;
  124.  FDataSet.DisableControls;
  125.  FBookMark := FDataSet.GetBookmark;
  126.  FDataSet.First;
  127.  while not FDataSet.Eof do
  128.  begin
  129.    for n := 0 to FDataSet.FieldCount - 1 do
  130.    begin
  131.      if FDataSet.Fields[n].IsNull then
  132.        WriteBlankCell
  133.      else begin
  134.        case FDataSet.Fields[n].DataType of
  135.          ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
  136.              WriteIntegerCell(FDataSet.Fields[n].AsInteger);
  137.          ftFloat, ftCurrency, ftBCD:
  138.              WriteFloatCell(FDataSet.Fields[n].AsFloat);
  139.        else
  140.          WriteStringCell(FDataSet.Fields[n].AsString);
  141.        end;
  142.      end;
  143.    end;
  144.    FDataSet.Next;
  145.  end;
  146.  WriteSuffix;
  147.  if FDataSet.BookmarkValid(FBookMark) then FDataSet.GotoBookmark(FBookMark);
  148.  FDataSet.EnableControls;
  149. end;
  150. procedure TDS2Excel.Save2Stream(aStream: TStream);
  151. begin
  152.  FCol := 0;
  153.  FRow := 0;
  154.  Stream := aStream;
  155.  WriteDataCell;
  156. end;
  157. procedure TDS2Excel.Save2File(FileName: string; WillWriteHead: Boolean);
  158. var
  159.  aFileStream: TFileStream;
  160. begin
  161.  FWillWriteHead := WillWriteHead;
  162.  if FileExists(FileName) then DeleteFile(FileName);
  163.  aFileStream := TFileStream.Create(FileName, fmCreate);
  164.  Try
  165.    Save2Stream(aFileStream);
  166.  Finally
  167.    aFileStream.Free;
  168.  end;
  169. end;
  170. end.
  171.