rtf模板常用技巧

以下是一些在开发XMLP(BIP)报表的时候,开发RTF模版的一些技巧:
1、word表格
做RTF模版的时候,采用word中的表格来进行设计,下面的几点很重要:
(1)标题行重复,可以实现新页重复标题。
(2)嵌套表格、行列合并、边框、底纹,可以实现特殊的布局。
(3)固定列宽、自动调整、禁止跨页断行,可以实现一些严格的布局控制。
2、行截断与禁止折行
单据打印中对格式的要求比较高,如果某一行过长或者出现多次折行,就会破坏版面,尤其是套打等要求较高的场合,这里把各种方法作个小结。其实,这个地方更网页开发很像,是否换行输出就跟html中的word-wrap和word-break非常类似,可以参见《word-wrap和word-break的区别》,如果要设置超出显示,也几乎跟css中的overflow:hidden是一样的。
(1)Word功能,不理想
固定列宽功能可以用,但固定行高不行,虽然设计时看到“固定”了,如果不加控制,运行后多出列宽的数据会自动折行。
(2)单行+截断,即控制只有以一行,多余截断,禁止折行。
在字段的后面,再加如下两个命令:
<xsl:attribute xdofo:ctx="block" name="wrap-option">no-wrap</xsl:attribute>
<xsl:attribute xdofo:ctx="block" name="overflow">hidden</xsl:attribute>
(3)多行+截断,难
如固定显示3行,多余部分截断,目前通过模版无法实现,只有在数据源中先将数据截至刚好3行的字符数,然后利用自动折行功能。这里还要注意空格,如果遇到空格,后面的单词又显示不下,将会提前自动折行。
3、条件格式化
在不同的条件下显示不同的颜色、不同的列数、不同的标题、不同的布局风格等等,这些都属于条件格式化,需要借助IF命令。
(1)比如不同币种凭证打印格式不同:
<?if:CURRENCY_CODE="CNY"?>任何布局<?end if?>
<?if:CURRENCY_CODE!="CNY"?>任何布局<?end if?>
(2)比如货币为CNY时才显示列,在目标列的单元格内写如下语句:
<[email protected]:CURRENCY_CODE="CNY"?>字段值和格式<?end if?>
注:这还不是真正的动态列。
(3)比如偶数行底色为灰色,在行的任何单元格内写如下语句:
<[email protected]:position() mod 2=0?>
<xsl:attribute xdofo:ctx="incontext" name="background-color">gray</xsl:attribute>
<?end if?>
<?if:position() mod 2=0?>
<xsl:attribute xdofo:ctx="incontext" name="background-color">gray</xsl:attribute>
<?end if?>
注意position()的意义,position()表示的是在XML数据源文件中,该条数据所处该组中全部数据中的位置,比如如果该组有10个明细行要显示,当显示到第三个明细行的时候,position()的值就是3。还有一个last(),该前面那个例子中,last()的值就是10,即最后一个明细行,有时候会用position()=last()来判断是否已经把全部明细行都显示了,非常有用。上面的那两段代码,加了@row则会使得该行全部变色,如果没有加,就表示只对加了该段代码的单元格变色。
(4)比如超过100单元格呈红色,在目标单元格内写如下语句:
<?if:QUANTITY>100?>
<xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute>
<?end if?>
4、字段计算建议做法
(1)计算字段可以先在SQL中完成。
(2)如果使用Oracle Reports做数据源,那么计算字段、统计字段也可以先完成。
(3)在SQL中的数据,都不带格式,格式在模版中设置;需要在模版中完成计算的字段,必须不带格式,主要指数字不能带千位符号。
5、组内合计
N: Template Builder/插入/字段
向导可以完成基本的统计,目前支持分组内的:Sum、Count、Min、Max、Avarage。
自动生成的代码示例:
<?sum (QUANTITY)?>
6、页内合计
要实现本页合计数,需分两步:声明合计变量、显示合计变量(可带格式)。
(1)对QUANTITY进行本页合计,声明变量QTYTOTAL,注意写在QUANTITY对应的组内,不然引用不到。
<?add-page-total:QTYTOTAL;’QUANTITY’?>
(2)可在任意地方显示合计数
<?show-page-total:QTYTOTAL?>
7、累计数
累计每行数字,实际上是这样完成的:先声明一个变量,初始化为0;累加;在需要的地方显示累计。
(1)在分组标记前初始化,Set变量。
<?xdoxslt:set_variable($_XDOCTX,’RTotalVar’, 0)?>
(2)计算累计值,通常写在欲累计的字段同一单元格内,比如下面的QUANTITY。
<?xdoxslt:set_variable($_XDOCTX, ‘RTotalVar’, xdoxslt:get_variable($_XDOCTX,’RTotalVar’) + QUANTITY)?>
(3)任意地方显示累计值,Get变量。
<?xdoxslt:get_variable($_XDOCTX,’RTotalVar’)?>
8、新组分页
下面几种方式都可以实现新组分页,下面的序号是表示方法,不是步骤:
(1)分组声明中加@section,如下:
<[email protected]:G_PO_HEADER?>
(2)<?end for-each?>前加<?split-by-page-break:?>。
(3)<?end for-each?>前加<xsl:attribute name="break-after">page</xsl:attribute>,此法下RTF最后无空白页,但PDF有空白页。
(4)<?end for-each?>前加<xsl:attribute name="break-before">page</xsl:attribute>此法下RTF、PDF最后都有空白页。
见得比较多的是直接用(1)的方法。
9、条件分页、固定行分页
(1)任意条件分页,需要借助IF + 上面的break-after或者break-before,如:
<?if:CURRENCY_CODE="CNY"?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>
(2)固定行分页,需要借助IF + 上面的break-after或者break-before,在行<?end for-each?>前,如下语句控制每页5行:
<?if:position() mod 5 =0?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>
10、页眉页脚
(1)标准的页眉页脚,即单个页眉页脚,使用Word的功能即可。
(2)扩展的页眉页脚,可使用<?start:body?><?end body?>把主体部分“框”起来,凡是在这两个标记之外的东西,都将被当作页眉页脚。
11、页码和页数
(1)可以利用word的功能,在任意地方插入页码,这个是“自然页码”。
(2)如果在某种情况下想让页码从特定值开始,比如新组页码重新编号,则需要借助命令,如在for-each后写:<?initial-page-number:1?>。这里的1,实际上也可以用数据文件中的XML元素来替换。
12、末页、奇偶页不同
(1)Word可在页眉页脚部分实现首页不同或奇偶页不同,没法实现末页不同,即使借助代码控制,实际实现的也是末页布局不同,而非“页眉页脚”不同。
<[email protected]:body?><?end body?>
报表本身仅有一页时,则用:
<[email protected]:body?><?end body?>
注意布局需要独立成页,即之前需要加分页符。
(2)以偶数页结束,主要目的是显示偶数页页眉页脚。
<?section:force-page-count;’end-on-even-layout’?>
如果仅显示空白页,则用:
<?section:force-page-count;’end-on-even’?>
(3)以奇数页结束,主要目的是显示奇数页页眉页脚。
如果仅显示空白页,则用:
<?section:force-page-count;’end-on-odd’?>
13、超链接
可以直接利用word功能设置超链接,也可以在链接地址中,全部或部分引用XML数据文件中的标记,做到动态超链接:
{SUPPLIER_SITE_URL}或者http://abcd.efg.com:8000/OA_MEDIA/{CURRENCY_CODE}.gif
14、图片
可以直接利用Word功能插入图片,也可以仅将该图片当作占位图,在图片的“设置图片格式”的网站标签页内的“可选文字”,可参考《word技巧:设置图片格式》,输入真正的图片地址:
(1)来自网站的图片:url:{‘http://localhost:8000/OA_MEDIA/forms_logo.gif‘}
(2)来自EBS的图片:url:{‘${OA_MEDIA}/forms_logo.gif‘}
(3)动态指定地址:url:{IMAGE_URL}
(4)动态拼接的地址:url:{concat(SERVER,‘/‘,IMAGE_DIR,‘/‘,IMAGE_FILE)}
(5)直接来自内容为BLOB的XML元素,仅用于“Data Templates”:
<fo:instream-foreign-object content-type="image/jpg">
<xsl:value-of select="IMAGE_ELEMENT"/>
</fo:instram-foreign-object>
15、图表
可使用Template Builder向导插入图表,类型有:条形图-垂直、条形图-水平、饼图、线形图。向导生成的代码,可在图片的“设置图片格式”网站标签页内的“可选文字”里看到,我们可以做进一步修改。
16、字段引用
在前面的窗体域中,我们直接引用XML文件中的Tag标记,如<?QUANTITY?>。这种对XML元素的引用,是相对当前层次的组来说;如果上层组中,有个同名Tag,就要通过类似“相对路径”的方式引用,如<?../QUANTITY?>。这里的“../”个数,不是布局中的相对层测个数,而是XML数据文件中的相对层次!详细可参见《Oracle BI Publiser报表开发中的路径、层级问题》。
17、函数引用
(1)行号,准确讲是分组中记录顺序号:<xsl:value-of select="position()"/>
(2)总行号:<xsl:value-of select="last()"/>
18、空值判断
(1)有标记,值不为空
<?if:Element_Name!=""?>Something Here<?end if?>
(2)有标记,值为空
<?if:Element_Name and Element_Name=""?>Something Here<?end if?>
(3)无标记
<?if:not(Element_Name)?>Something Here<?end if?>
19、嵌套模版/子模版
嵌套模板是在模板中定义一个子模板,然后在需要的地方调用它,如在页眉页脚中调用它,这样也可以突破页眉和页脚中不允许使用窗体域的限制。
(1)定义子模版
<?template:internaltemplate YOUR_TEMPLATE_NAME?>
……
<?end template?>
(2)调用子模版
<?call:internaltemplate YOUR_TEMPLATE_NAME?>
其他的一些技巧,以后在开发的过程中,遇到了再加入

时间: 2024-10-02 18:51:52

rtf模板常用技巧的相关文章

.Net常用技巧_调用Excel模板格式导出Excel

object missing = System.Reflection.Missing.Value;  //表示缺i省object SaveFileDialog savedialog = new SaveFileDialog(); savedialog.Filter = "(*.xlsx)|*.xlsx|(*.xls)|*.xls"; savedialog.Title = "导成Excel"; if (savedialog.ShowDialog() == Dialog

.Net常用技巧_操作Excel知识点

C#操作Excel知识点 近期在使用C#操作excel,主要是读取excel模板,复制其中的模板sheet页,生成多个sheet页填充相应数据后另存到excel文件,所用到的知识点如下. 一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用,它的默认路径是C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Off

.Net常用技巧_FastReport打印数据集设置

private void btnPrint_Click(object sender, EventArgs e) { //打印主从表数据 string file = Application.StartupPath @"\MasterDetail.frx"; rptMasterDetail.Load(file);//加载报表模板文件 DataSet ds = DAL.GetMasterDetailData();//取报表数据 rptMasterDetail.RegisterData(ds.

Linux Shell常用技巧(三) sed

Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有 改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

Linux Shell常用技巧(四) awk

Linux Shell常用技巧(四) awk 九.  awk实用功能: 和sed一样,awk也是逐行扫描文件的,从第一行到最后一行,寻找匹配特定模板的行,并在这些行上运行"选择"动作.如果一个模板没有指定动作,这些匹配的行就被显示在屏幕上.如果一个动作没有模板,所有被动作指定的行都被处理.       1.  awk的基本格式:    /> awk 'pattern' filename    /> awk '{action}' filename    /> awk '

Linux Shell常用技巧(五) awk编程

Linux Shell常用技巧(五) awk编程 十一.  awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文.下面为变量的赋值负号列表: 符号 含义 等价形式 = a = 5 a = 5 += a = a + 5 a += 5 -= a = a - 5 a -= 5 *= a = a * 5 a *= 5 /= a =

Linux Shell常用技巧(五)

十一.  awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文.下面为变量的赋值负号列表: 符号 含义 等价形式 = a = 5 a = 5 += a = a + 5 a += 5 -= a = a - 5 a -= 5 *= a = a * 5 a *= 5 /= a = a / 5 a /= 5 %= a = a %

Linux Shell常用技巧(三)

八. 流编辑器sed: sed一次处理一行文件并把输出送往屏幕.sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space).一旦sed完成对模式空间中的行的处理,模式空间中的行就被送往屏幕.行被处理完成之后,就被移出模式空间,程序接着读入下一行,处理,显示,移出......文件输入的最后一行被处理完以后sed结束.通过存储每一行在临时缓冲区,然后在缓冲区中操作该行,保证了原始文件不会被破坏.        1.  sed的命令和选项: 命令 功能描述 a\  在当前行的后

Linux Shell常用技巧(四)

九.  awk实用功能: 和sed一样,awk也是逐行扫描文件的,从第一行到最后一行,寻找匹配特定模板的行,并在这些行上运行“选择”动作.如果一个模板没有指定动作,这些匹配的行就被显示在屏幕上.如果一个动作没有模板,所有被动作指定的行都被处理.       1.  awk的基本格式:    /> awk 'pattern' filename    /> awk '{action}' filename    /> awk 'pattern {action}' filename