
前几日有网友问道问什么报表“另存为 HTML”的效果会这样的差劲什么表格线条、图形都没了就连最基本的排版效果都不见了有没有什么方法解决这个问题要搞彻底解答我想必须回答以下问题清楚的了解 *.frx 文件的意义*.frx文件实际就是一个表文件DBF)所有报表设置都在其中记录。从理论上讲解读这个文件应是可以的实际这是一件非常麻烦的事情。把解读出来的信息用 HTML 语言表示出来送入一个 *.htm 文件。通用字段中的信息提取这又是一件非常让人烦恼的事情。怎样把图片从字段中读出并以 BMP、JPG、GIF 格式保存供网页调用恐怕这会让人头痛半天。笔者撰写此文将回避第一、第三个难题。也就是说我介绍的方法不能分析 *.frx 文件并根据其设定自动产生 HTML 文件。我们只讨论怎样在 Visual FoxPro 中方便快速的生成数据网页而这个网页要大家事先设计只是可以在运行中填入数据。我相信在您的项目中以此方法为每一张报表预先设定一段“另存为 HTML”的代码一定会增色不少不可不提的是本文讲述的方法其实是 Visual FoxPro Web 解决方案的一个组成部分。您可以想象Internet 服务程序接到客户指令按照一定要求通过本文将要讨论的方法就可以快速产生一个 *.htm 文件网页返回给客户端的浏览器。注意这只是 Visual FoxPro Web 解决方案的一种为这个报表定制一段生成网页的代码了解 Product Inventory Report 的经济意义这个报表名叫“Product Inventory Report”选自 Visual FoxPro 的“范例代码”。下面是它的设计视图它的数据来自于“Products”表在本文中这个表只有如下字段对我们有意义字段名称字段类型字段意义其他Product_idC(6)产品编号Prod_nameC(40)产品名称In_stockN(12,3)库存数量不打印小数On_orderN(12,3)已订购数量不打印小数Reorder_atN(12,3)采购临界数量等于或低于此数量就应该采购DiscontinuL是否还经营此产品让我们回过头来看一看报表的细节带区其中有五个待打印信息如下 产品编号Product_id)产品名称(Prod_name)库存数量(In_stock)已订购数量(On_order)提示每一种产品作为一行被列示打印时使用以下逻辑检测每种产品信息并决定打印格式 不再经营此种产品Discontinu.F.时则“提示”信息为空对本行的其他四种信息画上删除线黑色字体仍旧经营此种产品Discontinu.T.并且“在库数量”“采购临界数量”时则显示“提示”信息对本行的所有五种信息红色字体表示。仍旧经营此种产品Discontinu.T.并且“在库数量”“采购临界数量”时则“提示”信息为空对本行的所有五种信息黑色字体表示。在 FrontPage 中规划网页现在我们就开始设计网页吧打开 FrontPage 2000新建一张网页以“所见即所得”的方式制作出一张“毛坯”网页其形态如下如果您会网页设计有研究作上面的网页可能只需要几分钟的时间。这张网页的“HTML”如下htmlheadmeta http-equivContent-Type contenttext/html; charsetgb2312meta nameGENERATOR contentMicrosoft FrontPage 4.0meta nameProgId contentFrontPage.Editor.DocumenttitleMy First VFP-HTML/titlestyle!--.boe1 { font-family: Verdana; font-size: 10pt; margin-left: 2 }.boe3 { font-family: Verdana; font-size: 10pt; text-decoration: line-through; margin-left: 2 }.boe2 { font-family: Verdana; font-size: 10pt; color: #FF0000; margin-left: 2 }--/style/headbody leftmargin50 topmargin50table border1 width94% cellspacing0 cellpadding0 bordercolor#000000trtd width100%p stylemargin-bottom: -10font faceVerdana size2bDescription/b/font/pp stylemargin-left: 3; margin-right: 3font faceVerdana size3bYou can use the PrintWhen expression to change the fontstyles printed based on the values being printed. In thiscase, the detail line is printed in red for those products whose in stock is below the reorder level. Also, any products that have been discontinued are printed in strikeout./b/font/td /tr/tablep /pp aligncenterimg border0 src..//html/title.jpg width426 height30/p table border0 width100%trtd width41%font faceVerdana size3bProduct/b/font/tdtd width17%font faceVerdana size3bIn Stock/b/font/tdtd width18%font faceVerdana size3bOn Order/b/font/tdtd width24%/td/tr/tabletable border2 width100% bordercolor#000000 height1 cellspacing0 cellpadding0trtd width100% height1/td/tr/tabletable border0 width100%trtd width8%/tdtd width33%/tdtd width17%/tdtd width19%/tdtd width23%/td/tr/table/body/html使用样式表这是一种网页优化技术您可以不在意但本文的举例中将使用到它这里要说明的是在制作网页的时候我使用了“CSS”样式表技术事先定义了三种样式也就是数据行按不同情况显示时采用的三种格式。其意图在于将来生成数据网页时数据部分将重复出现N 次如果使用一般标记对其格式化那些本就重复出现的标记会很长降低效率。现在我们一次定义以后反复引用提高效率下面的代码就我们建立的“样式表”style!--.boe1 { font-family: Verdana; font-size: 10pt; margin-left: 2 }.boe3 { font-family: Verdana; font-size: 10pt; text-decoration: line-through; margin-left: 2 }.boe2 { font-family: Verdana; font-size: 10pt; color: #FF0000; margin-left: 2 }--/style在本文的举例中如果不使用样式表技术最普通的一行数据将如下定义trtd width8%p stylemargin-left: 3font faceVerdana size21/font/tdtd width33%p stylemargin-left: 3font faceVerdana size2Chai/tdtd width17%p stylemargin-left: 3font faceVerdana size239/tdtd width19%p stylemargin-left: 3font faceVerdana size20/tdtd width23%/td/tr如果使用样式表技术将如下trtd width8%p classboe11/font/tdtd width33%p classboe1Chai/tdtd width17%p classboe139/tdtd width19%p classboe10/tdtd width23%/td/tr可见数据行数越多使用样式表技术越合算怎样在 FrontPage 中定义样式表呢“格式”菜单-“样式(S)...”-出现“样式”对话框-“新建(N)”-出现“新样式”对话框如下-在此对话框中的“名称选择器”输入样式的名称注意名称前面加点号如.boe1。-点“格式(O)”进行格式设定。完成后按“确认”保存样式。FrontPage 将自动把您定义的样式写入文件中。进一步说在应用时我们可以事先设计多种样式表供用户选择套用这样您的程序将更加完美在 Visual FoxPro 方便的生成网页记得我在本文开头的时候就夸下海口方便、快速生成网页。好像时到现在一点与 Visual FoxPro “不搭架”现在就让 Visual FoxPro 上场在 Visual FoxPro 有很多关于字符串到文本的操作方式比如低级文件函数、StrToFile()、SET TEXTMERGE等。我偏爱 SET TEXTMERGE因为它很形象并能把输出信息与传统 Visual FoxPro 代码融合在一起。SET TEXTMERGE它有以下几种应用 SET TEXTMERGE ON 开启文本合并计算开关SET TEXTMERGE OFF 关闭文本合并计算开关SET TEXTMERGE TO E:\HTML\TEMP.htm NOSHOW 将合并文本输入到文件E:\HTML\TEMP.htm中并关闭屏幕显示关闭屏幕显示不程序运行速度大有好处SET TEXTMERGE TO 关闭并保存文本合并输出的文件让我们举例了解这个命令CLEARSET TALK OFFcString中国人SET TEXTMERGE ON\伟大的cString\\壮丽的山河\勤劳的人民*!*下面两行执行效果*伟大的中国人壮丽的山河*勤劳的人民这里出现了三个标记让我们看看他们的意义 \合并此标记后的文本生成的结果换行输出\合并此标记后的文本生成的结果续上一行输出 文本合并分隔符:在次符号中的变量、函数将计算后再合并输出。CLEARSET TALK OFFcString中国人SET TEXTMERGE OFF 关闭文本合并计算开关于是中的变量、函数将不被计算就输出\伟大的cString\\壮丽的山河\勤劳的人民*!*下面两行执行效果*伟大的cString壮丽的山河*勤劳的人民 是系统默认的文本合并分隔符您可以使用 SET TEXTMERGE DELIMITERS 改变文本合并分隔符CLEARSET TALK OFFcString中国人SET TEXTMERGE DELIMITERS TO ##,## 新的文本合并分隔符## ##SET TEXTMERGE ON \伟大的cString##cString##\\壮丽的山河\勤劳的人民SET TEXTMERGE DELIMITERS TO 恢复系统默认的文本合并分隔符\伟大的cString##cString##*!*下面三行执行效果*伟大的cString中国人壮丽的山河*勤劳的人民*伟大的中国人##cString##好了讲到这里我想您已经知道怎样在 Visual FoxPro 中生成网页了。新建一个程序将刚才 FrontPage 中产生的HTML 复制到其中并在每行前加上“\”表示文本合并输出。然后对这一段代码加上一个头、装上一个尾这个过程很简单结果如下SET TEXTMERGE ONSET TEXTMERGE DELIMITERS TO ##,##SET TEXTMERGE TO E:\HTML\TEMP.htm NOSHOW\html\head\meta http-equivContent-Type contenttext/html; charsetgb2312\meta nameGENERATOR contentMicrosoft FrontPage 4.0\meta nameProgId contentFrontPage.Editor.Document\titleMy First VFP-HTML/title\style\!--\.boe1 { font-family: Verdana; font-size: 10pt; margin-left: 2 }\.boe3 { font-family: Verdana; font-size: 10pt; text-decoration: line-through; margin-left: 2 }\.boe2 { font-family: Verdana; font-size: 10pt; color: #FF0000; margin-left: 2 }\--\/style\/head\body leftmargin50 topmargin50\table border1 width94% cellspacing0 cellpadding0 bordercolor#000000\tr\td width100%\p stylemargin-bottom: -10font faceVerdana size2bDescription/b\/font/p\p stylemargin-left: 3; margin-right: 3font faceVerdana size3bYou can use \the PrintWhen expression to change the fontstyles printed based on the values being \printed. In thiscase, the detail line is printed in red for those products whose in stock is below \the reorder level. Also, any products that have been discontinued are printed in strikeout.\/b/font/td \/tr\/table\p /p\p aligncenterimg border0 src..//html/title.jpg width426 height30\/p \table border0 width100%\tr\td width41%font faceVerdana size3bProduct/b/font/td\td width17%font faceVerdana size3bIn Stock/b/font/td\td width18%font faceVerdana size3bOn Order/b/font/td\td width24%/td\/tr\/table\table border2 width100% bordercolor#000000 height1 cellspacing0 \cellpadding0\tr\td width100% height1/td\/tr\/table\table border0 width100%\tr\td width8%/td\td width33%/td\td width17%/td\td width19%/td\td width23%/td\/tr\/table\/body\/htmlSET TEXTMERGE OFFSET TEXTMERGE TO SET TEXTMERGE DELI到现在我们的网页生成程序已经完工了 50%。最重要的就是将数据填入网页有关的技术问题上文中已经提过了——使用文本合并分隔符将变量、函数将计算后再合并输出具体怎么写那么多 HTML 标记呢很简单我制作“毛坯”网页时我已经在要显示数据的地方加入了一个一行表格现在就看数据表中有几条数据有 N 条就依样画葫芦的产生 N 行代码如下SET TEXTMERGE ONSET TEXTMERGE DELIMITERS TO ##,##SET TEXTMERGE TO E:\HTML\TEMP.htm NOSHOWselect products\html\head\meta http-equivContent-Type contenttext/html; charsetgb2312\meta nameGENERATOR contentMicrosoft FrontPage 4.0\meta nameProgId contentFrontPage.Editor.Document\titleMy First VFP-HTML/title\style\!--\.boe1 { font-family: Verdana; font-size: 10pt; margin-left: 2 }\.boe3 { font-family: Verdana; font-size: 10pt; text-decoration: line-through; margin-left: 2 }\.boe2 { font-family: Verdana; font-size: 10pt; color: #FF0000; margin-left: 2 }\--\/style\/head\body leftmargin50 topmargin50\table border1 width94% cellspacing0 cellpadding0 bordercolor#000000\tr\td width100%\p stylemargin-bottom: -10font faceVerdana size2bDescription/b/font/p\p stylemargin-left: 3; margin-right: 3font faceVerdana size3bYou can use \the PrintWhen expression to change the fontstyles printed based on the values being \printed. In thiscase, the detail line is printed in red for those products whose in stock is below \the reorder level. Also, any products \that have been discontinued are printed in strikeout./b\/font/td \/tr\/table\p /p\p aligncenterimg border0 src..//html/title.jpg width426 height30/p \table border0 width100%\tr\td width41%font faceVerdana size3bProduct/b/font/td\td width17%font faceVerdana size3bIn Stock/b/font/td\td width18%font faceVerdana size3bOn Order/b/font/td\td width24%/td\/tr\/table\table border2 width100% bordercolor#000000 height1 cellspacing0 \cellpadding0\tr\td width100% height1/td\/tr\/table\table border0 width100%scan alldo casecase products.discontinu.t.\tr\td width8%p classboe3##alltr(product_id)##/td\td width33%p classboe3##alltr(prod_name)##/td\td width17%p classboe3##alltr(transform(in_stock))##/td\td width19%p classboe3##alltr(transform(on_order))##/td\td width23%/td\/trcase products.discontinu.f.if in_stockreorder_at\tr\td width8%p classboe1##alltr(product_id)##/td\td width33%p classboe1##alltr(prod_name)##/td\td width17%p classboe1##alltr(transform(in_stock))##/td\td width19%p classboe1##alltr(transform(on_order))##/td\td width23%/td\/trelse\tr\td width8%p classboe2##alltr(product_id)##/td\td width33%p classboe2##alltr(prod_name)##/td\td width17%p classboe2##alltr(transform(in_stock))##/td\td width19%p classboe2##alltr(transform(on_order))##/td\td width23%p classboe2Stock below reorder level of ##alltr(transform(reorder_at))##/td\/trendifendcaseendscan\/table\/body\/htmlSET TEXTMERGE OFFSET TEXTMERGE TO SET TEXTMERGE DELI到现在大功告成了。看上去整个过程很麻烦其实真的很简单——最简单的程序这就是 Visual FoxPro 的特色将很烦的工作封装起来但它与其他开发环境不一样——Visual FoxPro 往往采用“传统”的方式封装非OOP其目的就是给我们最大的灵活性怎样使用演示程序use productsdo buildhtml.prg with c:\vfphtm.htm 请事先复制 title.jpg到C盘根目录上。obrowsecreateobject(InternetExplorer.Application)obrowse.visible.t.obrowse.navigate(file:///c:\vfphtm.htm)将此技术用到其他任务上应用在 XML 上这些天我在学习 XML可扩展的标记名语言技术我认为在不久的未来他一定会成为数据库领域的一个新技术。我写了一个程序可以把Visual FoxPro光标转换成*.xml文件此功能在Visual FoxPro 7中由CursorToXml()函数实现它的应能比我写的程序好多了。我举此例无非是希望大家对 XML的关注、加深对前文的认识最重要的是 XML是很复杂的规范仅以Visual FoxPro 7提供的内置函数恐怕无法涵盖学会自己对XML的控制是大有好处的。当然XML的话题很多、很复杂我们以后还会讨论。以下是对您下载的代码的使用use products 本函数适用于任何的 Visual FoxPro 光标do dbf2xml.prg with products,c:\vfpxml.xml obrowsecreateobject(InternetExplorer.Application)obrowse.visible.t.obrowse.navigate(file:///c:\vfpxml.xml)应用无限想象在您我真的是很喜欢 Visual FoxPro 的这项功能太简单、太伟大了。它的伟大在于应用层面的广泛除了上面的两个例子之外我们可以用它简单的把数据导出而不用那些烦人的低级文件函数还可以在导出数据前对数据进行任意的处理……现在以纯文本形式传递、显示信息已经成为一种大势之所谓大势所趋顺之则昌逆之则亡。Visual FoxPro 的这个招数却是顺应时代的是值得称道的。Visual FoxPro 7 对 SET TEXTMERGE 又做了提高但由于我的 Bate 1 中的帮助中没有明确列示所以我无法告诉大家更多的信息。但可以认为这一功能是新时代的 Visual FoxPro 的一大特色。应用无限想象在您。猫猫的心里话加菲猫的VFP|狐友会社群接收投稿啦加菲猫的VFP用VFP不局限VFP用VFP混合一切。无论是VFP还是JS还是C只要能混合起来都可以发表。商业模式销售技巧、需求规划、产品设计的知识通通可以发表。暂定千字50元红包优秀的文章红包更大一经发表红包到手。如何帮助使用VFP的人用VFP的人有专业的有非专业了很多人其实是小白问出的问题是小白如果问题不对我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看这么简单的问题都不会嘲笑别人不行而无法提出建设性答案是很low的。我们无论工作需要还是有自己的软件都是是需要真正的知识如何让更多人学习真正的VFP知识呢只需要点赞在看能转发朋友圈就更好了。加菲猫的vfp倡导用VFP极简混合开发少写代码、快速出活用VFP但不局限于VFP各种语言混合开发。我已经带领一百多名会员成功掌到VFP的黑科技进入了移动互联网时代接下来我们要进入物联网领域。2026年狐友会社群会员继续招募中社群会员获取的权益有祺佑三层开发框架商业版猫框终身免费升级终身技术支持。开放的录播课程有微信小程序微信公众号开发H5 APP开发Extjs BS开发VFP面向对象进阶VFP中间层开发,VFP Layui 开发源码类资源有支付组件源码短信源码权限组件源码一些完整系统的源码。这个可以单独出售的需要的可以联系我。会员也可以实现群内资源对接可以接分包合作等各项商业或技术业务