出現錯誤是:

執行到了下面的頁面

然后寫上名稱,點擊列印按鈕 就報錯了
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,DB, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls;
type
TForm6 = class(TForm)
Button1: TButton;
Button2: TButton;
DBGrid1: TDBGrid;
SaveDialog1: TSaveDialog;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
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
{$R *.dfm}
uses Unit2,Unit3,Unit5;
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;
ShowMessage('1111111111111111111111');
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;
ShowMessage('2222222222222222222');
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;
ShowMessage('3333333333333333333333');
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;
procedure TForm6.Button1Click(Sender: TObject);
begin
DataModule2.ADOQuery1.Close;
DataModule2.ADOQuery1.SQL.Clear;
DataModule2.ADOQuery1.SQL.Add('select * from items');
DataModule2.ADOQuery1.Open;
if DataModule2.ADOQuery1.RecordCount<>0 then
begin
if SaveDialog1.Execute then
begin
ExportExcelFile(SaveDialog1.FileName,True,DataModule2.ADOQuery1.DataSource.DataSet);
end;
end;
end;
procedure TForm6.Button2Click(Sender: TObject);
begin
application.CreateForm(TForm5,Form5);
Form6.Free;
end;
end.
uj5u.com熱心網友回復:
單步除錯看看是哪個地方出錯。保存XLS,資料以英文的分號結尾,后綴名為*.xls,然后用excel打開,就可以了。uj5u.com熱心網友回復:
其實你可以直接用DBGRIDEH的表格控制元件,使用下面的陳述句,一句代碼就匯出來了,前提是先USES DBGridEhImpExp;使用保存的對話框做路徑:
SaveDBGridEhToExportFile(TDBGridEhExportAsXLS,DBGridEh1,dlgSave1.FileName,True);
如果還想實作其它匯出方式,比如自定義格式什么的,我到時可以再給你寫一個.
uj5u.com熱心網友回復:
這個最好先除錯一下啊uj5u.com熱心網友回復:

delphi2010版本的dbgrideh控制元件我在網上一直沒找到啊,全都是delphi7的,你要是有的話 麻煩給我個網址或者是發我郵箱都行,郵箱是[email protected],先謝謝了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118762.html
標籤:VCL組件開發及應用
