uExportXls.pas(使用二进制流技术快速导出Excel文件)
2010-07-24 20:37
423 查看
{ 功能:将数据集的数据导入Excel;
用法1:With ExportXls.Create(TDataSet(ADOQuery1)) do
Try
Save2File(SaveDialog1.FileName, True);
finally
Free;
end;
用法2:procedure TForm1.Button4Click(Sender: TObject);
var ex:ExportXls;
begin
ex:=ExportXls.Create(ADOQ);
if SaveDialog1.Execute then ex.Save2File(SaveDialog1.FileName,TRUE);
end;
}
unit uExportXls;
interface
uses
DB, Classes;
var
CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
CXlsEof: array[0..1] of Word = ($0A, 0);
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
type
TFldRec = record
Title: string;
Width: Integer;
end;
ExportXls = class(TObject)
private
FCol: word;
FRow: word;
FDataSet: TDataSet;
Stream: TStream;
FWillWriteHead: boolean;
FBookMark: TBookmark;
procedure IncColRow;
procedure WriteBlankCell;
procedure WriteFloatCell(const AValue: Double);
procedure WriteIntegerCell(const AValue: Integer);
procedure WriteStringCell(const AValue: string);
procedure WritePrefix;
procedure WriteSuffix;
procedure WriteTitle;
procedure WriteDataCell;
procedure Save2Stream(aStream: TStream);
public
procedure Save2File(FileName: string; WillWriteHead: Boolean);
constructor Create(aDataSet: TDataSet);
end;
function ExportToXLS(const FileName: string; DataSet: TDataSet): Boolean; //导出EXCEL
implementation
uses SysUtils;
function ExportToXLS(const FileName: string; DataSet: TDataSet): Boolean; //导出EXCEL
begin
Result := False;
with ExportXls.Create(DataSet) do try
Save2File(FileName, True);
Result := True;
finally
Free;
end;
end;
constructor ExportXls.Create(aDataSet: TDataSet);
begin
inherited Create;
FDataSet := aDataSet;
end;
procedure ExportXls.IncColRow;
begin
if FCol = FDataSet.FieldCount - 1 then begin
Inc(FRow);
FCol := 0;
end
else
Inc(FCol);
end;
procedure ExportXls.WriteBlankCell;
begin
CXlsBlank[2] := FRow;
CXlsBlank[3] := FCol;
Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
IncColRow;
end;
procedure ExportXls.WriteFloatCell(const AValue: Double);
begin
CXlsNumber[2] := FRow;
CXlsNumber[3] := FCol;
Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
Stream.WriteBuffer(AValue, 8);
IncColRow;
end;
procedure ExportXls.WriteIntegerCell(const AValue: Integer);
var
V: Integer;
begin
CXlsRk[2] := FRow;
CXlsRk[3] := FCol;
Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
V := (AValue shl 2) or 2;
Stream.WriteBuffer(V, 4);
IncColRow;
end;
procedure ExportXls.WriteStringCell(const AValue: string);
var
L: Word;
str:Ansistring;
begin
str:=Ansistring(AValue);//强制转换,防止字符乱码,这是中文字符导出最关键的地方
L := Length(str);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L;
Stream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
Stream.WriteBuffer(Pointer(str)^, L);
IncColRow;
end;
procedure ExportXls.WritePrefix;
begin
Stream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;
procedure ExportXls.WriteSuffix;
begin
Stream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;
procedure ExportXls.WriteTitle;
var
n: word;
begin
for n := 0 to FDataSet.FieldCount - 1 do
WriteStringCell(FDataSet.Fields
.DisplayLabel); //显示标签名
end;
procedure ExportXls.WriteDataCell;
var
Idx: word;
begin
WritePrefix;
if FWillWriteHead then WriteTitle;
FDataSet.DisableControls;
FBookMark := FDataSet.GetBookmark;
FDataSet.First;
while not FDataSet.Eof do begin
for Idx := 0 to FDataSet.FieldCount - 1 do begin
if FDataSet.Fields[Idx].IsNull then
WriteBlankCell
else begin
case FDataSet.Fields[Idx].DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(FDataSet.Fields[Idx].AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(FDataSet.Fields[Idx].AsFloat);
else
if Assigned(FDataSet.Fields[Idx].OnGetText) then
WriteStringCell(FDataSet.Fields[Idx].Text)
else
WriteStringCell(FDataSet.Fields[Idx].AsString);
end;
end;
end;
FDataSet.Next;
end;
WriteSuffix;
if FDataSet.BookmarkValid(FBookMark) then FDataSet.GotoBookmark(FBookMark);
FDataSet.EnableControls;
end;
procedure ExportXls.Save2Stream(aStream: TStream);
begin
FCol := 0;
FRow := 0;
Stream := aStream;
WriteDataCell;
end;
procedure ExportXls.Save2File(FileName: string; WillWriteHead: Boolean);
var
aFileStream: TFileStream;
begin
FWillWriteHead := WillWriteHead;
if FileExists(FileName) then DeleteFile(FileName);
aFileStream := TFileStream.Create(FileName, fmCreate);
try
Save2Stream(aFileStream);
finally
aFileStream.Free;
end;
end;
end.
用法1:With ExportXls.Create(TDataSet(ADOQuery1)) do
Try
Save2File(SaveDialog1.FileName, True);
finally
Free;
end;
用法2:procedure TForm1.Button4Click(Sender: TObject);
var ex:ExportXls;
begin
ex:=ExportXls.Create(ADOQ);
if SaveDialog1.Execute then ex.Save2File(SaveDialog1.FileName,TRUE);
end;
}
unit uExportXls;
interface
uses
DB, Classes;
var
CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
CXlsEof: array[0..1] of Word = ($0A, 0);
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);
type
TFldRec = record
Title: string;
Width: Integer;
end;
ExportXls = class(TObject)
private
FCol: word;
FRow: word;
FDataSet: TDataSet;
Stream: TStream;
FWillWriteHead: boolean;
FBookMark: TBookmark;
procedure IncColRow;
procedure WriteBlankCell;
procedure WriteFloatCell(const AValue: Double);
procedure WriteIntegerCell(const AValue: Integer);
procedure WriteStringCell(const AValue: string);
procedure WritePrefix;
procedure WriteSuffix;
procedure WriteTitle;
procedure WriteDataCell;
procedure Save2Stream(aStream: TStream);
public
procedure Save2File(FileName: string; WillWriteHead: Boolean);
constructor Create(aDataSet: TDataSet);
end;
function ExportToXLS(const FileName: string; DataSet: TDataSet): Boolean; //导出EXCEL
implementation
uses SysUtils;
function ExportToXLS(const FileName: string; DataSet: TDataSet): Boolean; //导出EXCEL
begin
Result := False;
with ExportXls.Create(DataSet) do try
Save2File(FileName, True);
Result := True;
finally
Free;
end;
end;
constructor ExportXls.Create(aDataSet: TDataSet);
begin
inherited Create;
FDataSet := aDataSet;
end;
procedure ExportXls.IncColRow;
begin
if FCol = FDataSet.FieldCount - 1 then begin
Inc(FRow);
FCol := 0;
end
else
Inc(FCol);
end;
procedure ExportXls.WriteBlankCell;
begin
CXlsBlank[2] := FRow;
CXlsBlank[3] := FCol;
Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
IncColRow;
end;
procedure ExportXls.WriteFloatCell(const AValue: Double);
begin
CXlsNumber[2] := FRow;
CXlsNumber[3] := FCol;
Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
Stream.WriteBuffer(AValue, 8);
IncColRow;
end;
procedure ExportXls.WriteIntegerCell(const AValue: Integer);
var
V: Integer;
begin
CXlsRk[2] := FRow;
CXlsRk[3] := FCol;
Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
V := (AValue shl 2) or 2;
Stream.WriteBuffer(V, 4);
IncColRow;
end;
procedure ExportXls.WriteStringCell(const AValue: string);
var
L: Word;
str:Ansistring;
begin
str:=Ansistring(AValue);//强制转换,防止字符乱码,这是中文字符导出最关键的地方
L := Length(str);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L;
Stream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
Stream.WriteBuffer(Pointer(str)^, L);
IncColRow;
end;
procedure ExportXls.WritePrefix;
begin
Stream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;
procedure ExportXls.WriteSuffix;
begin
Stream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;
procedure ExportXls.WriteTitle;
var
n: word;
begin
for n := 0 to FDataSet.FieldCount - 1 do
WriteStringCell(FDataSet.Fields
.DisplayLabel); //显示标签名
end;
procedure ExportXls.WriteDataCell;
var
Idx: word;
begin
WritePrefix;
if FWillWriteHead then WriteTitle;
FDataSet.DisableControls;
FBookMark := FDataSet.GetBookmark;
FDataSet.First;
while not FDataSet.Eof do begin
for Idx := 0 to FDataSet.FieldCount - 1 do begin
if FDataSet.Fields[Idx].IsNull then
WriteBlankCell
else begin
case FDataSet.Fields[Idx].DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(FDataSet.Fields[Idx].AsInteger);
ftFloat, ftCurrency, ftBCD:
WriteFloatCell(FDataSet.Fields[Idx].AsFloat);
else
if Assigned(FDataSet.Fields[Idx].OnGetText) then
WriteStringCell(FDataSet.Fields[Idx].Text)
else
WriteStringCell(FDataSet.Fields[Idx].AsString);
end;
end;
end;
FDataSet.Next;
end;
WriteSuffix;
if FDataSet.BookmarkValid(FBookMark) then FDataSet.GotoBookmark(FBookMark);
FDataSet.EnableControls;
end;
procedure ExportXls.Save2Stream(aStream: TStream);
begin
FCol := 0;
FRow := 0;
Stream := aStream;
WriteDataCell;
end;
procedure ExportXls.Save2File(FileName: string; WillWriteHead: Boolean);
var
aFileStream: TFileStream;
begin
FWillWriteHead := WillWriteHead;
if FileExists(FileName) then DeleteFile(FileName);
aFileStream := TFileStream.Create(FileName, fmCreate);
try
Save2Stream(aFileStream);
finally
aFileStream.Free;
end;
end;
end.
相关文章推荐
- winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中
- Motion Lite:由 Microsoft Motion 使用的业务体系结构技术的快速应用
- 使用xPath技术快速获取指定节点并对其修改--(xPath技术基础)
- php 使用table方式导出excel文件
- 导出数据库数据到excel表中(使用POI技术)
- 使用Apache POI导出Excel小结--导出XLS格式文档
- Delphi下实现全屏快速找图找色 四、BitmapData.pas的使用
- WebService从零到项目开发使用5—技术研究之JAX-WS快速入门
- 使用POI将数据导出到Excel文件
- Spire.XLS使用教程:如何将数据导出到WPF的Excel中
- 使用linux的lvm快照技术快速部署虚拟机(一)创建lvm
- 在使用中文名导出数据到excel文件时文件名出现乱码的解决办法
- 使用POI导出xls和xlsx格式要注意的问题
- 使用NPOI完成导出Excel文件
- ASP.NET中使用开源组件NPOI快速导入导出Execl数据
- 使用HTML,CSS快速导出数据到Excel数据格式化问题
- 记 springmvc使用POI,快速实现Excel导入导出
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- CI框架中使用PHPExcel导出Excel文件
- 使用jxls2.X导出excel文件