网络开发 调用API函数 报表打印 常用技术 经验汇总 控件使用 软件工程 数据处理
您的位置:首页 >> vfp教程 >> 网上文摘 >> 报表打印 >> 正文

VFP数据转出RTF的档案示例
红虎 出处:网络

  该示例主要是以示例为主,所以这里不做过多的说明,以下所有下划线以及表格里的数据都是由程序输出到一个预先写好的RTF文件摸板中的。

打印时间:03/14/01 星期 3 19:14:49

以下数据取自表father,dbf和child.dbf,father表通过字段id和child表进行关联

父表father有3条记录,子表child有15条记录,两表由程序通过两表的关系分解为如下的表格形式,具体的还请下载示例来看看!

如下只是经过加工过的程序结果,供参考!

1 以下是“红虎”的联系地址:

记录

姓名

地址

电话

2、 Thompson Hunter 789 Front Drive

715-903-9322

3、 Lowell Freeman 409 Pinebarren St. 705-234-7863

4、

Henderson Herbert

303 Wilson Way

207-654-1300

8、

Scissorhands Edward

909 East Cutlery Way

903-213-8945

9、

Smedley Randolph

23 East Ho Chunk

715-444-9023

10、

Wipfili Johnny

678 Westerbrook Av

715-344-2311

11、

Hinkley Harris

2938 East Alimira St

829-371-8982

-----------------------------------------------------------------------------------2 以下是“其他人”的联系地址:

记录

姓名

地址

电话

5、

Wentworth Thomas

900 Eisenhower Av.

817-562-8923

6、

Bathgate Billy

121 East Laramie

715-235-2100

7、

Stephens Roger

5672 Estes Parkway

803-456-1212

-----------------------------------------------------------------------------------3 以下是“狐友”的联系地址:

记录

姓名

地址

电话

1、

Smith John

231 East Amhurst

715-726-9023

12、

Tiger Red

Guangdong, China

0769-2469851

13、

Kang Kang

Huizhou, Guangdong

?????

14、

Jia Zhuang

GuangZhou, China

130******

15、

Minhan Ren

Sichuan, China

?

-----------------------------------------------------------------------------------

--- 完 ---原压缩文档不知道去哪了找不道了,将代码帖上!

001: *-- 说明:将数据表里的数据导出到一个已经写好的RTF摸板中
002: *-- 作者:Jeremy Pointer jermp@pixie.co.za http://www.pix.za/jermp
003: *-- 翻译整理:红虎 ceo@hhgzs.com 2001年3月14日
004:
005: parameter fname
006: *-- fname 是一个摸板文件,这里为 sample.rtf
007: *!* set proc to memofn additive
008: local mtxt
009: *-- 指定变量mtxt来获取所指定摸板的全部文件内容
010: mtxt=memoread(fname)
011: if empty(mtxt)
012: retu
013: endif
014: *-- 处理该摸板文件,将“<<...>>”中的内容进行替换
015: mtxt=var2txt(mtxt)
016: *-- 给新的文件指定一个随机的文件名,并放在临时目录中
017: loFile=alltrim(sys(2023))+"\"+SUBSTR(SYS(2015), 3, 10)+".rtf"
018: *-- 在临时目录中创建指定的临时文件,并在该文件中写入转换后的内容
019: =memowrite(loFile,mtxt)
020: *-- 然后运行写字板程序打开该文件
021: *-- 注意不要在WINNT或者WIN3X中运行WRITE,因他不是标准的RTF格式
022: *-- 最好是在WIN9X中运行WRITE,你也可以在下面的命令中修改你打开RTF格式的编辑器
023: *-- 如果使用写字板打开
024: if file(getenv("windir")+"\write.exe")
025: run /n3 write &loFile
026: else
027: *-- 如果使用WORD打开
028: loWord = CreateObject("word.application")
029: with loWord
030: .visible = .t.
031: .Documents.Open ("&loFile", .F.,.F.,.F.,"","", .F., "","", 0)
032: Endwith
033: endif
034:
035: *-- 当当完成后,删除生成的临时文件
036: =Messagebox("请切换到你的写字板程序,然后点击确定!",64,"RTF文件 &loFile 生成完毕")
037: delete file &loFile
038:
039: *-- 处理RTF文件中的循环部分
040: procedure loop
041: lparameters malias, lmtxt
042: *-- malias 是每一个循环里使用的别名
043: *-- lmtxt 是每一个循环里处理的记录
044: local otxt,mord,mfor,mtxt
045: otxt=""
046: *-- 获得当前数据的别名
047: oldAlias=alias()
048: *-- 选定我们所要处理的表
049: select &malias
050: *-- 获得当前的记录号
051: orec=recno()
052: *-- 如果子表有一个索引名,那获取为当前数据到过滤的记录集
053: if !empty(order())
054: *-- 获得索引表达式
055: mord=sys(14,tagno(order()))
056: *-- 获取当前值
057: mfor=&mord
058: else
059: *-- 当没有索引时
060: mord=".t."
061: mfor=.t.
062: endif
063:
064: *-- 在子表中扫描整个表
065: scan for &mord=mfor
066: wait window "正在处理记录: "+allt(str(recn()))+"..." nowait
067: *-- 将摸板中的内容取到mtxt中
068: mtxt=lmtxt
069: *-- 处理摸板数据
070: mtxt=var2txt(mtxt)
071: *-- 连接字符串
072: otxt=otxt+mtxt
073: endscan
074: *-- 跳回到原有记录号
075: if orec<=reccount() and orec>0
076: goto orec
077: endif
078: *-- 跳回到原工作区
079: select &oldalias
080: *-- 去掉所得到字符里的“<<”和“>>”符号
081: otxt=strtran(otxt,"<<")
082: otxt=strtran(otxt,">>")
083: return otxt
084:
085: procedure var2txt
086: lparameter mtxt
087: *-- 传递过来的mtxt即所要处理的内容
088: local lnOcc,lnMarkStart,lnMarkEnd,otxt,lmFieldVar,orec,lnLoopStart,lnLoopEnd
089: *-- 特殊符号的序数,表示第几个特殊符号
090: lnOcc=1
091: *-- “<<”符号的起始位置
092: lnMarkStart=0
093: *-- “>>”符号的结束位置
094: lnMarkEnd=0
095: do while .t.
096: *-- 查找第lnOcc“<<”符号的位置,将其位置记录到lnMarkStart变量
097: lnMarkStart=at("<<",mtxt,lnOcc)
098: *-- 如果存在该“<<”符号
099: if lnMarkStart<>0
100: *-- 继续找结束标志“>>”
101: lnMarkEnd=at(">>",mtxt,lnOcc)
102: *-- 如果存在该“>>”符号
103: if lnMarkEnd<>0
104: *-- 获取在摸板中位于“<<...>>”中的变量,一般如:字段变量、内存变量、系统变量
105: lmFieldVar=substr(mtxt,lnMarkStart+2,lnMarkEnd-(lnMarkStart+2))
106:
107: do case
108: *-- 检查这个变量是否是一个循环处理,有LOOP和END标记
109: case upper(left(lmFieldVar,4))=="LOOP"
110: *-- 获取摸板里的内容来进行循环出来
111: *-- 循环体开始位置
112: lnLoopStart=lnMarkEnd+2
113: *-- 循环体结束位置
114: lnLoopEnd=at("<<END "+lmFieldVar+">>",mtxt)
115: *-- 去掉段落标记“\par”,这个标记位于第一位置,后面的忽略
116: ltxt=strtran(substr(mtxt,lnLoopStart,lnLoopEnd-lnLoopStart),"\par ","",1,1)
117: *-- 从第6个位置开始取值 “LOOP TableName”,即得到循环体内的表名
118: dbf=substr(lmFieldVar,6)
119: *-- 开始处理循环
120: ltxt=loop(dbf,ltxt)
121: *-- 将循环出来后得到的内容替换到原来的RTF文件中
122: *-- 即“<<LOOP TABLE>>...<<FIELD>>...<<END LOOP TABLE>>”中的部分内容
123: mtxt=stuff(mtxt,lnMarkStart,(lnLoopEnd+len("<<END "+lmFieldVar+">>"))-(lnMarkStart),ltxt)
124: *-- 因为原文内容已经经过了一次处理,“<<”和“>>”符号已经被删除了,所以标记位向前移一个
125: lnOcc=lnOcc-1
126: otherwise
127: *-- 如果不是循环体内容,则把他转换成一个普通的字符串
128: do case
129: *-- 为数字时,注意:这里只是转成整数
130: case type(lmFieldVar)=="N"
131: lmFieldVar=alltrim(str(&lmFieldVar))
132: *-- 为日期型时
133: case type(lmFieldVar)=="D"
134: lmFieldVar=dtoc(&lmFieldVar)
135: *-- 为货币型,注意:书写格式为999,999,999.99
136: case type(lmFieldVar)=="Y"
137: lmFieldVar=transform(&lmFieldVar,"999,999,999.99")
138: *-- 为逻辑型时,注意:书写格式为True和False
139: case type(lmFieldVar)=="L"
140: lmFieldVar=iif(&lmFieldVar,"True","False")
141: *-- 为时间型时
142: case type(lmFieldVar)="T"
143: lmFieldVar=ttoc(&lmFieldVar)
144: *-- 为字符型时
145: case type(lmFieldVar)=="C"
146: lmFieldVar=&lmFieldVar
147: *-- 为备注型时
148: case type(lmFieldVar)=="M"
149: lmFieldVar=&lmFieldVar
150: endcase
151: *-- 转换字符串,将实际的内容(已经通过转换)写到“<<...>>”中,
152: *-- 注意:这时没有去掉“<<...>>”标记
153: mtxt=stuff(mtxt,lnMarkStart+2,lnMarkEnd-(lnMarkStart+2),lmFieldVar)
154: endcase
155: else
156: *-- 当有“<<”而没有“>>”时,退出
157: exit
158: endif
159: else
160: *-- 当没有“<<”时,退出
161: exit
162: endif
163: *-- 处理完一个“<<”符号后,继续循环处理
164: lnOcc=lnOcc+1
165: enddo
166: *-- 处理完毕后,去掉所有的“<<”和“>>”符号
167: mtxt=strtran(mtxt,"<<")
168: mtxt=strtran(mtxt,">>")
169: *-- 全部处理完毕,将得到的内容返回并写入到一个新的RTF文件中
170: return mtxt
171:
172:
173:
174:
175: *-- 程序名称: memoread.prg
176: *-- 说明: 使用低级函数来读写一个RTF的文件
177:
178: function memoread
179: parameters fname && 需要读的RTF摸板文件
180: wait window "读取摸板文件..." nowait
181: *-- 如果没有传递参数或者参数不是一个字符,提示用户选择一个文件
182: if type("fname")!="C"
183: fname=getfile("rts","摸板(&R):","打开(&O)")
184: if empty(fname)
185: retu ""
186: endif
187: endif
188:
189: if !empty(fname)
190: fh=fopen(fname) && 打开指定的摸板文件
191: meof=fseek(fh,0,2) && 获得文件的大小
192: =fseek(fh,0,0) && 指到文件的头行
193: mstr=fread(fh,meof) && 读此文件
194: =fclose(fh) && 关闭文件
195: else
196: mstr=""
197: endif
198: return mstr
199:
200: function memowrite
201: *-- 文件名和要写的文件内容
202: parameters fname,mstr
203: wait window "写入生成文件..." nowait
204: local retval
205: if !empty(fname) and !empty(mstr)
206: *-- 创建指定的文件
207: fh=fcreate(fname,0)
208: if fh<>-1 && 成功打开文件
209: if fwrite(fh,mstr)<>0 &&成功写入文件内容
210: retval=.t.
211: endif
212: *-- 关闭文件,使用文件句柄HANDLE
213: =fclose(fh)
214: endif
215: else
216: retval=.f.
217: endif
218: return retval
219:

[返回]

     

首页 | 设为首页 | 加入收藏 | 关于本站 | 友情链接 | 版权声明

     
 
Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved
吉ICP备06005558号