以前有很多这类帖子,找找呀。
你可以自己写程序,或者试一试Ehlib等第三方控件,转贴一篇例子给你:
interfaceuses Windows, SysUtils, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;type
TQRBRep1 = class(TQuickRep)
QRBand1: TQRBand;
detailBand1: TQRBand;
QRLabel1: TQRLabel;
QRGroup1: TQRGroup;
QRMemo1: TQRMemo;
procedure QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
private
public
end;var
QRBRep1: TQRBRep1;
QRLabel: array of array of TQRLabel;
QRShape: array of array of TQRShape;
xzjlst: integer;
implementationuses QRBank1, Unit1;{$R *.DFM}
procedure TQRBRep1.QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
i,j: integer;
begin{
SetLength(QRLabel,xzjlsn+2,8); //xzjlsn为全局变量,为要打印的StringGrid行数
SetLength(QRShape,xzjlsn+2,8);
} SetLength(QRLabel,22+1,8); // xzjlsn为StringGrid的行数,而此处应该是生成每页打印的行数,
SetLength(QRShape,22+1,8); // 应该是22行,另加一个标题行 xzjlst:=1; // xzjlst是StringGrid的当前打印行号 for j:=0 to 22 do // 见上
begin
for i:=0 to 7 do
begin
QRShape[j,i]:=TQRShape.Create(QRBRep1);
with QRShape[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=j*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel[j,i]:=TQRLabel.Create(QRBRep1);
with QRLabel[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92+2;
Top:=j*24+6;
Height:=16;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
{
******************
这里加入
if (j<>0) and ((j mod 22)=0) then
quickRep1.NewPage; //运行时出现非法调用错误
****************************
}
end;
QRLabel[0,0].Caption:='序号';
QRLabel[0,1].Caption:='帐号';
QRLabel[0,2].Caption:='销帐日期';
QRLabel[0,3].Caption:='话费月份';
QRLabel[0,4].Caption:='话费';
QRLabel[0,5].Caption:='上次余额';
QRLabel[0,6].Caption:='本次余额';
QRLabel[0,7].Caption:='滞纳金';
xzjlst:=1;
end;procedure TQRBRep1.QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
var
i,j: Integer;
begin
if xzjlst > xzjlsn then // xzjlsn为全局变量,为要打印的StringGrid行数
MoreData:=False
else
begin
MoreData:=True;
for j:=1 to 22 do // 同上
begin
for i:=0 to 7 do
begin
if xzjlst > xzjlsn then
QRLabel[j,i].Caption := ''
else
QRLabel[j,i].Caption:=QRBankForm.StringGrid1.Cells[i,xzjlst]; // 打印当前行对应的数据
end;
end;
Inc(xzjlst);
end;
end;
end;
end.
你可以自己写程序,或者试一试Ehlib等第三方控件,转贴一篇例子给你:
interfaceuses Windows, SysUtils, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;type
TQRBRep1 = class(TQuickRep)
QRBand1: TQRBand;
detailBand1: TQRBand;
QRLabel1: TQRLabel;
QRGroup1: TQRGroup;
QRMemo1: TQRMemo;
procedure QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
private
public
end;var
QRBRep1: TQRBRep1;
QRLabel: array of array of TQRLabel;
QRShape: array of array of TQRShape;
xzjlst: integer;
implementationuses QRBank1, Unit1;{$R *.DFM}
procedure TQRBRep1.QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
i,j: integer;
begin{
SetLength(QRLabel,xzjlsn+2,8); //xzjlsn为全局变量,为要打印的StringGrid行数
SetLength(QRShape,xzjlsn+2,8);
} SetLength(QRLabel,22+1,8); // xzjlsn为StringGrid的行数,而此处应该是生成每页打印的行数,
SetLength(QRShape,22+1,8); // 应该是22行,另加一个标题行 xzjlst:=1; // xzjlst是StringGrid的当前打印行号 for j:=0 to 22 do // 见上
begin
for i:=0 to 7 do
begin
QRShape[j,i]:=TQRShape.Create(QRBRep1);
with QRShape[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=j*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel[j,i]:=TQRLabel.Create(QRBRep1);
with QRLabel[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92+2;
Top:=j*24+6;
Height:=16;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
{
******************
这里加入
if (j<>0) and ((j mod 22)=0) then
quickRep1.NewPage; //运行时出现非法调用错误
****************************
}
end;
QRLabel[0,0].Caption:='序号';
QRLabel[0,1].Caption:='帐号';
QRLabel[0,2].Caption:='销帐日期';
QRLabel[0,3].Caption:='话费月份';
QRLabel[0,4].Caption:='话费';
QRLabel[0,5].Caption:='上次余额';
QRLabel[0,6].Caption:='本次余额';
QRLabel[0,7].Caption:='滞纳金';
xzjlst:=1;
end;procedure TQRBRep1.QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
var
i,j: Integer;
begin
if xzjlst > xzjlsn then // xzjlsn为全局变量,为要打印的StringGrid行数
MoreData:=False
else
begin
MoreData:=True;
for j:=1 to 22 do // 同上
begin
for i:=0 to 7 do
begin
if xzjlst > xzjlsn then
QRLabel[j,i].Caption := ''
else
QRLabel[j,i].Caption:=QRBankForm.StringGrid1.Cells[i,xzjlst]; // 打印当前行对应的数据
end;
end;
Inc(xzjlst);
end;
end;
end;
end.
大致的思路就是:
在detail band中,先放n(n等于你要显示的字段的个数)个TQRShape,并把shape,属性设置为tangle;
然后在TQRShape中放入你的TQRDBText,调整他们之间的位置,使TQRDBText位于QRShape的中间,对齐了QRShape,调整detailband的高度使得其高度和qrshape一致。然后就可以模拟出网格了。
不过这是一个非常精细的活,需要一定的耐心。
让各位见笑了。
把stringgrid的值全部添加到这个表里 with frmwsqkprn1.ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('delete from wspbqk1');
execsql;
close;
sql.Clear;
sql.Add('select * from wspbqk1');
open;
end;
with frmwsqkprn1.ADOQuery1 do
begin
for i:=1 to frmwsqkliul.StringGrid1.RowCount-1 do
begin
append;
fieldbyname('bianhao').asstring:=trim(stringgrid1.Cells[0,i]);
fieldbyname('pbtime').asstring:=trim(stringgrid1.Cells[1,i]);
fieldbyname('zdefen').asstring:=trim(stringgrid1.Cells[2,i]);
fieldbyname('mingci').asstring:=trim(stringgrid1.Cells[3,i]);
post;
end;
updatebatch;
first;
end;然后用这个表关联报表
搞定
你说这种是建立表好呢还是不的好?你说的方法我想过,根本就不行,
后来才换这种的,现在我已经把stringgrid中的内容导入到excel中
如果要求不高,可以了,但是我想能够不导入excel也能打印!
计算机学院
领队:XXXX
教练:XXXX
男运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
女运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
管理学院
领队:XXXX
教练:XXXX
男运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
女运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
不好意思,你试过了吗?
你看,这个表是存储的StringGrid里的内容,根本就不是按固定的字段格试走的,而表里边的字段名只是一个意义上的像征,也就是说,它有可能字段名是姓名,但是实际上存储的却是"管理学院"几个字,所以说,它一切都是以StringGrid服务的,而不是常规上的表;这和你导入Execl的区别是什么?是时间上的节约和资源上的节约,不过,你自己也可以自己新的方法;祝你成功,嗯,如果有好的方法,请给我说一声,谢谢;
[email protected]//不过,这种方法的确很麻烦,特别是在多次的导入;
我导入excel的原因是为了方便打印,我已经实现了上面的显示结果,
这种显示结果是满足要求的,现在就是打印的问题,直接打印stringgrid
的话,有点费劲,现在我还没有找到好的办法打印,所以就先导入
到excel,这个是为了打印而做的。由于我做的这个毕业设计是学校
要使用的一个系统,所以尽量不使用第三方控件!
你说不行就不行吧;但是想知道为什么不行?
我用这段程序N次了,你的提法信息是什么?我给你调式