如何将rtf格式转为二进制格式?

ekschencn 2003-06-18 11:47:39
如题
...全文
150 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ronaldli 2003-06-18
  • 打赏
  • 举报
回复
上面的程序未经编译,有错误,下面为修正的
procedure RtfToBin(ARtfFile, ABinFile: String);
var
vRE: TRichEdit;
vMS: TMemoryStream;
begin
vRE := TRichEdit.Create(Application);
try
vRE.Visible := False;
vRE.Parent := Application.MainForm;
vRE.Lines.LoadFromFile(ARtfFile);
vMS := TMemoryStream.Create;
try
vRE.Lines.SaveToStream(vMS);
vMS.SaveToFile(ABinFile);
finally
vMS.Free;
end;
finally
vRE.Free;
end;
end;
ronaldli 2003-06-18
  • 打赏
  • 举报
回复
procedure RtfToBin(ARtfFile, ABinFile: String);
var
vRE: TRichEdit;
vMS: TMemoryStream;
begin
vRE := TRichEdit.Create(nil);
try
RichEdit1.Lines.LoadFromFile(ARtfFile);
vMS := TMemoryStream.Create;
try
RichEdit1.Lines.SaveToStream(vMS);
vMS.SaveToFile(ABinFile);
finally
vMS.Free;
end;
finally
vRE.Free;
end;
end;
AaronChengBJ 2003-06-18
  • 打赏
  • 举报
回复
我在
http://expert.csdn.net/Expert/topic/1881/1881120.xml?temp=.6545069
中写了一个将rtf文件转换为二进制流的函数,你可以参考一下
本资源是本人在攥写论文时,收集、整理的,期望对广大的同仁有所帮助! 内容主要包括: word使用技巧;公式编辑技巧;页眉页脚技巧;目录处理技巧;参考文献格式排版技巧,word画图技巧,word转PDF等等。 下面是本资源的详细目录! ============================================= 目录 I 一、利用大纲级别自动生成目录 1 二、使WORD里面的文章自动生成目录 1 (一) 设置标题格式 1 (二) 自动生成目录 1 (三) 更新目录的方法 2 三、自动生成目录图片演示 2 4.用标题1,2,3分别去定义文中的每一章节 4 四、如何自动生成目录? 6 五、奇偶页显示不同内容 7 六、在页眉中显示章编号及章标题内容 7 七、修改页眉中的划线格式 7 八、在页眉和页脚中插入章节号和标题 8 九、分隔符 8 十、目录生成教程 8 十一、怎样使首页不显示页号呢? 9 十二、在word自动生成目录 9 十三、如何用制作出书籍目录效果 10 十四、Word中如何分节 10 1 Word中节的作用 10 2 分节符的使用 11 3分节后的页面设置 11 4分节与页码编号 11 5分节后文档的页眉与页脚的设置方法 11 十五、Word模版的使用 11 十六、Word技巧----Office大赛作品 12 ★输入其他语种特殊符号的方法 12 1.插入符号法 12 2.利用软键盘功能法 12 3.利用英文字体设置 12 ★快速输入大写中文数字 13 ★将姓名按姓氏笔划排序 13 ★在Word中插入当前的日期和时间 13 ★锁定插入的日期和时间 13 ★利用合并字符功能设置上下标 13 ★使用⑩以上的数字序号 14 ★使用格式刷重复复制格式 14 ★利用拖放的方式复制网页 14 ★利用不间断空格使两个单词保持在同一行文字里 14 ★让光标在段落间快速移动 14 ★巧用“选择性粘贴”中的“无格式文本” 14 ★快速显示文字格式 14 ★在Word中用另类方法复制文本 15 ★去除自动添加的超级链接 15 ★快速插入一对大括号 15 ★在Word2002中选择多个文档区域 15 ★禁用智能标记 15 ★WORD字体随身携带 15 ★为WORD文本加注解 16 ★快速输入特定的短语 16 ★特殊符号的输入 17 ★使用通配符进行模糊替换 17 ★Word文档与RTF文档的互换问题 17 ★如何将Word文档转换成为幻灯片 17 ★使用Word字体隐藏功能制作模板 18 ★在没有安装Word的计算机上查看文档 18 ★换页时不再频繁敲回车键 18 ★Word“分节”的妙用 18 ★为部分文档创建不同的页眉或页脚 19 ★Word文档转换为HTML文档后的变化 19 ★修改Word2000标尺 20 ★微调各边距 20 ★用键盘选定表格中的项目 20 ★巧用Alt键调整表格 21 ★修改表格的垂直对齐方式 21 ★将公式完整显示出来 21 ★增加、删除和显示全部菜单命令 21 ★摒弃“智能菜单”功能 22 ★在屏幕提示中显示快捷键 22 ★快速删除Word不常用的按钮和菜单 22 ★更改菜单打开方式 22 ★更改默认的度量单位 22 ★将同一高度和宽度应用于不同对象 23 ★添加更多的智能标记 23 ★不在任务栏上显示多余文档图标 23 ★自动滚动,我可以 23 ★让文档中的图片更瘦一些 23 ★让WordXP的启动随心所欲 24 ★使用手写识别功能 24 ★Word快捷键 24 ★用Word绘图时如何选择多个对象 26 ★绘图技巧 26 ★综合利用各种艺术效果 27 ★自定义新符号 27 ★2字变13字的进化 27 ★怎样防止打印信封时打偏 28 ★如何在其它计算机上打印含有本机特有字体的文件 28 ★在Word中打印海报 28 ★Word的复印机缩放功能 29 ★Word的复印机缩放功能 29 ★将图片移到合适的位置 30 ★Ctrl在绘图中的作用 30 ★去除绘图时出现的画布 30 ★如何对齐图形 30 ★如何微调图形及图像的位置 30 ★域锁定导致域结果不能正常更新 30 ★打印出的日期有误 31 ★超级链接的直接插入 31 ★利用自动更正功能将网址转化为超级链接 31 ★清除超级链接的下划线 32 ★更改超级链接文字的外观 32 ★取消超级链接的转换 32 ★怎样创建自己的电子邮件签名或电子邮件信 32 ★怎样用Word在网上开会 33 ★给会议来点Web讨论 33 ★用剪贴板的内容进行替换 33 ★十进制字符与Unicode字符的转换 34 ★巧用“修订”功能帮朋友修改文章 34 ★利用超级链接快速调出指定文档 34 ★利用摘要功能快速显示摘要 35 ★在Word中记录保存时间 35 ★如何将Word2000当字典使用 35 ★如何查看和清空剪贴板 35 ★在Word中通过传真发送文档 36 ★如何执行“全部保存” 36 ★让Word与WPS“资源共享” 36 ★怎样取得与真实打印完全一致显示效果 37 十七 Word绘制图形技巧 38 (一) 绘制图形的技巧 38 1.画直线 38 2.画弧 38 3.画矩形 38 (二) 选择图形的技巧 38 (三) 改变图形大小的技巧 38 1.改变某条线段的长短 38 2.改变图形(或图片)的大小 38 (四) 移动图形的技巧 39 (五) 使用绘图工具的技巧 39 (六) 绘图精度的提高 39 (七) 拓展绘图功能 39 (八) 用画图和Word软件为图片减肥的技巧 39 1、借用“画图”软件,进行便利“减肥” 39 2、借用“Word”软件,进行批量“减肥” 40 十八、页眉对齐技巧 41 十九、用Word画图功能做出五星红旗 42 二十、用Word小技巧 45 1.一次保存多个文件 45 2.快速组合多个对象 45 3.快速回到上次编辑的位置 46 4.快速更改英文的大小写 46 5.输入直引号(') 46 二十一、一页关联两个页码小技巧 46 二十二、多图片文档的快速浏览小技巧 47 二十三、表格小技巧 48 (一) 绘制表格 48 (二) 插入表格 52 二十四、不同页眉小技巧 53 1、如何在同一文档中创建不同的页眉 53 2、如何去除页眉中的横线 53 二十五、电子图书馆文章转为Word文档 54 1、PDF文件的识别 54 2、caj文件的识别: 55 3、超星文件的识别: 55 4、其他情况下的识别: 55 二十六、拆分窗口 56 二十七、标题自动到页眉 57 二十八、word制作日历 58 二十九、表格超界问题 59 三十、 word:公式编号右对齐 59 方法1:如何设置右对齐公式和题注号 60 方法2:如何设置左对齐公式 61 方法3:如何设置居中的公式 61 三十一、拼音位置 62 三十二、密码破解 62 1、破解Word密码不是梦 62 2、Excel也别跑 63 三十三、PDF转DOC 64 三十四、解密高手 64 三十五、公式宽度 66 全部一次调整 67 局部调整方法 67 三十六、自定义模板 自动生成指定的Word文件名 68 三十七、从头到脚完美:Word文档布局 69 三十八、文件夹的内容生成文件 70 三十九、参考文献的标注 70 1、如何在word文档中加进参考文献的标注 70 2、省时省力——写论文时如何利用word编辑参考文献 71 3、如何在Word中编辑参考文献 72 4、关于[1][2][3]类的脚尾注格式问题,与各位分享(修改) 73 5、利用word中的交叉引用来实现科技论文参考文献的引用 73 6、用word处理参考文献的最简单的方法 74 四十、word 使用技巧大全 75 之一 75 巧妙控制OfficeWord中的“孤行” 75 Word中表格快速一分为二: 75 在Excel中输入人名时使用“分散对齐” 77 之二 78 1、硬回车键的使用 78 2、使同行中选定的文字垂直提升或降低位置 78 3、给文档中的文字添加效果 78 4、给文本添加“文本框” 78 5、窗口拆分 79 6、使超出整页的几行文字合并到前页 79 7、新建自动图文集,用于快速输入文字 79 8、密码保存功能 79 9、不间断空格 79 10、调整下划线与文字之间的距离 79 之三 81 快速将文档转换成图片 81 WORD中如何输入分数 83 在word编辑中经常要调整字体大小 83 使Word中的字体变清晰Word文档中使用“仿宋”字体很淡,可按以下方法使字体更清晰: 84 四十一、word和execl使用技巧 84 1、Word下如何使用着重号 84 2、让Word表格快速一分为二 84 3、Word中巧用Alt键 85 4、巧用定位选条件单元格 85 5、在不同单元格快速输入同一内容 85 6、快速返回上次编辑点 85 7、多个单元格数据巧合并 85 8、Excel中巧用双击定位 85 9、Word准确移动文本 85 10、“相中”垂直文本块 85 11、Excel避免计算误差 85 12、让Word打印自动按序排列 86 13、Excel中快速绘制文本框 86 14、快速更改英文大小写 86 15、让窗口这样固定 86 16、快速输入省略号 86 17、轻松搞定单元格数据斜向排 86 18、快速去掉页眉的横线 86 19、为奇偶页制作不同的水印 86 20、快捷绘图 87 21、快速去除超链接 87 22、如何避免标题排在一页的底部 87 23、如何将文档中的某一页改为横向 87 24、如何将一个表格垂直拆分为两个的表格 87 25、巧用Word的扩展选定功能 87 26、Excel单元格多于15位数字的输入 87 27、Word中磅与厘米的换算 87 28、计算机中容量单位的换算 88 29、在Excel中复制上一单元格 88 30、清除拼写功能 88 31、Word表格后空白页的处理 88 32、改变图片形状 88 33、编辑线段顶点 88 34、开关网格线 88 35、在Word中快速改变行距 88 36、在Word中快速选取段落 88 37、在Excel中实现自动换行 89 38、汉字输入法的若干诀窍 89 39、用Word2000对称页边距进行双面打印 89 40、Excel玩“转置” 89 41、Excel轻松排序 89 42、Word中实现表格标题重复 89 43、Excel中实现表格标题分页打印 89 45、Word读书消除疲劳小技巧 89 46、给含公式的单元格点颜色看看 90 47、行首列尾随点随到 90 48、表格一次删个光 90 49、Word文档快速查找 90 50、几秒钟自动生成目录 90 51、在Word快速输入化学方程式 90 51、Word的两种水印 90 52、Word中画直线及精确调整图形的技巧 90 53、在Word文本框间创建“文字流” 91 54、迅速得出Word表格的行列数 91 55、我用Word来拆字 91 56、批量写贺卡和信封 91 57、Word中巧输星期 91 58、输入带圈字符 91 59、过滤网页内容 91 60、快速转换大写金额 92 61、去掉自动编号功能 92 62、去除绘图时出现的画布 92 63、巧用“格式刷” 92 64、部分加粗表格线 92 65、隐藏累赘的文字 92 66、长文档前后比照有妙招 92 67、让标尺自动出现 92 68、轻松设置特大特小字 92 69、巧调Word字符间距 93 70、按“Alt+Shift+P”组合键自动插入页码 93 71、A4两页内容妙“嫁”A3页 93 72、巧用“单色打印” 93 73、巧妙计算公式中的部分值 93 74、快速选定“空白”和“数据”单元格 93 75、让字符站起来 93 76、只给文字加下划线 93 77、Excel中消除0值 94 78、快速输入间隔号 94 79、巧用特殊符号绘制分隔线 94 80、用“Alt+Enter”快速重输 94 81、文字旋转轻松做 94 82、用分节符设置混合版面 94 83、Excel中插入连续空白行 94 84、Excel快速输入大写中文数字 94 85、多个工作表的页眉和页脚同时设置 95 86、判断成绩等级和统计各分数段人数 95 87、快速访问经常使用的文档 95 88、打造整齐的Word公式 95 89、快速精确调整表格宽度 95 90、改变文本框的形状 96 91、禁止Word中图形随段落移动 96 92、三种好学有用的Excel函数应用 96 94、字体大小任我调 96 95、复制Word格式又一法 96 96、大文档的页码编排 96 97、让你受益终身的10个word的使用技巧 97 98 其他常用技巧 98 99、Word中查找/替换通配符和代码 101 四十三、Word中公式编辑器的使用技巧 104 1、公式编辑器的启动与退出 104 四十四、Word文档设置多个不同的页眉页脚 107 四十五、Word 快捷键 108 四十六、Word 通配符 110 四十六、Word小技巧 111 1、在Word中插入当前的日期和时间 111 2、利用不间断空格使两个单词保持在同一行文字里 112 3、让光标在段落间快速移动 112 4、选择多个文档区域 112 5、使用通配符进行模糊替换 112 6、换页时不再频繁敲回车键 112 7、微调各边距 113 8、用键盘选定表格中的项目 113 9、巧用Alt键调整表格 113 10、修改表格的垂直对齐方式 113 11、增加、删除和显示全部菜单命令 114 12、在屏幕提示中显示快捷键 115 13、不在任务栏上显示多余文档图标 115 14、让文档中的图片更瘦一些 116 15、Word的复印机缩放功能 116 16、将图片移到合适的位置 117 17、怎样用Word在网上开会 117 1)安排会议 117 2)现在开会 118 3)给会议来点Web讨论 118 17、巧用“修订”功能修改文章 118 18、在Word中通过传真发送文档 119 19、如何执行“全部保存” 119 四十七、页眉页脚 120 1、奇偶页眉不一样 120 2、首页不显示页眉,显示页脚 120 3、取消页眉的边框格式 121 4、改变页眉的样式 121 5、修改“页眉”样式 121 6、取消页眉的边框格式 122 7、和页眉横线“永别” 122 四十八、Office技巧集锦——WORD篇 122 1.“文本框”也能输入多重幂指数 122 2.怎样关闭拼写错误标记 122 3.附加段落格式的去除 123 4.附加字符格式的去除 123 5.巧用多级列表功能编号 123 6.解决“公式编辑器”调入速度慢的问题 123 7.插入其它语种的特殊符号 124 1) 插入符号法 124 2) 利用软键盘功能法 124 3) 利用英文字体设置 124 8.快速输入大写中文数字 124 9.在Word中插入当前的日期和时间 124 10.锁定插入的日期和时间 124 11.利用合并字符功能设置上下标 125 12.使用⑩以上的数字序号 125 13.使用格式刷重复复制格式 125 14.利用拖放的方式复制网页 125 15.利用不间断空格使两个单词保持在同一行文字里 125 16.让光标在段落间快速移动 125 17.巧用“选择性粘贴”中的“无格式文本” 125 18.快速显示文字格式 126 19.在Word中用另类方法复制文本 126 20.快速输入特殊符号 126 21.去除自动添加的超级链接 126 22.快速插入一对大括号 126 23.在Word2002中选择多个文档区域 126 24.禁用智能标记 127 25.WORD字体随身携带 127 26.为WORD文本加注解 127 27.快速输入特定的短语 127 28.特殊符号的输入 128 29.使用通配符进行模糊替换 128 30.使用Word字体隐藏功能制作模板 128 31.在没有安装Word的计算机上查看文档 129 32.换页时不再频繁敲回车键 129 33.Word“分节”的妙用 129 34.为部分文档创建不同的页眉或页脚 129 35.Word文档转换为HTML文档后的变化 130
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>... <#else> ... 例子如下: <#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>中年人 <#elseif (age>20)>青年人 <#else> 少年人 输出结果是:青年人 上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. <#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today. <#else> Pythons are not cheaper than elephants today. 2、 switch , case , default , break指令 这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... 3、 list, break指令 list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下: <#list sequence as item> ... 上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:当前变量的索引值 item_has_next:是否存在下一个对象 也可以使用<#break>指令跳出迭代 例子如下: <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x_index + 1}.${x}<#if x_has_next>, <#if x="星期四"><#break>

We have these animals:

NamePrice <#list animals as being>
${being.name}${being.price} Euros
输出为:

We have these animals:

NamePrice
mouse50 Euros
elephant5000 Euros
python4999 Euros
4、include指令 include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: <#include filename [options]> 在上面的语法格式中,两个参数的解释如下: filename:该参数指定被包含的模板文件 options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. Test page

Test page

Blah blah... <#include "/copyright_footer.html"> 5、 import指令 该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下: <#import "/lib/common.ftl" as com> 上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中. 创建库 ? 下面是一个创建库的例子(假设保存在lib/my_test.ftl中): <#macro copyright date>

Copyright (C) ${date} Julia Smith. All rights reserved.
Email: ${mail}

<#assign mail = "jsmith@acme.com"> ? 使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量: <#import "/lib/my_test.ftl" as my> <#assign mail="fred@acme.com"> <@my.copyrightdate="1999-2002"/> ${my.mail} ${mail} 输出结果:

Copyright (C) 1999-2002 Julia Smith. All rights reserved.
Email: jsmith@acme.com

jsmith@acme.com fred@acme.com 可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: <#import "/lib/my_test.ftl" as my> ${my.mail} <#assign mail="jsmith@other.com" in my> ${my.mail} l 输出结果: jsmith@acme.com jsmith@other.com l 数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: <#macro copyright date>

Copyright (C) ${date} ${user}. All rights reserved.

<#assign mail = "${user}@acme.com"> l 假设数据模型中的user变量的值是Fred,则下面的代码: <#import "/lib/my_test.ftl" as my> <@my.copyright date="1999-2002"/> ${my.mail} l 输出结果:

Copyright (C) 1999-2002 Fred. All rights reserved.

1.6 算术运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码: <#assign x=5> ${ x * x - 100 } ${ x /2 } ${ 12 } 输出结果是: -75 2.5 2 在表达式中使用算术运算符时要注意以下几点: 1,运算符两边的运算数字必须是数字 2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35 使用内建的int函数可对数值取整,如: <#assign x=5> ${ (x/2)?int } ${ 1.1?int } ${ 1.999?int } ${ -1.1?int } ${ -1.999?int } 结果是:2 1 1 -1 -1 1.7 比较运算符 表达式中支持的比较运算符有如下几个: 1. =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. >或者gt:判断左边值是否大于右边值 4. >=或者gte:判断左边值是否大于等于右边值 5. <或者lt:判断左边值是否小于右边值 6. <=或者lte:判断左边值是否小于等于右边值 注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比 较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)> 1.8 逻辑运算符 逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误 1.9 内建函数 FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数: html:对字符串进行HTML编码 cap_first:使字符串第一个字母大写 lower_case:将字符串转换成小写 upper_case:将字符串转换成大写 trim:去掉字符串前后的空白字符 下面是集合的常用内建函数 size:获取序列中元素的个数 下面是数字值的常用内建函数 int:取得数字的整数部分,结果带符号 例如: <#assign test="Tom & Jerry"> ${test?html} ${test?upper_case?html} 结果是:Tom & Jerry TOM & JERRY 1.10 空值处理运算符 FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值 的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变 量完全相同. 为了处理缺失变量,FreeMarker提供了两个运算符: !: 指定缺失变量的默认值 ??: 判断某个变量是否存在 其中,!运算符的用法有如下两种: variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象. 使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false ########################### 最常用的概念 1、 scalars:存储单值 字符串:简单文本由单或双引号括起来。 数字:直接使用数值。 日期:通常从数据模型获得 布尔值:true或false,通常在<#if …>标记中使用 2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字 具有一个唯一的查询名字和他包含的每个变量相关联。 3、 sequences:充当其它对象的容器,按次序访问 使用数字和他包含的每个变量相关联。索引值从0开始。 4、 集合变量: 除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由<#list...>指令使用的受限sequences。 5、 方法:通过传递的参数进行计算,以新对象返回结果 方法变量通常是基于给出的参数计算值在数据模型中定义。 6、 用户自定义FTL指令:宏和变换器 7、 节点 节点变量表示为树型结构中的一个节点,通常在XML处理中使用。 在模板里对sequences和hashes初始化 sequences 1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”} 注释标志 <#-- 这里是注释 --> 旧版本的freemarker采用的是<#comment> 注释 方法 sequences内置方法 sequence?first 返回sequence的第一个值;前提条件sequence不能是null sequence?last 返回sequence最后一个值 sequence?reverse 反转sequence的值 sequence?size 返回sequence的大小 sequence?sort 对sequence按里面的对象toString()的结果进行排序 sequence?sort_by(value) 对sequence 按里面的对象的属性value进行排序 如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性 sequence?sort_by(name) 表示所有的user按user.name进行排序 hashes内置方法 hash?keys 返回hash里的所有keys, 返回结果类型sequence hash?values 返回hash里的所有value, 返回结果类型sequence 模板 使用FTL(freeMarker模板语言)编写 组成部分 一、整体结构 1、注释:<#--注释内容-->,不会输出。 2、文本:直接输出。 3、interpolation:由 ${var} 或 #{var} 限定,由计算值代替输出。 4、FTL标记 二.表达式 1、直接指定值: 1-1、字符串: 由双引号或单引号括起来的字符串,其中的特殊字符(如' " \等)需要转义。 1-2、raw字符串: 有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"/${data}"year""}屏幕输出结果为:/${data}"year" 转义 含义 序列 \" 双引号(u0022) \' 单引号(u0027) \\ 反斜杠(u005C) \n 换行(u000A) \r Return (u000D) \t Tab (u0009) \b Backspace (u0008) \f Form feed (u000C) \l < \g > \a & \{ { \xCode 4位16进制Unicode代码 1-3、数字:直接输入,不需要引号 1)、精度数字使用“.”分隔,不能使用分组符号 2)、目前版本不支持科学计数法,所以“1E3”是错误的 3)、不能省略小数点前面的0,所以“.5”是错误的 4)、数字8、+8、08和8.00都是相同的 1-4、布尔值:true和false,不使用引号 1-5、序列:由逗号分隔的子变量列表,由[]方括号限定。 1)、子变量列表可以是表达式 2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。 1-6、散列(hash) 1)、由逗号分隔的键/值列表,由{}大括号限定,键和值之间用冒号分隔,如:{"key1":valu1,"key2":"character string"....} 2)、键和值都是表达式,但是键必须是字符串。 2、获取变量: 2-1、顶层变量:${变量名} 变量名只能是字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。 2-2、散列:有两种方法 1)、点语法:变量名字和顶层变量的名字受同样的限制 2)、方括号语法:变量名字无限制,可以是任意的表达式的结果 book.author.name book.author.["name"] book["author"].name book["author"]["name"] 以上是等价的。 2-3、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用 [startindex..endindex]语法获取序列片段。 2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。 3、字符串操作 3-1、interpolation:使用${}或#{}在文本部分插入表达式的值,例如: ${"hello${username}!"} ${"${username}${username}${username}"} 也可以使用+来获得同样的结果: ${"hello"+username+"!"} ${username+username+username} 注意:${}只能用于文本部分而不能出现于标记内。 <#if ${user.login}>或<#if "${user.login}">都是错误的; <#if user.login>是正确的。 本例中user.login的值必须是布尔类型。 3-2、子串: 举例说明:假如user的值为"Big Joe" ${user[0]}${user[4]}结果是:BJ ${user[1..4]}结果是:ig J 4、序列操作 4-1、连接操作:可以使用+来操作,例如: ["title","author"]+["month","day"] 5、散列操作 5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如: {"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。 6、算术运算 6-1、操作符:+、-、*、/、% 除+号以外的其他操作符两边的数据,必须都是数字类型。 如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。 6-2、比较操作符: 1}、= 2}、== 3}、!= 4}、< 5}、<= 6}、> 7}、>= 1-3的操作符,两边的数据类型必须相同,否则会产生错误 4-7的操作符,对于日期和数字可以使用,字符串不可以使用。 注意: 1}、FreeMarker是精确比较,所以"x" "x " "X"是不等的。 2}、因为<和>对FTL来说是开始和结束标记,所以,可以用两种方法来避免这种情况: 一种是使用括号<#if (a 另一是使用替代输出,对应如下: < lt <= lte > gt >= gte 6-3、逻辑操作符:只能用于布尔值,否则会出现错误。 &&(and)与运算 ||(or)或运算 !(not)非运算 6-4、内建函数:使用方法类似于访问散列的子变量,只是使用?代替.例如:${test?upper_case?html} 常用的内建函数列举如下: 1}、字符串使用: html:对字符串进行HTML编码 cap_first:字符串第一个字母大写 lower_first:字符串第一个字母小写 upper_case:将字符串转换成大写 trim:去掉字符前后的空白字符 2)、序列使用: size:获得序列中元素的数目 3)、数字使用: int:取得数字的整数部分 7、操作符的优先顺序: 后缀:[subbarName][subStringRange].(mathodParams) 一元:+expr、-expr、! (not) 内建:? 乘法:*、/、% 加法:+、- 关系:<、<=、>、>= (lt、lte、gt、gte) 相等:=、==、!= 逻辑与:&& (and) 逻辑或:|| (or) 数字范围:.. 四、interpolation inperpolation只能用于文本,有两种类型:通用interpolation及数字interpolation 1、通用interpolation 如${expr} 1-1、插入字符串值:直接输出表达式结果。 1-2、插入数字值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: <#setting number_format="currency" /> <#assign answer=42 /> ${answer} <#-- ¥42.00 --> ${answer?string} <#-- ¥42.00 --> ${answer?string.number} <#-- 42 --> ${answer?string.currency} <#-- ¥42.00 --> ${answer?string.percent} <#-- 42,00% --> 1-3、插入日期值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: ${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")} <#-- 2003-04-08 21:24:44 Pacific Daylight Time --> ${lastupdata?string("EEE,MMM d, ''yy")} <#-- tue,Apr 8, '03 --> ${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")} <#-- Tuesday,April 08, 2003, 09:24:44 PM (PDT)--> 1-4、插入布尔值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation 如: <#assign foo=ture /> ${foo?string("yes","no")} <#-- yes --> 2、数字interpolation: 有两种形式: 1)、#{expr} 2)、#{expr;format}:format可以用来格式化数字,format可以是如下: mX:小数部分最小X位 MX:小数部分最大X位 例如: <#assign x=2.582 /> <#assign y=4 /> #{x;M2} <#-- 2.58 --> #{y;M2} <#-- 4 --> #{x;m1} <#-- 2.582 --> #{y;m1} <#-- 4.0 --> #{x;m1M2} <#-- 2.58 --> #{y;m1M2} <#-- 4.0 --> 宏 宏和变换器变量是两种不同类型的用户自定义指令,他们的区别是: 宏可以在模板中用macro指令来定义 变换器是在模板外由程序定义 1、宏:和某个变量关联的模板片段,以便在模板中通过用户自定义指令使用该变量 1-1、基本用法: 例如: <#macro greet> Hello JOE! 使用时: <@greet> 如果没有体内容也可以用 <@greet /> 1-2、变量: 1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如: <#macro greet person> Hello ${person}! 使用时: <@greet person="emma"> and <@greet person="LEO"> 输出为: Hello emma! Hello LEO! 注意:宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。 宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏中定义的参数,并且对所有参数赋值。如: <#macro greet person color> Hello ${person}! 使用时: <@greet color="black" person="emma" />正确 <@greet person="emma" />错误,color没有赋值,此时,如果在定义宏时为color定义缺省值<#macro greet person color="black">这样的话,这个使用方法就是正确的。 <@greet color="black" person="emma" bgcolor="yellow" />错误,宏greet定义中未指定bgcolor这个参数 2、嵌套内容: 2-1、自定义指令可以有嵌套内容,使用<#nested>指令,执行自定义指令开始和结束标记之间的模板片段。例如: <#macro greet> <#nested> <@greet>hello Emma! 输出为 hello Emma! 2-2、<#nested>指令可以被多次调用,例如 <#macro greet> <#nested> <#nested> <#nested> <#nested> <@greet>hello Emma! 输出为 hello Emma! hello Emma! hello Emma! hello Emma! 2-3、嵌套的内容可以是有效的FTL,例如: <#macro welcome> <#nested> <#macro greet person color="black"> Hello ${person}! <@welcome> <@greet person="Emma" color="red" /> <@greet person="Andrew" /> <@greet person="Peter" /> 输出为: Hello Emma! Hello Andrew! Hello Peter! 2-4、宏定义中的局部变量对嵌套内容是不可见的,例如: <#macro repeat count> <#local y="test" /> <#list 1..count as x> ${y}${count}/${x}:<#nested /> <@repeat count=3> ${y?default("?")} ${x?default("?")} ${count?default("?")} 输出结果为 test 3/1:??? test 3/2:??? test 3/3:??? 2-5、在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。 例如: <#macro repeat count> <#list 1..count as x> <#nested x,x/2,x==count /> <@repeat count=4;c,halfc,last> ${c}. ${halfc} <#if last> last! 输出结果是 1. 0.5 2. 1 3. 1.5 4. 2last! 注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时,少指定循环变量,多指定的值会不见 调用时,多指定循环变量,多余的循环变量不会被创建 二、在模板中定义变量 1、在模板中定义的变量有三种类型 1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 1-2、局部变量:在宏定义体中有效,使用local指令创建和替换。 1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。 注意: 1)、宏的参数是局部变量,不是循环变量。 2)、局部变量隐藏同名的plain变量 3)、循环变量隐藏同名的plain变量和局部变量。 例如: <#assign x="plain"> 1. ${x} <#-- plain --> <@test /> 6. ${x} <#list ["loop"] as x> 7. ${x} <#-- loop --> <#assign x="plain2"> 8. ${x} <#-- loop --> 9. ${x} <#-- plain2 --> <#macro test> 2. ${x} <#-- plain --> <#local x="local"> 3. ${x} <#-- local --> <#list ["loop"] as x> 4. ${x} <#-- loop --> 5. ${x} <#-- local --> 4)、内部循环变量隐藏同名的外部循环变量 <#list ["loop1"] as x> ${x} <#-- loop1 --> <#list ["loop2"] as x> ${x} <#-- loop2 --> <#list ["loop3"] as x> ${x} <#-- loop3 --> ${x} <#-- loop2 --> ${x} <#-- loop1 --> 5)、模板中的变量会隐藏数据模型中的同名变量,如果需访问数据模型中的变量,使用特殊变量global。 例如: 假设数据模型中的user值为Emma <#assign user="Man"> ${user} <#-- Man --> ${.global.user} <#-- Emma --> macro, nested, return 语法 <#macro name param1 param2 ... paramN> ... <#nested loopvar1, loopvar2, ..., loopvarN> ... <#return> ... 用例 <#macro test foo bar="Bar"[A1] baaz=-1> Test text, and the params: ${foo}, ${bar}, ${baaz} <@test foo="a" bar="b" baaz=5*5-2/> <@test foo="a" bar="b"/> <@test foo="a" baaz=5*5-2/> <@test foo="a"/> 输出 Test text, and the params: a, b, 23 Test text, and the params: a, b, -1 Test text, and the params: a, Bar, 23 Test text, and the params: a, Bar, -1 定义循环输出的宏 <#macro list title items> ${title?cap_first}:

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧