试一下这个: procedure TDBGrid.ExportExcel(VFileName:string); //导出数据 function SaveAsExcelFile(AFileName: string): Boolean; procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string); var L: Word; const {$J+} CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); {$J-} begin L := Length(AValue); CXlsLabel[1] := 8 + L; CXlsLabel[2] := ARow; CXlsLabel[3] := ACol; CXlsLabel[5] := L; XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); XlsStream.WriteBuffer(Pointer(AValue)^, L); end; const {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); var FStream: TFileStream; I, J: Integer; begin Result := False; FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to ColCount - 1 do for j := 0 to RowCount - 1 do XlsWriteCellLabel(FStream, I, J, cells[i, j]); FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end;var SaveDialog:TSaveDialog; begin SaveDialog:=TSaveDialog.Create(Application); SaveDialog.Filter:= 'Excel文件格式|.xls'; if trim(VFileName)='' then VFileName:=FormatDateTime('yy年mm月dd日hh时nn分',now)+FTitle+'.xls'; SaveDialog.FileName:=VFileName; try IF SaveDialog.Execute THEN BEGIN if UpperCase(TRIM(COPY(SaveDialog.FileName,Length(SaveDialog.FileName)-3,Length(SaveDialog.FileName))))<>'.XLS' THEN SaveDialog.FileName:=SaveDialog.FileName+'.xls'; if SaveAsExcelFile(SaveDialog.FileName) then showmessage(SaveDialog.FileName+'导出数据成功!') else showmessage(SaveDialog.FileName+'导出数据失败,请重试!'); END; finally SaveDialog.Free; end; end;
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add[Trim(ExtractFilePath(Application.ExeName))+'1.xls'];//无格式 方法1
//XLApp.WorkBooks.Add[Trim(ExtractFilePath(Application.ExeName))+'格式.xls']; //根据格式 方法2
XLApp.WorkBooks[1].WorkSheets[1].Name := 'sheet1';
Sheet := XLApp.Workbooks[1].WorkSheets['sheet1'];
if not Target.DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;
Target.DataSource.DataSet.first;for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
end;jCount := 1;
while not Target.DataSource.DataSet.Eof do
begin for iCount := 0 to Target.Columns.Count - 1 do //
begin
if iCount = 0 then
Sheet.cells[jCount + 1, iCount + 1] := IntToStr(jCount)
else
Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
end;
Inc(jCount);
Target.DataSource.DataSet.Next;
end;方法2要比方法1慢很多很多
这样的控件有很多,比如XLSReadWriteII ,DVExport等~~
就是倒出至文本文件,将文本文件的后缀保存成XLS。
procedure TDBGrid.ExportExcel(VFileName:string); //导出数据
function SaveAsExcelFile(AFileName: string): Boolean;
procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
const
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
CXlsEof: array[0..1] of Word = ($0A, 00);
var
FStream: TFileStream;
I, J: Integer;
begin
Result := False;
FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
try
CXlsBof[4] := 0;
FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
for i := 0 to ColCount - 1 do
for j := 0 to RowCount - 1 do
XlsWriteCellLabel(FStream, I, J, cells[i, j]);
FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
Result := True;
finally
FStream.Free;
end;
end;var SaveDialog:TSaveDialog;
begin
SaveDialog:=TSaveDialog.Create(Application);
SaveDialog.Filter:= 'Excel文件格式|.xls'; if trim(VFileName)='' then VFileName:=FormatDateTime('yy年mm月dd日hh时nn分',now)+FTitle+'.xls';
SaveDialog.FileName:=VFileName;
try
IF SaveDialog.Execute THEN
BEGIN
if UpperCase(TRIM(COPY(SaveDialog.FileName,Length(SaveDialog.FileName)-3,Length(SaveDialog.FileName))))<>'.XLS' THEN
SaveDialog.FileName:=SaveDialog.FileName+'.xls';
if SaveAsExcelFile(SaveDialog.FileName) then
showmessage(SaveDialog.FileName+'导出数据成功!')
else
showmessage(SaveDialog.FileName+'导出数据失败,请重试!');
END;
finally
SaveDialog.Free;
end;
end;
试试formulone控件试试,设计好界面,赋值,然后保存成excel文件就可以了