📄 pub.pas
字号:
unit pub;
interface
uses windows,messages,sysutils,classes,graphics,controls,forms,dialogs,
extctrls,stdctrls,comctrls,dbctrls,buttons,grids,dbgrids,
db ,dbtables,printers,comobj,wait_cx;
const
xlWBATWorksheet = -4167;
PROCEDURE PUB_INSET_EXCEL(DataSet: TDataSet;dbgrid1 :Tdbgrid);
procedure PrintStringGrid(StrGrid: TStringGrid; FX: STRING);
procedure print_dbgrid(datasource1 :Tdatasource;dbgrid1 :Tdbgrid;FX :STRING) ;
implementation
var
XLApp: Variant;
PROCEDURE PUB_INSET_EXCEL(DataSet: TDataSet;dbgrid1 :Tdbgrid);
var
i,j: Integer;
Sheet,ColumnRange: Variant;
begin
try
wiat_tsForm :=Twiat_tsForm.create(application);
wiat_tsForm.show;
wiat_tsForm.UPDATE;
wiat_tsForm.Label7.caption :='正在处理数据,共有'+inttostr(dataset.RecordCount)+'用户数据,请稍后...';
wiat_tsForm.ProgressBar1.Visible :=true;
wiat_tsForm.Label6.Visible :=true;
wiat_tsForm.Animate1.Visible :=false;
wiat_tsForm.Animate2.Visible :=true;
wiat_tsForm.Animate2.BringToFront ;
wiat_tsForm.update;
XLApp:= CreateOleObject('Excel.Application');
XLApp.Workbooks.Add(xlWBatWorkSheet);
XLApp.Workbooks[1].WorkSheets[1].Name := 'jlbtj';
Sheet := XLApp.Workbooks[1].WorkSheets['jlbtj'];
ColumnRange := XLApp.Workbooks[1].WorkSheets['jlbtj'].Columns;
dataset.First ;
for i :=1 to dbgrid1.Columns.Count do
Sheet.Cells[1, i] :=dbgrid1.Columns[i-1].Title.Caption ;
wiat_tsForm.ProgressBar1.Min :=0;
wiat_tsForm.ProgressBar1.Max :=dataset.RecordCount+1;
wiat_tsForm.ProgressBar1.Step := 1;
for i := 2 to dataset.RecordCount+1 do
begin
wiat_tsForm.update;
wiat_tsForm.label6.caption :=inttostr(round(i*100/dataset.RecordCount))+'%';
wiat_tsForm.ProgressBar1.StepIt ;
for j:=1 to dbgrid1.Columns.Count do
begin
Sheet.Cells[i, j] := DBGrid1.Fields[j-1].asstring;
end;
dataset.Next ;
end;
finally
wiat_tsForm.close;wiat_tsForm.Free;
XLApp.Visible := True;
end;
END;
procedure PrintStringGrid(StrGrid: TStringGrid;FX: STRING);
const
LeftBlank=1; //定义页边距,单位厘米
RightBlank=1;
TopBlank=1;
BottomBlank=1;
var
PointX,PointY:integer;
PointScale,PrintStep:integer;
s:string;
x,y,W:integer;
i:integer;
Device:Array[0..cchDeviceName-1] of Char;
Driver:Array[0..(MAX_PATH-1)] of Char;
Port:Array[0..32] of Char;
hDMode:THandle;
pDMode:PDevMode;
begin //获取当前打印机的分辨率
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode<>0 then
begin
pDMode:=GlobalLock(hDMode);
if pDMode<>nil then
begin
pDMode^.dmPaperSize:=DMPAPER_A4;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
GlobalUnLock(hDMode);
end;
end;
PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/Screen.PixelsPerInch+0.5); //横向打印
IF FX='HX' THEN
printer.Orientation:=poPortrait//Portrait;//poLandscape;
ELSE
printer.Orientation:=poLandscape;//Portrait;//poLandscape;
//打印的字体和大小
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=12;
//根据字体的大小确定每行的高度
s:=application.Title ;
PrintStep:=printer.canvas.TextHeight(s)+16;
//打印的起点位置
x:=PointX*LeftBlank;
y:=PointY*TopBlank;
//DataSource1是DBGrid1所连接的数据源
// if ((DataSource1.DataSet).Active=true) and ((DataSource1.DataSet).RecordCount>0) then
begin
printer.BeginDoc;
// (DataSource1.DataSet).First;
// while not (DataSource1.DataSet).Eof do
FOR W :=0 TO StrGrid.rowcount -1 DO
begin //打印DBGrid中的所有列
for i:=0 to StrGrid.colcount-1 do
begin
//假如所要打印的列超出了打印范围,则忽略该列
if (x+StrGrid.ColWidths[I]*PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
begin //画表格线
//每页的第一行打印表头
Printer.Canvas.Rectangle(x,y,x+StrGrid.ColWidths[I]*PointScale,y+PrintStep);
{
if y=PointY*TopBlank then
Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Columns[i].Title.Caption)
else
}
Printer.Canvas.TextOut(x+8,y+8,StrGrid.Cells[I,W]);
end; //计算下一列的横坐标
x:=x+StrGrid.ColWidths[I]*PointScale;
end;
{
if not (y=PointY*TopBlank) then
(DataSource1.DataSet).next;
}
x:=PointX*LeftBlank;
y:=y+PrintStep; //换页
if (y+PrintStep)>(Printer.PageHeight-PointY*BottomBlank) then
begin
Printer.NewPage;
y:=PointY*TopBlank;
end;
end;
printer.EndDoc;
// (DataSource1.DataSet).First;
Application.MessageBox('打印完成','打印',32);
end;
end;
procedure print_dbgrid(datasource1 :Tdatasource;dbgrid1 :Tdbgrid;FX :STRING) ;
const
LeftBlank=1; //定义页边距,单位厘米
RightBlank=1;
TopBlank=1;
BottomBlank=1;
var
PointX,PointY:integer;
PointScale,PrintStep:integer;
s:string;
x,y:integer;
i:integer;
Device:Array[0..cchDeviceName-1] of Char;
Driver:Array[0..(MAX_PATH-1)] of Char;
Port:Array[0..32] of Char;
hDMode:THandle;
pDMode:PDevMode;
begin //获取当前打印机的分辨率
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode<>0 then
begin
pDMode:=GlobalLock(hDMode);
if pDMode<>nil then
begin
pDMode^.dmPaperSize:=DMPAPER_A4;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
GlobalUnLock(hDMode);
end;
end;
PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/Screen.PixelsPerInch+0.5); //横向打印
IF FX='HX' THEN
printer.Orientation:=poPortrait//Portrait;//poLandscape;
ELSE
printer.Orientation:=poLandscape;//Portrait;//poLandscape;
//打印的字体和大小
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=12;
//根据字体的大小确定每行的高度
s:=application.Title ;
PrintStep:=printer.canvas.TextHeight(s)+16;
//打印的起点位置
x:=PointX*LeftBlank;
y:=PointY*TopBlank;
//DataSource1是DBGrid1所连接的数据源
if ((DataSource1.DataSet).Active=true) and ((DataSource1.DataSet).RecordCount>0) then
begin
printer.BeginDoc;
(DataSource1.DataSet).First;
while not (DataSource1.DataSet).Eof do
begin //打印DBGrid中的所有列
for i:=0 to DBGrid1.FieldCount-1 do
begin
//假如所要打印的列超出了打印范围,则忽略该列
if (x+DBGrid1.Columns.Items[i].Width*PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
begin //画表格线
//每页的第一行打印表头
Printer.Canvas.Rectangle(x,y,x+DBGrid1.Columns.Items[i].Width*PointScale,y+PrintStep);
if y=PointY*TopBlank then
Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Columns[i].Title.Caption)
else
Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Fields[i].asString);
end; //计算下一列的横坐标
x:=x+DBGrid1.Columns.Items[i].Width*PointScale;
end;
if not (y=PointY*TopBlank) then
(DataSource1.DataSet).next;
x:=PointX*LeftBlank;
y:=y+PrintStep; //换页
if (y+PrintStep)>(Printer.PageHeight-PointY*BottomBlank) then
begin
Printer.NewPage;
y:=PointY*TopBlank;
end;
end;
printer.EndDoc;
(DataSource1.DataSet).First;
Application.MessageBox('打印完成','打印',32);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -