小菜提问:这个单元怎么用阿?(150分)

  • 主题发起人 主题发起人 小師妹
  • 开始时间 开始时间

小師妹

Unregistered / Unconfirmed
GUEST, unregistred user!
前人写的一个数据导出到excel单元文件,感觉挺好,就是不知道怎么用它来导出数据。
请赐教。
unit eExport;

interface

uses Classes, SysUtils, DB, DBGrids;

type
{1 将数据源倒出 }
TExports = class(TObject)
private
FBookMark: TBookMark;
FCaption: string;
FCol: Word;
FDataSet: TDataSet;
FDBGrid: TDBGrid;
FFileStream: TFileStream;
FRow: Word;
protected
procedure incColRow;
procedure WriteFloatCell(AValue: double);
procedure WriteIntegerCell(AValue: integer);
procedure WriteStringCell(AValue: string);
public
procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean = True;
aDataSet: TDataSet = nil); overload;
procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean = True;
aDBgrid: TDBGrid = nil); overload;
procedure WriteCaption;
{1 标题 }
property Caption: string read FCaption write FCaption;
end;

var
DataSetExportExcel: TExports;

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);

implementation


{1 将数据源倒出 }
{1 将数据源倒出 }
{1 将数据源倒出 }
{1 将数据源倒出 }
{1 将数据源倒出 }
{1 将数据源倒出 }
{1 将数据源倒出 }
{
*********************************** TExports ***********************************
}
procedure TExports.ExportExcelFile(FileName: string; bWriteTitle: Boolean =
True; aDataSet: TDataSet = nil);
var
i: Integer;
begin
if Assigned(aDataSet) then
begin
FDataSet := aDataSet;
end;

if FileExists(FileName) then
DeleteFile(FileName); //文件存在,先删除
FFileStream := TFileStream.Create(FileName, fmCreate);
try
//写文件头
FFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
//写列头
FCol := 0;
FRow := 0;
WriteCaption();
if bWriteTitle then
begin
for i := 0 to FDataSet.FieldCount - 1 do
WriteStringCell(FDataSet.Fields.FieldName);
end;
//写数据集中的数据
FDataSet.DisableControls;
FBookMark := FDataSet.GetBookmark;
FDataSet.First;
while not FDataSet.Eof do
begin
for i := 0 to FDataSet.FieldCount - 1 do
begin
case FDataSet.Fields.DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(FDataSet.Fields.AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(FDataSet.Fields.AsFloat)
else
WriteStringCell(FDataSet.Fields.AsString);
end;
end;
FDataSet.Next;
end;
//写文件尾
FFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if FDataSet.BookmarkValid(FBookMark) then
begin
FDataSet.GotoBookmark(FBookMark);
end;
finally
FFileStream.Free;
FDataSet.EnableControls;
FDataSet := nil;
end;
end;

procedure TExports.ExportExcelFile(FileName: string; bWriteTitle: Boolean =
True; aDBgrid: TDBGrid = nil);
var
i: Integer;
begin
if Assigned(aDBgrid) then
begin
FDBGrid := aDBgrid;
end;

if FileExists(FileName) then
DeleteFile(FileName); //文件存在,先删除
FFileStream := TFileStream.Create(FileName, fmCreate);
try
//写文件头
FFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
//写列头
FCol := 0;
FRow := 0;
WriteCaption();
if bWriteTitle then
begin
for i := 0 to FDBGrid.FieldCount - 1 do
WriteStringCell(FDBGrid.Columns.Title.Caption);
end;
//写数据集中的数据
FDBGrid.DataSource.DataSet.DisableControls;
FBookMark := FDBGrid.DataSource.DataSet.GetBookmark;
FDBGrid.DataSource.DataSet.First;
while not FDBGrid.DataSource.DataSet.Eof do
begin
for i := 0 to FDBGrid.FieldCount - 1 do
begin
case FDBGrid.Fields.DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(FDBGrid.Fields.AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(FDBGrid.Fields.AsFloat)
else
WriteStringCell(FDBGrid.Fields.AsString);
end;
end;
FDBGrid.DataSource.DataSet.Next;
end;
//写文件尾
FFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if FDBGrid.DataSource.DataSet.BookmarkValid(FBookMark) then
begin
FDBGrid.DataSource.DataSet.GotoBookmark(FBookMark);
end;
finally
FFileStream.Free;
FDBGrid.DataSource.DataSet.EnableControls;
FDBGrid := nil;
end;
end;

{1 增加行列号 }
procedure TExports.incColRow;
var
FieldCount: Integer;
begin
if Assigned(FDataSet) then
begin
FieldCount := FDataSet.FieldCount - 1;
end;
if Assigned(FDBGrid) then
begin
FieldCount := FDBGrid.FieldCount - 1;
end;

if FCol = FieldCount then
begin
Inc(FRow);
FCol := 0;
end else
begin
Inc(FCol);
end;
end;

procedure TExports.WriteCaption;
begin
WriteStringCell(FCaption);
Inc(FRow);
FCol := 0;
end;

{1 写浮点数 }
procedure TExports.WriteFloatCell(AValue: double);
begin
arXlsNumber[2] := FRow;
arXlsNumber[3] := FCol;
FFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
FFileStream.WriteBuffer(AValue, 8);
IncColRow;
end;

{1 写整数 }
procedure TExports.WriteIntegerCell(AValue: integer);
var
V: Integer;
begin
arXlsInteger[2] := FRow;
arXlsInteger[3] := FCol;
FFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
FFileStream.WriteBuffer(V, 4);
IncColRow;
end;

{1 写字符串数据 }
procedure TExports.WriteStringCell(AValue: string);
var
L: Word;
begin
L := Length(AValue);
arXlsString[1] := 8 + L;
arXlsString[2] := FRow;
arXlsString[3] := FCol;
arXlsString[5] := L;
FFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
FFileStream.WriteBuffer(Pointer(AValue)^, L);
IncColRow;
end;

initialization
if not Assigned(DataSetExportExcel) then
begin
DataSetExportExcel := TExports.Create;
end;

finalization
if Assigned(DataSetExportExcel) then
begin
DataSetExportExcel.Free;
end;

end.
 
引用這個單元,然後創建TExports對象,調用ExportExcelFile方法導出不就可以了嗎?
 
刚才我就是这么用的,不行。
仔细检查了下,原来少了个参数。[:(!][:(!][:(!]

看把我着急的。。。

谢谢!
 
多人接受答案了。
 
后退
顶部