XML PUBLISHER的一些技巧

2. RTF模版開發

2.1. 本章概述
2.1.1. 關注內容
相信隨着XMLP版本的不斷升級,其Desktop端的可視化功能將大大簡化咱們的設計工做,不過目前還有些地方不經過手工編寫命令是沒法完成的;此外,雖然模版開發是依託Word的功能完成,但有些「不爲人知」的Word功能須要額外提示下。
因此本章收錄的是常見問題的處理辦法,並未包括完整的User Guide功能,固然也不包括Word的使用幫助。
2.1.2. XMLP和XSL-FO
能夠採起兩種方式編寫佈局語言,一是XSL語句,二是XMLP簡易語句,我的建議使用前者,由於其是國際通行標準。另外,這兩種語法能夠混合使用,好比上面的條件格式化行和單元格。
在RTF中直接寫的只能是XMLP簡易語句;在窗體域中則上述二者皆可。
標準的頁眉頁腳中不容許使用窗體域;但擴展的頁眉頁腳中可使用。
XMLP提供的語法,都是一種簡化的「代號」,實際都要翻譯成XSL,若是你精通XSL-FO,那麼也能夠在窗體域中直接用該語法,自由而靈活!以下SQL能夠查到轉換後的XSL-FO:
SELECT t2.application_short_name,
   t2.template_code,
   t1.LANGUAGE,
   t1.template_name,
   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
WHERE t1.template_code = t2.template_code
AND t2.template_code = t3.lob_code
AND t1.LANGUAGE = ‘US’
AND t1.template_code = ‘CUXXMLPDEMO’
Tips:C:/Program Files/Oracle/XML Publisher Desktop/samples/RTF templates有很是好的例子可供參考。html

 

2.2. 佈局格式化
2.2.1. 建議作法
充分利用Word的格式化功能:紙張自定義、顏色、字號、字體、標題樣式、背景、水印、對齊、表格、分欄、模版日期、窗體域的數字/日期格式、文件圖片、頁眉頁腳、自動圖文集。
雖然能夠代碼控制,但既然依託Word做爲可視化設計工具,咱們就儘可能使用Word功能來設計報表吧!app

 

2.2.2. Word表格
和作網頁同樣,表格在報表佈局中的地位相當重要,要熟練掌握,尤爲是:
一、 標題行重複,能夠實現新頁重複標題。
二、 嵌套表格、行列合併、邊框、底紋,能夠實現特殊的佈局。
三、 固定列寬、自動調整、禁止跨頁斷行,能夠實現一些嚴格的佈局控制。
2.2.3. 行截斷與禁止折行
單據打印中對格式的要求比較高,若是某一行過長或者出現屢次折行,就會破壞版面,尤爲是套打等要求較高的場合,這裏把各類方法做個小結。
一、 Word功能,不理想
固定列寬功能能夠用,但固定行高不行,雖然設計時看到「固定」了,若是不加控制,運行後多出列寬的數據會自動折行。
二、 單行+截斷,即控制只有以行,多餘截斷,禁止折行
在字段後,再加兩個命令:
<xsl:attribute xdofo:ctx="block" name="wrap-option">no-wrap</xsl:attribute>
<xsl:attribute xdofo:ctx="block" name="overflow">hidden</xsl:attribute>
三、 多行+截斷,難
如固定顯示3行,多餘部分截斷,目前經過模版沒法實現,只有在數據源中先將數據截至恰好3行的字符數,而後利用自動折行功能。這裏還要注意空格,若是遇到空格,後面的單詞又顯示不下,將會提早自動折行ide

 

2.2.4. 條件格式化
在不一樣的條件下顯示不一樣的顏色、不一樣的列數、不一樣的標題、不一樣的佈局風格等等,這些都屬於條件格式化,須要藉助IF命令。
一、 好比不一樣幣種憑證打印格式不一樣
<?if:CURRENCY_CODE="CNY"?>任何佈局<?end if?>
<?if:CURRENCY_CODE!="CNY"?>任何佈局<?end if?>
二、 好比貨幣爲CNY時才顯示列,在目標列的單元格內寫以下語句
<?if@column:CURRENCY_CODE="CNY"?>字段值和格式<?end if?>
注:這還不是真正的動態列。
三、 好比偶數行底色爲灰色,在行的任何單元格內寫以下語句
<?if@row:position() mod 2=0?>
<xsl:attribute xdofo:ctx="incontext" name="background-color">gray</xsl:attribute>
<?end if?>
四、 好比超過100單元格呈紅色,在目標單元格內寫以下語句
<?if:QUANTITY>100?>
<xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute>
<?end if?>工具

 

2.3. 字段計算技巧
2.3.1. 建議作法
一、 計算字段能夠在SQL中先完成。
二、 若是使用Oracle Reports作數據源,那麼計算字段、統計字段也能夠先完成。
三、 在SQL中的數據,都不帶格式,格式在模版中設置;須要在模版中完成計算的字段,必須不帶格式,主要指數字不能帶千位符號。佈局

 

2.3.2. 組內合計
N: Template Builder/插入/字段
嚮導能夠完成基本的統計,目前支持分組內的:Sum、Count、Min、Max、Avarage。
自動生成的代碼示例:<?sum (QUANTITY)?>。
2.3.3. 頁內合計
要實現本頁合計數,需分兩步:聲明合計變量、顯示合計變量(可帶格式)。
一、 對QUANTITY進行本頁合計,聲明變量QTYTOTAL,注意寫在QUANTITY對應的組內,否則引用不到
<?add-page-total:QTYTOTAL;’QUANTITY’?>
二、 可在任意地方顯示合計數
<?show-page-total:QTYTOTAL?>
那麼如何實現組內+頁內合計呢?
.3.4. 結轉合計
把上頁的合計數顯示到下頁,與「頁內合計」相似,需分兩步:聲明合計變量、顯示合計變量。
用得少,可參考User Guide「Brought Forward/Carried Forward Totals」部分。
2.3.5. 累計數Running Totals
累計每行數字,其實是這樣完成的:先聲明一個變量,初始化爲0;累加;在須要的地方顯示累計。
一、 在分組標記前初始化,Set變量
<?xdoxslt:set_variable($_XDOCTX,’RTotalVar’, 0)?>
二、 計算累計值,一般寫在欲累計的字段同一單元格內,好比下面的QUANTITY
<?xdoxslt:set_variable($_XDOCTX, ‘RTotalVar’, xdoxslt:get_variable($_XDOCTX,’RTotalVar’) + QUANTITY)?>
三、 任意地方顯示累計值,Get變量
<?xdoxslt:get_variable($_XDOCTX,’RTotalVar’)?>字體

 

2.4. 任何Page相關問題
2.4.1. 新組分頁
分頁是天然的,但若是想在某處強制分頁如新組新頁,那麼可使用Word的分頁符(CTRL+ENTER快捷鍵),但會致使最後出現空白頁;這樣只能使用以下幾種方式:
一、 分組聲明中加@section,如<?for-each@section:G_PO_HEADER?>。
二、 <?end for-each?>前加<?split-by-page-break:?>。這個翻譯後,其實是:
<xsl:if test="position()<last()">
<xsl:attribute name="break-before">page</xsl:attribute>
</xsl:if>
三、 <?end for-each?>前加<xsl:attribute name="break-after">page</xsl:attribute>,此法下RTF最後無空白頁,但PDF有空白頁。
四、 <?end for-each?>前加<xsl:attribute name="break-before">page</xsl:attribute>此法下RTF、PDF最後都有空白頁。網站

 

2.4.2. 條件分頁、固定行分頁
一、 任意條件分頁,須要藉助IF + 上面的break-after或者break-before,如:
<?if:CURRENCY_CODE="CNY"?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>
二、 固定行分頁,須要藉助IF + 上面的break-after或者break-before,在行<?end for-each?>前,以下語句控制每頁5行:
<?if:position() mod 5 =0?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>ui

 

2.4.3. 頁眉頁腳
一、 標準的頁眉頁腳,即單個頁眉頁腳,使用Word的功能便可。
二、 擴展的頁眉頁腳,可以使用<?start:body?><?end body?>把主體部分「框」起來,凡是在這兩個標記以外的東西,都將被看成頁眉頁腳。
2.4.4. 頁碼和頁數
一、 能夠用Word的「自動圖文集」,在任意地方插入頁碼,這個是「天然頁碼」。
二、 若是在某種狀況下想讓頁碼從特定值開始,好比新的組頁碼從新編號,則須要藉助命令,如在for-each後寫:<?initial-page-number:1?>。這裏的「1」,實際上也能夠用數據文件中的XML元素來替換。url

 

2.4.5. 末頁、奇偶頁不一樣
一、 Word可在頁眉頁腳部分實現首頁不一樣或奇偶頁不一樣,無法實現末頁不一樣,即便藉助代碼控制,實際實現的也是末頁佈局不一樣,而非「頁眉頁腳」不一樣。
<?start@last-page:body?><?end body?>
報表自己僅有一頁時,則用<?start@last-page-first:body?><?end body?>
例子「Advanced/Last Page」,注意佈局須要獨立成頁,即以前須要加分頁符。
二、 以偶數頁結束,主要目的是顯示偶數頁頁眉頁腳
<?section:force-page-count;’end-on-even-layout’?>
若是僅顯示空白頁,則用<?section:force-page-count;’end-on-even’?>
三、 以奇數頁結束,主要目的是顯示奇數頁頁眉頁腳
<?section:force-page-count;’end-on-odd-layout’?>
若是僅顯示空白頁,則用<?section:force-page-count;’end-on-odd’?>spa

 

2.5. 使用多媒體元素
2.5.1. Word功能
可使用公式、繪圖(如組織結構圖、線條等)、藝術字、剪貼畫。
若是想經過代碼在有限範圍內控制這些對象,好比顯示文字、縮放、旋轉、移動、複製,可參考User Guide中的「Drawing, Shape and Clip Art Support」。

 

2.5.2. 複選框
插入複選框窗體域,因其選中表明True,不選表明False,須要咱們輸入條件表達式,如:0。
2.5.3. 下拉框
插入下拉框窗體域,定義下拉框的元素,並一樣在「本身鍵入」內輸入須要引用的XML標記如<%AREA_INDEX%>。這裏要注意元素的順序,由於是用順序號和運行時的值進行匹配的,也就是XML數據中,AREA_INDEX是天然數一、2……。

 

2.5.4. 超連接
能夠直接利用Word功能設置超連接,也能夠在連接地址中,所有或部分引用XML數據文件中的標記,作到動態超連接:
{SUPPLIER_SITE_URL}或者
[url]http://huajhua.leiko.com:8000/OA_MEDIA/[/url]{CURRENCY_CODE}.gif

 

2.5.5. 圖片
能夠直接利用Word功能插入圖片,也能夠僅將該圖片看成佔位圖,在圖片的「設置圖片格式」的網站標籤頁內的「可選文字」,輸入真正的圖片地址:
一、 來自網站的圖片:url:{‘[url]http://localhost:8000/OA_MEDIA/forms_logo.gif’[/url]}。
二、 來自EBS的圖片:url:{‘${OA_MEDIA}/forms_logo.gif’}。
三、 動態指定地址:url:{IMAGE_URL}。
四、 動態拼接的地址:url:{concat(SERVER,’/’,IMAGE_DIR,’/’,IMAGE_FILE)}。
五、 直接來自內容爲BLOB的XML元素,僅用於「Data Templates」:
<fo:instream-foreign-object content-type="image/jpg">
<xsl:value-of select="IMAGE_ELEMENT"/>
</fo:instram-foreign-object>

 

2.5.6. 圖表
可以使用Template Builder嚮導插入圖表,類型有:條形圖-垂直、條形圖-水平、餅圖、線形圖。

嚮導生成的代碼,可在圖片的「設置圖片格式」網站標籤頁內的「可選文字」裏看到,咱們能夠作進一步修改。

 

https://www.cnblogs.com/quanweiru/archive/2012/10/19/2730842.html

相關文章
相關標籤/搜索