远古一装备怎么样:VFP利用WORD打印票据的一个通用程序
来源:百度文库 编辑:偶看新闻 时间:2024/05/08 05:20:22
以前我做过一个支票打印程序,就是把存在数据库中的记录按照支票的格式进行套打。由于在VFP中设置自定义纸张比较麻烦,且报表中各项数据的位置也不太容易更改,所以我的程序中就把数据输出到Word中,然后进行打印。除了保存支票的表外,还需要两个表:一个页面设置表,一个各项数据的布局表。现在我把支票打印程序中的部分代码抽出来做来了通用的程序。
Record2Word.prg
NOTE ;
约定:1. 当前有三个表打开,这三个表分别存储要输出的各项记录、页面设置及各个字段的位置 ;
2. 这三个表都有一个字段ID,整型,进行输出操作时根据ID来取数据 ;
3. 三个表的结构:;
表1 ID I, ID2 I... (其各他字段自行定义) ;
ID2用以标示与区别相同ID的不同记录 ;
表2 ID I, Width B, Height B, Margin1 B, Margin2 B, Margin3 B, Margin4 B ;
其中:Width -页面宽度, Height -页面高度, Margin1 -上边距, Margin2 -下边距, ;
Margin3 -左边距, Margin4 -右边距 ;
表3 ID I, Number I, value C(50), Name C(30), Size B, Bold L, Italic L, ;
Left B, Top B, Width B, Height B, Alignment I ;
其中各字段类型相符即可,长度不做硬性要求;value可以存府VFP表达式,如: ;
PADL(ALLTRIM(STR(YEAR(日期))),4,’ ’), 其中“日期”是字段名。 ;
Name, Size, Bold, Italic, Left, Top, Width, Height, Alignment分别是 ;
文本框的字体名称、大小、加粗、倾斜、左、上、宽、高、对齐 ;
END
LPARAMETERS tnID, tnID2, tcAlias1, tcAlias2, tcAlias3, tlVisible, tlFlag
*-- tnID 三表中的相同字段ID的值
*-- tnID2 表1中的ID2字段值,为-1时打印所有表1中ID为tnID的记录
*-- tcAlias1, tcAlias2, tcAlias3 分别为表1、表2、表3的别名
*-- tlVisible 输出到Word中的整个过程是否可见
*-- tlFlag .F.-预览 .T.-打印
PRIVATE lcError, lcAlias, lnRecordNo, lnRecordNo1, lnRecordNo2, lnRecordNo3, lcTempAlias, ;
lnRecordCount, lnRecordCount2, laPageSetup[7], laLayout[1, 12], loWord, loActiveDocument, i, j
lcError = ""
lcAlias = ALIAS()
lnRecordNo = RECNO()
SELECT (tcAlias1)
lnRecordNo1 = RECNO()
lcTempAlias = SYS(2015)
IF tnID2 = -1
SELECT * FROM (tcAlias1) WHERE ID = tnID INTO CURSOR (lcTempAlias)
ELSE
SELECT * FROM (tcAlias1) WHERE ID = tnID AND ID2 = tnID2 INTO CURSOR (lcTempAlias)
ENDIF
lnRecordCount = _TALLY
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias1, lnRecordNo1)
SELECT (tcAlias2)
lnRecordNo2 = RECNO()
SELECT * FROM (tcAlias2) WHERE ID = tnID INTO ARRAY laPageSetup
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias2, lnRecordNo2)
SELECT (tcAlias3)
lnRecordNo3 = RECNO()
SELECT * FROM (tcAlias3) WHERE ID = tnID INTO ARRAY laLayout
lnRecordCount2 = _TALLY
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias3, lnRecordNo3)
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
TRY
loWord = CREATEOBJECT("Word.Application")
CATCH
lcError = "ERROR"
ENDTRY
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
TRY
loWord.Visible = tlVisible
loActiveDocument = loWord.Documents.Add()
loActiveDocument.Activate()
loWord.ActiveWindow.View.Type = 3
WITH loWord.ActiveDocument.PageSetup
.LineNumbering.Active = .F.
.Orientation = 1
.TopMargin = laPageSetup[4]*28.35
.BottomMargin = laPageSetup[5]*28.35
.LeftMargin = laPageSetup[6]*28.35
.RightMargin = laPageSetup[7]*28.35
.Gutter = 0
.HeaderDistance = 0
.FooterDistance = 0
.PageWidth = laPageSetup[2]*28.35
.PageHeight = laPageSetup[3]*28.35
.OddAndEvenPagesHeaderFooter = .F.
.DifferentFirstPageHeaderFooter = .F.
.SuppressEndnotes = .F.
.MirrorMargins = .F.
.TwoPagesOnOne = .F.
ENDWITH
SELECT (lcTempAlias)
FOR i = 1 TO lnRecordCount
GO i
loWord.ActiveDocument.Paragraphs.Last.Range.Select
loword.Selection.TypeText(" ")
FOR j = 1 TO lnRecordCount2
loWord.ActiveDocument.Shapes.AddTextbox(1, laLayout[j, 8]*28.35, laLayout[j, 9]*28.35, ;
laLayout[j, 10]*28.35, laLayout[j, 11]*28.35).Select
WITH loWord.Selection
.Font.Name = laLayout[j, 4]
.Font.Size = laLayout[j, 5]
.Font.Bold = laLayout[j, 6]
.Font.Italic = laLayout[j, 7]
.TypeText(EVALUATE(laLayout[j, 3]))
.ShapeRange.Fill.Visible = 0
.ShapeRange.Line.Transparency = 0
.ShapeRange.Line.Visible = 0
.ShapeRange.TextFrame.MarginLeft = 0
.ShapeRange.TextFrame.MarginRight = 0
.ShapeRange.TextFrame.MarginTop = 0
.ShapeRange.TextFrame.MarginBottom = 0
.ShapeRange.TextFrame.WordWrap = .T.
.ParagraphFormat.Alignment = laLayout[j, 12]
ENDWITH
ENDFOR
IF i < lnRecordCount
loWord.ActiveDocument.Paragraphs.Last.Range.Select()
loWord.Selection.MoveRight()
loWord.Selection.InsertBreak(2)
ENDIF
ENDFOR
CATCH
lcError = "ERROR"
ENDTRY
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
IF EMPTY(lcAlias) = .F.
SELECT (lcAlias)
= GoToRecordNo(lcAlias, lnRecordNo)
ENDIF
IF tlFlag = .F.
loWord.ActiveDocument.PrintPreview()
loWord.Visible = .T.
ELSE
loWord.ActiveDocument.PrintOut()
loWord.Visible = .T.
ENDIF
PROCEDURE GoToRecordNo
LPARAMETERS tcAlias, tnRecordNo
SELECT (tcAlias)
IF tnRecordNo > 1
TRY
GO (tnRecordNo)
CATCH
ENDTRY
ENDIF
ENDPROC
Record2Word.prg
NOTE ;
约定:1. 当前有三个表打开,这三个表分别存储要输出的各项记录、页面设置及各个字段的位置 ;
2. 这三个表都有一个字段ID,整型,进行输出操作时根据ID来取数据 ;
3. 三个表的结构:;
表1 ID I, ID2 I... (其各他字段自行定义) ;
ID2用以标示与区别相同ID的不同记录 ;
表2 ID I, Width B, Height B, Margin1 B, Margin2 B, Margin3 B, Margin4 B ;
其中:Width -页面宽度, Height -页面高度, Margin1 -上边距, Margin2 -下边距, ;
Margin3 -左边距, Margin4 -右边距 ;
表3 ID I, Number I, value C(50), Name C(30), Size B, Bold L, Italic L, ;
Left B, Top B, Width B, Height B, Alignment I ;
其中各字段类型相符即可,长度不做硬性要求;value可以存府VFP表达式,如: ;
PADL(ALLTRIM(STR(YEAR(日期))),4,’ ’), 其中“日期”是字段名。 ;
Name, Size, Bold, Italic, Left, Top, Width, Height, Alignment分别是 ;
文本框的字体名称、大小、加粗、倾斜、左、上、宽、高、对齐 ;
END
LPARAMETERS tnID, tnID2, tcAlias1, tcAlias2, tcAlias3, tlVisible, tlFlag
*-- tnID 三表中的相同字段ID的值
*-- tnID2 表1中的ID2字段值,为-1时打印所有表1中ID为tnID的记录
*-- tcAlias1, tcAlias2, tcAlias3 分别为表1、表2、表3的别名
*-- tlVisible 输出到Word中的整个过程是否可见
*-- tlFlag .F.-预览 .T.-打印
PRIVATE lcError, lcAlias, lnRecordNo, lnRecordNo1, lnRecordNo2, lnRecordNo3, lcTempAlias, ;
lnRecordCount, lnRecordCount2, laPageSetup[7], laLayout[1, 12], loWord, loActiveDocument, i, j
lcError = ""
lcAlias = ALIAS()
lnRecordNo = RECNO()
SELECT (tcAlias1)
lnRecordNo1 = RECNO()
lcTempAlias = SYS(2015)
IF tnID2 = -1
SELECT * FROM (tcAlias1) WHERE ID = tnID INTO CURSOR (lcTempAlias)
ELSE
SELECT * FROM (tcAlias1) WHERE ID = tnID AND ID2 = tnID2 INTO CURSOR (lcTempAlias)
ENDIF
lnRecordCount = _TALLY
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias1, lnRecordNo1)
SELECT (tcAlias2)
lnRecordNo2 = RECNO()
SELECT * FROM (tcAlias2) WHERE ID = tnID INTO ARRAY laPageSetup
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias2, lnRecordNo2)
SELECT (tcAlias3)
lnRecordNo3 = RECNO()
SELECT * FROM (tcAlias3) WHERE ID = tnID INTO ARRAY laLayout
lnRecordCount2 = _TALLY
lcError = IIF(_TALLY > 0, "", "ERROR")
= GoToRecordNo(tcAlias3, lnRecordNo3)
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
TRY
loWord = CREATEOBJECT("Word.Application")
CATCH
lcError = "ERROR"
ENDTRY
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
TRY
loWord.Visible = tlVisible
loActiveDocument = loWord.Documents.Add()
loActiveDocument.Activate()
loWord.ActiveWindow.View.Type = 3
WITH loWord.ActiveDocument.PageSetup
.LineNumbering.Active = .F.
.Orientation = 1
.TopMargin = laPageSetup[4]*28.35
.BottomMargin = laPageSetup[5]*28.35
.LeftMargin = laPageSetup[6]*28.35
.RightMargin = laPageSetup[7]*28.35
.Gutter = 0
.HeaderDistance = 0
.FooterDistance = 0
.PageWidth = laPageSetup[2]*28.35
.PageHeight = laPageSetup[3]*28.35
.OddAndEvenPagesHeaderFooter = .F.
.DifferentFirstPageHeaderFooter = .F.
.SuppressEndnotes = .F.
.MirrorMargins = .F.
.TwoPagesOnOne = .F.
ENDWITH
SELECT (lcTempAlias)
FOR i = 1 TO lnRecordCount
GO i
loWord.ActiveDocument.Paragraphs.Last.Range.Select
loword.Selection.TypeText(" ")
FOR j = 1 TO lnRecordCount2
loWord.ActiveDocument.Shapes.AddTextbox(1, laLayout[j, 8]*28.35, laLayout[j, 9]*28.35, ;
laLayout[j, 10]*28.35, laLayout[j, 11]*28.35).Select
WITH loWord.Selection
.Font.Name = laLayout[j, 4]
.Font.Size = laLayout[j, 5]
.Font.Bold = laLayout[j, 6]
.Font.Italic = laLayout[j, 7]
.TypeText(EVALUATE(laLayout[j, 3]))
.ShapeRange.Fill.Visible = 0
.ShapeRange.Line.Transparency = 0
.ShapeRange.Line.Visible = 0
.ShapeRange.TextFrame.MarginLeft = 0
.ShapeRange.TextFrame.MarginRight = 0
.ShapeRange.TextFrame.MarginTop = 0
.ShapeRange.TextFrame.MarginBottom = 0
.ShapeRange.TextFrame.WordWrap = .T.
.ParagraphFormat.Alignment = laLayout[j, 12]
ENDWITH
ENDFOR
IF i < lnRecordCount
loWord.ActiveDocument.Paragraphs.Last.Range.Select()
loWord.Selection.MoveRight()
loWord.Selection.InsertBreak(2)
ENDIF
ENDFOR
CATCH
lcError = "ERROR"
ENDTRY
IF EMPTY(lcError) = .F.
RETURN lcError
ENDIF
IF EMPTY(lcAlias) = .F.
SELECT (lcAlias)
= GoToRecordNo(lcAlias, lnRecordNo)
ENDIF
IF tlFlag = .F.
loWord.ActiveDocument.PrintPreview()
loWord.Visible = .T.
ELSE
loWord.ActiveDocument.PrintOut()
loWord.Visible = .T.
ENDIF
PROCEDURE GoToRecordNo
LPARAMETERS tcAlias, tnRecordNo
SELECT (tcAlias)
IF tnRecordNo > 1
TRY
GO (tnRecordNo)
CATCH
ENDTRY
ENDIF
ENDPROC
医疗保险票据打印程序
在VFP中如何实现票据的输入\打印功能?哪位大侠赐教?
VFP的一个小程序
用vfp编写的打印程序,要等到退出vfp才开始打印,怎么办?
跪求 vfp 票据打印系统或者配货站源代码
利用Visual Basic编写一个能够模拟WORD程序中“查找并替换”功能的程序。
票据利用
请教一个vfp打印问题
票据打印
VFP中的一个极其简单的打印问题
谁有票据打印软件的源码?
VFP数据如果输出为EXECL中打印,我现在一个小程序如那位高手帮我逐条逐函数的解释?
VFP数据如果输出为EXECL中打印,我现在一个小程序如那位高手帮我逐条逐函数的解释?
一个word打印的问题???高手帮帮忙???
一个WORD打印的问题,高手进
求VFP一个程序,九九表
什么软件可以实现热敏票据打印,并统计打印票据的金额?请高手解答
我想用vfp做一个打牌的程序
一个类似于打印程序的电脑病毒?
影楼用票据打印
万能票据打印王
数据库vfp的表不能打印
VFP程序行的错误
在VFP的打印中,如何选择的打印呢