*調(diào)用方法:MYREPORT2006([<報(bào)表文件名>],[<報(bào)表標(biāo)題>],[<左頁眉>],[<中頁眉>],[<右頁眉>],[<左頁腳>],[<中頁腳>],[<右頁腳>],;
<報(bào)表結(jié)構(gòu)文件名>,<報(bào)表打印列數(shù)>[,表頭字體][,表頭字號][,表體字體][,表體字號][,行高][,是否伸展][,打印方向])
*使用舉例:
*報(bào)表文件放在"C:\TEMP"目錄下
*cFilePath="C:\TEMP\"
*IF !DIRECTORY((cFilePath))
* MD (cFilePath)
*ENDIF
*定義標(biāo)題,頁眉,頁腳
*reportname='MYREPORT' &&報(bào)表文件名
*titlename='我的動(dòng)態(tài)報(bào)表' &&報(bào)表標(biāo)題
*leftHeader="編制單位:"
*centerHeader="日期:"+DTOC(DATE())+"至"+DTOC(date())
*rightHeader='"共 "+ALLTRIM(STR(_PAGETOTAL))+" 頁 第 "+ALLTRIM(STR(_PAGENO))+" 頁"'
*leftFooter="制表人:"
*centerFooter="復(fù)核人:"
*rightFooter="打印日期:"+TTOC(DATETIME())
*tmpfilename=SYS(2015) &&報(bào)表結(jié)構(gòu)文件名(隨機(jī)值)
*lnColumns=thisform.grid1.ColumnCount &&打印列數(shù)
*nLockColumns=thisform.grid1.LockColumns &&鎖定列數(shù)
*title_f &&幾種可選字體,'黑體','宋體','楷體_GB2312','隸書'
*title_fontsize=16
*detail_f
*detail_fontsize=9
*nRowHeight=1800 &&行高,默認(rèn)值--2200
*lStretch=.F. &&溢出時(shí)是否伸展,默認(rèn)值.F.,不伸展
*nOrientation=0 &&打印方向(0-豎向,1-橫向),默認(rèn)為0-豎向
*IS_PRINT_MOREPAGE=.F. &&是否打印多頁
*SELECT * FROM MYTABLE INTO CURSOR TMP_RPT
*SELECT TMP_RPT
*tempfilename=SYS(2015)
*COPY STRUCTURE TO (cFilePath)+(tempfilename) EXTENDED
*SELECT *,space(128) as 列標(biāo)題,CAST(0 as numeric(10)) as 列寬,.F. as 鎖定列,.F. as 打印;
FROM (cFilePath)+(tempfilename);
INTO CURSOR (tmpfilename) READWRITE
*USE IN (tempfilename)
*ERASE (cFilePath)+(tempfilename)+'.*'
*SELECT (tmpfilename)
*N=1
*SCAN
* lcFiledName=IIF(n<=lnColumns,THISFORM.GRID1.COLUMNS(N).HEADER1.CAPTION,FIELD_NAME)
* lnWidth=IIF(n<=lnColumns,THISFORM.GRID1.COLUMNS(N).WIDTH*100,7500)
* isLock=IIF(n<=nLockColumns,.T.,.F.)
* REPLACE 列標(biāo)題 WITH lcFiledName,列寬 WITH lnWidth,鎖定列 WITH isLock
* N=N+1
*ENDSCAN
*COUNT TO nHideColumns FOR 列寬<=1000 &&隱藏的列數(shù)
*PUBLIC nPrint_Columns
*nPrint_Columns=nHideColumns &&已打印的列數(shù)
*DO WHILE .T.
*SELECT TMP_RPT
*MYREPORT2006(reportname,titlename,leftHeader,centerHeader,rightHeader,leftFooter,centerFooter,rightFooter,tmpfilename,lnColumns,;
title_fontname,title_fontsize,detail_fontname,detail_fontsize,nRowHeight,lStretch,nOrientation)
*REPORT FORM (cFilePath)+(reportname) noeject noconsole to print preview
*ERASE (cFilePath)+(reportname)+'.*'
*IF nPrint_Columns<lnColumns and IS_PRINT_MOREPAGE=.T.
* nPrint_Columns=nPrint_Columns-nLockColumns
* LOOP
*ELSE
* EXIT
*ENDIF
*ENDDO
*USE IN (tmpfilename) &&關(guān)閉報(bào)表結(jié)構(gòu)文件
*報(bào)表文件名不帶擴(kuò)展名,可缺省(缺省文件名為TMP_REP)
PARAMETERS 報(bào)表文件名,報(bào)表標(biāo)題,leftHeader,centerHeader,rightHeader,leftFooter,centerFooter,rightFooter,L_TMP,lnColumns,;
L_標(biāo)題字體,L_標(biāo)題字號,L_表體字體,L_表體字號,L_行高,L_伸展,L_打印方向
PRIVATE ALL LIKE L_*
*WAIT "正在生成報(bào)表......" WINDOW AT SYSMETRIC(2)/24-6,SYSMETRIC(1)/12-13 NOWAIT NOCLEAR
IF EMPTY(報(bào)表文件名)
報(bào)表文件名='TMP_REP'
ENDIF
IF EMPTY(L_TMP)
MESSAGEBOX("報(bào)表結(jié)構(gòu)文件不能為空!",16,"提示!")
RETURN
ENDIF
IF !USED((L_TMP))
MESSAGEBOX("報(bào)表結(jié)構(gòu)文件不存在!",16,"提示!")
RETURN
ENDIF
IF EMPTY(lnColumns)
MESSAGEBOX("打印列不能為空或0!",16,"提示!")
RETURN
ENDIF
IF EMPTY(L_標(biāo)題字體)
L_標(biāo)題字體="黑體"
ENDIF
IF EMPTY(L_標(biāo)題字號)
L_標(biāo)題字號=16
ENDIF
IF EMPTY(L_表體字體)
L_表體字體="宋體"
ENDIF
IF EMPTY(L_表體字號)
L_表體字號=9
ENDIF
IF EMPTY(L_行高)
L_行高=2200
ENDIF
IF EMPTY(L_打印方向)
L_打印方向=0
ENDIF
L_表體_字符寬度= (1145.833+(L_表體字號-8)*104.167)/2 &&1145.833--字號8的寬度,104.167--字號每增加1的增加值
L_表體_字符寬度粗= (1354.167+(L_表體字號-8)*104.167)/2 &&1354.167--字號8,粗體的寬度
L_表體_字符高度= 1354.167+(L_表體字號-8)*104.167
L_標(biāo)題_字符寬度粗= (1354.167+(L_標(biāo)題字號-8)*104.167)/2
L_標(biāo)題_字符高度= 1354.167+(L_標(biāo)題字號-8)*104.167
L_帶區(qū)指示條高度=2083
L_標(biāo)題區(qū)高度=0
L_頁標(biāo)頭區(qū)高度=12000
L_細(xì)節(jié)區(qū)高度=L_行高 + (L_表體字號-8)*208.333
L_頁腳區(qū)高度=5000
L_總結(jié)區(qū)高度=L_表體_字符高度
L_左邊距=5000
L_右邊距=0
L_頁標(biāo)頭區(qū)VPOS=L_標(biāo)題區(qū)高度+IIF(L_標(biāo)題區(qū)高度=0,0,L_帶區(qū)指示條高度)
L_細(xì)節(jié)區(qū)VPOS=L_標(biāo)題區(qū)高度+L_頁標(biāo)頭區(qū)高度+IIF(L_標(biāo)題區(qū)高度=0,1,2)*L_帶區(qū)指示條高度
L_總結(jié)區(qū)VPOS=L_標(biāo)題區(qū)高度+L_頁標(biāo)頭區(qū)高度+L_細(xì)節(jié)區(qū)高度+L_頁腳區(qū)高度+IIF(L_標(biāo)題區(qū)高度=0,3,4)*L_帶區(qū)指示條高度
L_CA=SELECT()
L_PATH="\" &&報(bào)表文件所在目錄
CREATE CURSOR TEMP (TMPFIELD C(10)) &&字段長度在6位以上,小于6時(shí),在VFP9中會出錯(cuò)
CREATE REPORT (L_PATH)+(報(bào)表文件名) FROM TEMP
USE IN TEMP
USE (L_PATH)+報(bào)表文件名+'.FRX' EXCL IN 0
SELECT (報(bào)表文件名)
IF L_標(biāo)題區(qū)高度<>0
*添加標(biāo)題區(qū)
INSERT BLANK
REPLACE PLATFORM WITH 'WINDOWS',OBJTYPE WITH 9,HEIGHT WITH L_標(biāo)題區(qū)高度
ENDIF
*設(shè)置左邊距
LOCATE FOR OBJTYPE = 1
REPLACE HPOS WITH L_左邊距
*設(shè)置打印方向
*默認(rèn)為0-豎向,如果設(shè)為1-橫向,則修改打印方向
IF L_打印方向=1
REPLACE EXPR WITH subs(EXPR, 1, atc("ORIENTATION",EXPR)-1) + "ORIENTATION=1" + chr(10);
+ subs(EXPR, atc("ORIENTATION",EXPR) + atc(chr(10), subs(expr, atc("ORIENTATION",expr), 15)))
ENDIF
*設(shè)置紙張
*REPLACE EXPR WITH subs(EXPR, 1, atc("PAPERSIZE",EXPR)-1) + "PAPERSIZE=9" + chr(10);
+ subs(EXPR, atc("PAPERSIZE",EXPR) + atc(chr(10), subs(expr, atc("PAPERSIZE",expr), 15)))
*獲取頁面寬度
LOCATE FOR EXPR='_PAGENO'
L_頁面寬度=HPOS+WIDTH
*增高頁標(biāo)頭區(qū)
LOCATE FOR OBJTYPE=9 AND OBJCODE=1
REPLACE HEIGHT WITH L_頁標(biāo)頭區(qū)高度
*增高細(xì)節(jié)區(qū)
LOCATE FOR OBJTYPE=9 AND OBJCODE=4
REPLACE HEIGHT WITH L_細(xì)節(jié)區(qū)高度
*增高頁腳區(qū)
LOCATE FOR OBJTYPE=9 AND OBJCODE=7
REPLACE HEIGHT WITH L_頁腳區(qū)高度
*添加總結(jié)區(qū)
INSERT BLANK
REPLACE PLATFORM WITH 'WINDOWS',OBJTYPE WITH 9,OBJCODE WITH 8,HEIGHT WITH L_總結(jié)區(qū)高度
*添加列標(biāo)題標(biāo)簽控件、細(xì)節(jié)區(qū)域控件以及表格線
*拷貝一個(gè)標(biāo)簽記錄至數(shù)組
LOCATE FOR OBJTYPE=5 AND TOP
SCATTER MEMV MEMO
*先保存報(bào)表中基于TMPFIELD字段的標(biāo)簽控件和域控件記錄,作為生成各列的標(biāo)題標(biāo)簽控件和細(xì)節(jié)域控件的依據(jù)
LOCATE FOR UPPER(EXPR)=["TMPFIELD"]
SCATTER TO L_列標(biāo)題記錄 MEMO
DELETE
LOCATE FOR UPPER(EXPR)=[TMPFIELD]
SCATTER TO L_列細(xì)節(jié)記錄 MEMO
DELETE
PACK
SELECT (L_TMP)
L_報(bào)表寬度=0
L_HPOS=0
L_GAP=400 &&列與縱線之間的間隙
*設(shè)置縱線屬性
OBJTYPE=6
EXPR=''
WIDTH=208.333 &&左邊框?yàn)榇志€
HEIGHT=L_細(xì)節(jié)區(qū)高度
PENSIZE=2
PENPAT=8
MODE=0
*1.通用型字段不打印
*2.只打印列寬大于1000的列
*3.只打印表格控件中顯示的列
*4.每頁打印鎖定列
*5.對于已打印的列不再打印
SCAN FOR FIELD_TYPE<>'G' AND 列寬>1000 AND RECNO()<=lnColumns AND (鎖定列=.T. OR 打印=.F.)
L_列標(biāo)題=TRIM(列標(biāo)題)
L_列標(biāo)題寬=LEN(L_列標(biāo)題)*L_表體_字符寬度粗
L_列細(xì)節(jié)=TRIM(FIELD_NAME)
L_列細(xì)節(jié)寬=列寬
L_列寬=列寬
L_報(bào)表寬度=L_報(bào)表寬度+WIDTH+2*L_GAP+L_列寬
L_類型=FIELD_TYPE
IF L_報(bào)表寬度>L_頁面寬度-L_左邊距-L_右邊距
EXIT
ENDIF
SELECT (報(bào)表文件名)
添加縱線()
L_HPOS=L_HPOS+WIDTH+L_GAP
L_列標(biāo)題_HPOS=L_HPOS+IIF(L_列寬-L_列標(biāo)題寬>0,(L_列寬-L_列標(biāo)題寬)/2,0) &&列標(biāo)題居中
*添加列標(biāo)題
APPEND BLANK
GATHER FROM L_列標(biāo)題記錄 MEMO
REPLACE EXPR WITH ["]+L_列標(biāo)題+["],VPOS WITH L_頁標(biāo)頭區(qū)VPOS+L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度*3/4,HPOS WITH L_列標(biāo)題_HPOS,;
WIDTH WITH L_列標(biāo)題寬,HEIGHT WITH L_表體_字符高度,FONTFACE WITH L_表體字體,FONTSIZE WITH L_表體字號
*添加列細(xì)節(jié)
APPEND BLANK
GATHER FROM L_列細(xì)節(jié)記錄 MEMO
REPLACE EXPR WITH L_列細(xì)節(jié),VPOS WITH L_細(xì)節(jié)區(qū)VPOS+(L_細(xì)節(jié)區(qū)高度-L_表體_字符高度)/2,HPOS WITH L_HPOS,;
WIDTH WITH L_列細(xì)節(jié)寬,HEIGHT WITH L_表體_字符高度,FONTFACE WITH L_表體字體,FONTSIZE WITH L_表體字號,;
FILLCHAR WITH CHRTRAN(L_類型,'YFTBIM','NNDNNC'),PICTURE WITH IIF(L_類型="N",'"@Z"',""),;
SUPEXPR WITH IIF(INLIST(L_類型,"D","T"),"!EMPTY(&L_列細(xì)節(jié))",""),STRETCH WITH IIF(L_類型="T",.F.,L_伸展)
IF FILLCHAR='N'
REPLACE OFFSET WITH 1
ENDIF
L_HPOS=L_HPOS+L_列寬+L_GAP
SELECT (L_TMP)
WIDTH=104.167 &&表中間為細(xì)線
PENSIZE=1
REPLACE 打印 WITH .T.
nPrint_Columns=nPrint_Columns+1
ENDSCAN
*USE IN (L_TMP) &&關(guān)閉報(bào)表結(jié)構(gòu)文件
SELECT (報(bào)表文件名)
WIDTH=208.333 &&右邊框?yàn)榇志€
PENSIZE=2
添加縱線()
L_報(bào)表寬度=L_HPOS+WIDTH
*添加橫線
HPOS=0
PENSIZE=2 &&頁標(biāo)頭區(qū)為粗線
HEIGHT=208.333
WIDTH=L_報(bào)表寬度
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_頁標(biāo)頭區(qū)VPOS+L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_頁標(biāo)頭區(qū)VPOS+L_頁標(biāo)頭區(qū)高度
PENSIZE=1 &&細(xì)節(jié)區(qū)為細(xì)線
HEIGHT=104.167
TOP=.F.
BOTTOM=.T.
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_細(xì)節(jié)區(qū)VPOS+L_細(xì)節(jié)區(qū)高度
*為了獲得粗邊框的效果,在總結(jié)區(qū)添加一條橫線
PENSIZE=1
HEIGHT=104.167
TOP=.T.
BOTTOM=.F.
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_總結(jié)區(qū)VPOS,SUPEXPR WITH "recno()=reccount()"
*設(shè)置標(biāo)題,頁眉
*拷貝一個(gè)標(biāo)簽記錄至數(shù)組
LOCATE FOR OBJTYPE=5 AND TOP
SCATTER MEMV MEMO
IF !EMPTY(報(bào)表標(biāo)題)
*增加標(biāo)題
L_標(biāo)題寬度=LEN(報(bào)表標(biāo)題)*L_標(biāo)題_字符寬度粗
EXPR=["]+報(bào)表標(biāo)題+["]
VPOS=(L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度)/3
HPOS=MAX(0,(L_報(bào)表寬度-L_標(biāo)題寬度)/2)
WIDTH=L_標(biāo)題寬度
HEIGHT=L_標(biāo)題_字符高度
FONTSIZE=L_標(biāo)題字號
FONTFACE=L_標(biāo)題字體
FONTSTYLE=5 &&0-規(guī)則 1-粗體 5-下劃線,粗體
APPEND BLANK
GATHER MEMV MEMO
ENDIF
IF !EMPTY(leftHeader)
*增加左頁眉
L_標(biāo)題寬度=LEN(leftHeader)*L_表體_字符寬度
EXPR=["]+leftHeader+["]
VPOS=L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度-L_表體_字符高度
HPOS=0
WIDTH=L_標(biāo)題寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
APPEND BLANK
GATHER MEMV MEMO
ENDIF
IF !EMPTY(centerHeader)
*增加中頁眉
L_標(biāo)題寬度=LEN(centerHeader)*L_表體_字符寬度
EXPR=["]+centerHeader+["]
VPOS=L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度-L_表體_字符高度
HPOS=MAX(0,(L_報(bào)表寬度-L_標(biāo)題寬度)/2)
WIDTH=L_標(biāo)題寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
APPEND BLANK
GATHER MEMV MEMO
ENDIF
IF !EMPTY(rightHeader)
*增加右頁眉
L_標(biāo)題寬度=18*L_表體_字符寬度
EXPR=rightHeader
VPOS=L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度-L_表體_字符高度
HPOS=MAX(0,L_報(bào)表寬度-L_標(biāo)題寬度)
WIDTH=L_標(biāo)題寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
OBJTYPE=8 &&5-標(biāo)簽 6-直線 8-域控件
APPEND BLANK
GATHER MEMV MEMO
ENDIF
*在總結(jié)區(qū)添加頁腳
*當(dāng)最后一頁不滿頁時(shí)打印總結(jié)區(qū)頁腳,否則打印頁腳區(qū)頁腳
IF !EMPTY(leftFooter)
*在總結(jié)區(qū)添加左頁腳
L_頁腳寬度=LEN(leftFooter)*L_表體_字符寬度
EXPR=["]+leftFooter+["]
VPOS=L_總結(jié)區(qū)VPOS+208.333 &&加上橫線的高度
HPOS=0
WIDTH=L_頁腳寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
OBJTYPE=5
SUPEXPR="recno()=reccount()"
APPEND BLANK
GATHER MEMV MEMO
ENDIF
IF !EMPTY(centerFooter)
*在總結(jié)區(qū)添加中頁腳
L_頁腳寬度=LEN(centerFooter)*L_表體_字符寬度
EXPR=["]+centerFooter+["]
VPOS=L_總結(jié)區(qū)VPOS+208.333
HPOS=(L_報(bào)表寬度-L_頁腳寬度)/2
WIDTH=L_頁腳寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
OBJTYPE=5
SUPEXPR="recno()=reccount()"
APPEND BLANK
GATHER MEMV MEMO
ENDIF
IF !EMPTY(rightFooter)
*在總結(jié)區(qū)添加右頁腳
L_頁腳寬度=LEN(rightFooter)*L_表體_字符寬度
EXPR=["]+rightFooter+["]
VPOS=L_總結(jié)區(qū)VPOS+208.333
HPOS=L_報(bào)表寬度-L_頁腳寬度
WIDTH=L_頁腳寬度
HEIGHT=L_表體_字符高度
FONTSIZE=L_表體字號
FONTFACE=L_表體字體
FONTSTYLE=0
OBJTYPE=5
SUPEXPR="recno()=reccount()"
APPEND BLANK
GATHER MEMV MEMO
ENDIF
*修改頁腳區(qū)頁腳
*設(shè)置左頁腳
CALCULATE MAX(HPOS) TO L_MAX FOR OBJTYPE=5 AND TOP
LOCATE FOR HPOS=L_MAX
IF !EMPTY(leftFooter)
L_頁腳寬度=LEN(leftFooter)*L_表體_字符寬度
REPLACE EXPR WITH ["]+leftFooter+["],VPOS WITH L_細(xì)節(jié)區(qū)VPOS+L_細(xì)節(jié)區(qū)高度+L_帶區(qū)指示條高度,HPOS WITH 0,;
WIDTH WITH L_頁腳寬度,HEIGHT WITH L_表體_字符高度,OBJTYPE WITH 5,;
FONTFACE WITH L_表體字體,FONTSIZE WITH L_表體字號,FONTSTYLE WITH 0,;
SUPEXPR WITH "recno()<>reccount()"
ELSE
DELETE
PACK
ENDIF
*設(shè)置中頁腳
LOCATE FOR EXPR=[_PAGENO] AND TOP
IF !EMPTY(centerFooter)
L_頁腳寬度=LEN(centerFooter)*L_表體_字符寬度
REPLACE EXPR WITH ["]+centerFooter+["],VPOS WITH L_細(xì)節(jié)區(qū)VPOS+L_細(xì)節(jié)區(qū)高度+L_帶區(qū)指示條高度,HPOS WITH (L_報(bào)表寬度-L_頁腳寬度)/2,;
WIDTH WITH L_頁腳寬度,HEIGHT WITH L_表體_字符高度,OBJTYPE WITH 5,;
FONTFACE WITH L_表體字體,FONTSIZE WITH L_表體字號,FONTSTYLE WITH 0,;
SUPEXPR WITH "recno()<>reccount()"
ELSE
DELETE
PACK
ENDIF
*設(shè)置右頁腳
LOCATE FOR EXPR=[DATE()] AND TOP
IF !EMPTY(rightFooter)
L_頁腳寬度=LEN(rightFooter)*L_表體_字符寬度
REPLACE EXPR WITH ["]+rightFooter+["],VPOS WITH L_細(xì)節(jié)區(qū)VPOS+L_細(xì)節(jié)區(qū)高度+L_帶區(qū)指示條高度,HPOS WITH L_報(bào)表寬度-L_頁腳寬度,;
WIDTH WITH L_頁腳寬度,HEIGHT WITH L_表體_字符高度,OBJTYPE WITH 5,;
FONTFACE WITH L_表體字體,FONTSIZE WITH L_表體字號,FONTSTYLE WITH 0,;
SUPEXPR WITH "recno()<>reccount()"
ELSE
DELETE
PACK
ENDIF
USE IN (報(bào)表文件名)
SELECT (L_CA)
WAIT CLEAR
RETURN
PROCEDURE 添加縱線
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_頁標(biāo)頭區(qū)VPOS+L_頁標(biāo)頭區(qū)高度-L_細(xì)節(jié)區(qū)高度,HPOS WITH L_HPOS
APPEND BLANK
GATHER MEMV MEMO
REPLACE VPOS WITH L_細(xì)節(jié)區(qū)VPOS,HPOS WITH L_HPOS,STRETCH WITH .T.
RETURN