2. RTF模版开发
2.1. 本章概述
2.1.1. 关注内容
相信随着XM LP版本的不断升级,其Desktop端的可视化功能将大大简化我们的设计工作,不过目前还有些地方不通过手工编写命令是无法完成的;此外,虽然模版开发是依托Word的功能完成,但有些“鲜为人知”的Word功能需要额外提示下。
所以本章收录的是常见问题的处理办法,并未包括完整的User Guide功能,当然也不包括Word的使用帮助。
2.1.2. XM LP和XSL-FO
可以采取两种方式编写布局语言,一是XSL语句,二是XM LP简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和单元格。
在RTF中直接写的只能是XM LP简易语句;在窗体域中则上述两者皆可。
标准的页眉页脚中不允许使用窗体域;但扩展的页眉页脚中可以使用。
XM LP提供的语法,都是一种简化的“代号”,实际都要翻译成XSL,如果你精通XSL-FO,那么也可以在窗体域中直接用该语法,自由而灵活!如下SQL可以查到转换后的XSL-FO:
_select t2.application_short_name,
t1.LANGUAGE,
t3.file_name,
t3.xdo_file_type,
t3.file_data
FROM xdo.xdo_templates_tl t1, xdo.xdo_templates_b t2, xdo.xdo_lobs t3
mplate_code = t2.template_code
plate_code = t3.lob_code
AND t1.LANGUAGE = …US‟
plate_code = …CUXXMLPDEMO‟
Tips:C:\Program Files\Oracle\XML Publisher Desktop\samples\RTF templates有非常好的例子可供参考。
2.2. 布局格式化
2.2.1. 建议做法
充分利用Word的格式化功能:纸张自定义、颜、字号、字体、标题样式、背景、水印、对齐、表格、分栏、模版日期、窗体域的数字/日期格式、文件图片、页眉页脚、自动图文集。
虽然可以代码控制,但既然依托Word作为可视化设计工具,我们就尽量使用Word功能来设计报表吧!
2.2.2. Word表格
和做网页一样,表格在报表布局中的地位至关重要,要熟练掌握,尤其是:
1、标题行重复,可以实现新页重复标题。
2、嵌套表格、行列合并、边框、底纹,可以实现特殊的布局。
3、固定列宽、自动调整、禁止跨页断行,可以实现一些严格的布局控制。
2.2.
3. 行截断与禁止折行
单据打印中对格式的要求比较高,如果某一行过长或者出现多次折行,就会破坏版面,尤其是套打等要求较高的场合,这里把各种方法作个小结。
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行的字符数,然后利用自动折行功能。这里还要注意空格,如果遇到空格,后面的单词又显示不下,将会提前自动折行
2.2.4. 条件格式化
在不同的条件下显示不同的颜、不同的列数、不同的标题、不同的布局风格等等,这些都属于条件格式化,需要借助IF命令。
1、比如不同币种凭证打印格式不同
<?if:CURRENCY_CODE="CNY"?>任何布局<?end if?>
<?if:CURRENCY_CODE!="CNY"?>任何布局<?end if?>
个人网页设计模板100套2、比如货币为CNY时才显示列,在目标列的单元格内写如下语句
<?if@column:CURRENCY_CODE="CNY"?>字段值和格式<?end if?>
注:这还不是真正的动态列。
3、比如偶数行底为灰,在行的任何单元格内写如下语句
<?if@row:position() mod 2=0?>
<xsl:attribute xdofo:ctx="incontext" name="background-color">gray</xsl:attribute>
<?end if?>
4、比如超过100单元格呈红,在目标单元格内写如下语句
<?if:QUANTITY>100?>
<xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute>
<?end if?>
2.3. 字段计算技巧
2.3.1. 建议做法
1、计算字段可以在SQL中先完成。
2、如果使用Oracle Reports做数据源,那么计算字段、统计字段也可以先完成。
3、在SQL中的数据,都不带格式,格式在模版中设置;需要在模版中完成计算的字段,必须不带格式,主要指数字不能带千位符号。
2.3.2. 组内合计
N: Template Builder/插入/字段
向导可以完成基本的统计,目前支持分组内的:Sum、Count、M in、M ax、Avarage。
自动生成的代码示例:<?sum (QUANTITY)?>。
2.3.3. 页内合计
要实现本页合计数,需分两步:声明合计变量、显示合计变量(可带格式)。
1、对QUANTITY进行本页合计,声明变量QTYTOTAL,注意写在QUANTITY对应的组内,不然引用不到<?add-page-total:QTYTOTAL;‟QUANTITY‟?>
2、可在任意地方显示合计数
<?show-page-total:QTYTOTAL?>
那么如何实现组内+页内合计呢?
.3.4. 结转合计
把上页的合计数显示到下页,与“页内合计”类似,需分两步:声明合计变量、显示合计变量。
用得少,可参考User Guide“Brought Forward/Carried Forward Totals”部分。
2.3.5. 累计数Running Totals
累计每行数字,实际上是这样完成的:先声明一个变量,初始化为0;累加;在需要的地方显示累计。1、在分组标记前初始化,Set变量
<?xdoxslt:set_variable($_XDOCTX,‟RTotalVar‟, 0)?>
2、计算累计值,通常写在欲累计的字段同一单元格内,比如下面的QUANTITY
<?xdoxslt:set_variable($_XDOCTX, …RTotalVar‟, xdoxslt:get_variable($_XDOCTX,‟RTotalVar‟) + QUAN TITY)?>
3、任意地方显示累计值,Get变量
<?xdoxslt:get_variable($_XDOCTX,‟RTotalVar‟)?>
2.4. 任何Page相关问题
2.4.1. 新组分页
分页是自然的,但如果想在某处强制分页如新组新页,那么可以使用Word的分页符(CTRL+ENTER快捷键),但会导致最后出现空白页;这样只能使用如下几种方式:
1、分组声明中加@section,如<?for-each@section:G_PO_HEADER?>。
2、<?end for-each?>前加<?split-by-page-break:?>。这个翻译后,实际上是:
<xsl:if test="position()<last()">
<xsl:attribute name="break-before">page</xsl:attribute>
</xsl:if>
3、<?end for-each?>前加<xsl:attribute name="break-after">page</xsl:attribute>,此法下RTF最后无空白页,但PDF有空白页。
4、<?end for-each?>前加<xsl:attribute name="break-bef ore">page</xsl:attribute>此法下RTF、PDF最后都有空白页。
2.4.2. 条件分页、固定行分页
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?>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。