出现错误是:
执行到了下面的页面
然后写上名称,点击打印按钮 就报错了unit Unit6;interfaceuses
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.GetBook;
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.BookValid(ABookMark) then
aDataSet.GotoBook(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.
执行到了下面的页面
然后写上名称,点击打印按钮 就报错了unit Unit6;interfaceuses
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.GetBook;
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.BookValid(ABookMark) then
aDataSet.GotoBook(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.
解决方案 »
- 新手请问:怎样让一个Lable的text等于DBGrid(或者query)的某一列的值,就是说随着光标的移动,这个text也在变。
- 全方位的群招人
- 一个很简单的问题!望大侠们不吝赐教!谢谢!!!找到答案马上给分
- 今天东西被抢,郁闷中...
- 关于D7的Rave5中的TRvNDRWrite,TRvRenderPreview,那位有使用经验啊
- 比较菜的问题,请勿见笑!!
- fastreport专题
- 请问如何把ico文件转换成cur文件(用程序自动转换,而不是用工具)
- 易用不如vb,强大不如vc。不伦不类delphi真他妈的鸟!!!!!!!!!!!
- 大家再想想办法吧!谢谢。。
- delphi 使用vlc录像功能
- 紧急求助:佳博打印机,接的是网口,应该怎么开发啊????
使用保存的对话框做路径:
SaveDBGridEhToExportFile(TDBGridEhExportAsXLS,DBGridEh1,dlgSave1.FileName,True);如果还想实现其它导出方式,比如自定义格式什么的,我到时可以再给你写一个.