完整的printer对象打印代码:Public Sub PrintGZLTJ(ByVal strSql As String, ByVal dtmBegin As Date, dtmStop As Date) On Error Resume Next Dim rsTemp As ADODB.Recordset Dim i As Integer Dim lngTotal As Long
Dim intPage As Integer Dim sngCurrY As Single Dim intCurrLine As Integer
Dim sngTitleTop As Single Dim sngHospitalTop As Single
Dim sngPersonTop As Single Dim sngTextLeft As Single Dim sngHeaderTop As Single Dim sngTextTop As Single Dim sngTextBottom As Single Dim sngPageNumberTop As Single
Set rsTemp = New ADODB.Recordset rsTemp.Open strSql, GCon, adOpenStatic, adLockOptimistic If rsTemp.EOF Then MsgBox "没有需要打印的内容,请重新设置时间范围!", vbInformation, "提示" GoTo ExitLab End If
intPage = 1 '从第一页开始 '打印第一页的标题 GoSub PrintTitle rsTemp.MoveFirst With Printer '打印报表正文 '循环打印所有记录 intCurrLine = 1 For i = 1 To rsTemp.RecordCount .FontSize = 9 .FontBold = False '计算纵坐标 sngCurrY = sngTextTop + (intCurrLine - 1) * .TextHeight("高度") * 1.5 If sngCurrY > sngTextBottom Then '该分页 Printer.NewPage intPage = intPage + 1 GoSub PrintTitle
On Error Resume Next
Dim rsTemp As ADODB.Recordset
Dim i As Integer
Dim lngTotal As Long
Dim intPage As Integer
Dim sngCurrY As Single
Dim intCurrLine As Integer
Dim sngTitleTop As Single
Dim sngHospitalTop As Single
Dim sngPersonTop As Single
Dim sngTextLeft As Single
Dim sngHeaderTop As Single
Dim sngTextTop As Single
Dim sngTextBottom As Single
Dim sngPageNumberTop As Single
Me.MousePointer = 11
sngTitleTop = 25
sngHospitalTop = 34
sngPersonTop = 42
sngTextLeft = 40
sngHeaderTop = 52
sngTextTop = 59
sngTextBottom = 272
sngPageNumberTop = 285
Set rsTemp = New ADODB.Recordset
rsTemp.Open strSql, GCon, adOpenStatic, adLockOptimistic
If rsTemp.EOF Then
MsgBox "没有需要打印的内容,请重新设置时间范围!", vbInformation, "提示"
GoTo ExitLab
End If
intPage = 1 '从第一页开始
'打印第一页的标题
GoSub PrintTitle rsTemp.MoveFirst
With Printer
'打印报表正文
'循环打印所有记录
intCurrLine = 1
For i = 1 To rsTemp.RecordCount
.FontSize = 9
.FontBold = False
'计算纵坐标
sngCurrY = sngTextTop + (intCurrLine - 1) * .TextHeight("高度") * 1.5
If sngCurrY > sngTextBottom Then '该分页
Printer.NewPage
intPage = intPage + 1
GoSub PrintTitle
intCurrLine = 1
.FontSize = 9
.FontBold = False
'分页后重新计算纵坐标
sngCurrY = sngTextTop + (intCurrLine - 1) * .TextHeight("高度") * 1.5
End If
.CurrentX = sngTextLeft
.CurrentY = sngCurrY
Printer.Print rsTemp(0)
.CurrentX = sngTextLeft + 100
.CurrentY = sngCurrY
Printer.Print IIf(IsNull(rsTemp(1)), "", rsTemp(1))
If Not IsNull(rsTemp(1)) Then
lngTotal = lngTotal + rsTemp(1)
End If
intCurrLine = intCurrLine + 1
rsTemp.MoveNext
Next
'在最后一页上打印合计
.FontSize = 9
.FontBold = True
sngCurrY = sngTextTop + (intCurrLine - 1) * .TextHeight("高度") * 1.5 + 5
Printer.Line (sngTextLeft - 5, sngCurrY - 1.5)-(sngTextLeft + 120, sngCurrY - 1.5)
.CurrentX = sngTextLeft
.CurrentY = sngCurrY
Printer.Print "合计:"
.CurrentX = sngTextLeft + 100
.CurrentY = sngCurrY
Printer.Print lngTotal
'提交打印
Printer.EndDoc
End With
GoTo ExitLab'打印报表标题
PrintTitle:
With Printer
'打印标题
.FontName = "宋体"
.FontSize = 17
.FontBold = True
.FontItalic = False
.FontUnderline = False
.CurrentX = (Printer.ScaleWidth - .TextWidth("**工作量统计")) / 2
.CurrentY = sngTitleTop
If mblnKShi = True Then
Printer.Print "**工作量统计"
Else
Printer.Print "**工作量统计"
End If
'打印单位
.FontSize = 11
.CurrentX = (Printer.ScaleWidth - .TextWidth(gstrDWMC)) / 2
.CurrentY = sngHospitalTop
Printer.Print gstrDWMC
'打印起始日期
.FontSize = 9
.CurrentX = (Printer.ScaleWidth - .TextWidth("(" & dtmBegin & " 至 " & dtmStop & ")")) / 2
.CurrentY = sngPersonTop
Printer.Print "(" & dtmBegin & " 至 " & dtmStop & ")"
'打印报表题头
Printer.DrawWidth = 5
Printer.Line (sngTextLeft - 5, sngHeaderTop - 1.5)-(sngTextLeft + 120, sngHeaderTop - 1.5)
.CurrentX = sngTextLeft
.CurrentY = sngHeaderTop
If mblnKShi = True Then
Printer.Print "**名称"
Else
Printer.Print "工作人员"
End If
.CurrentX = sngTextLeft + 100
.CurrentY = sngHeaderTop
Printer.Print "工作量(人次)"
Printer.Line (sngTextLeft - 5, sngHeaderTop + .TextHeight("高度") + 1)-(sngTextLeft + 120, sngHeaderTop + .TextHeight("高度") + 1)
.CurrentX = (Printer.ScaleWidth - .TextWidth(Str(intPage))) / 2
.CurrentY = sngPageNumberTop
Printer.Print intPage
End With
Return
ExitLab:
Me.MousePointer = 0
End Sub
非常感谢!不过我记得Printer是按页打印的,能控制按行打印吗?比如说给顾客打印小票后要直接撕纸。这就是我需要直接控制打印机ESC/PK、ESC/POS命令集的原因,但是不知道用法。
非常感谢!不过我记得Printer是按页打印的,能控制按行打印吗?比如说给顾客打印小票后要直接撕纸。这就是我需要直接控制打印机ESC/PK、ESC/POS命令集的原因,但是不知道用法。