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有非常好的例子可供參考。
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?>
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、Min、Max、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’) + QUANTITY)?>
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-before">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?>
2.4.3. 頁首頁尾
1、 標準的頁首頁尾,即單個頁首頁尾,使用Word的功能即可。
2、 擴充的頁首頁尾,可使用<?start:body?><?end body?>把主體部分“框”起來,凡是在這兩個標記之外的東西,都將被當作頁首頁尾。
2.4.4. 頁碼和頁數
1、 可以用Word的“自動圖文集”,在任意地方插入頁碼,這個是“自然頁碼”。
2、 如果在某種情況下想讓頁碼從特定值開始,比如新的組頁碼重新編號,則需要藉助命令,如在for-each後寫:<?initial-page-number:1?>。這裡的“1”,實際上也可以用資料檔案中的XML元素來替換。
2.4.5. 末頁、奇偶頁不同
1、 Word可在頁首頁尾部分實現首頁不同或奇偶頁不同,沒法實現末頁不同,即使藉助代碼控制,實際實現的也是末頁布局不同,而非“頁首頁尾”不同。
<?start@last-page:body?><?end body?>
報表本身僅有一頁時,則用<?start@last-page-first:body?><?end body?>
例子“Advanced/Last Page”,注意布局需要獨立成頁,即之前需要加分頁符。
2、 以偶數頁結束,主要目的是顯示偶數頁頁首頁尾
<?section:force-page-count;’end-on-even-layout’?>
如果僅顯示空白頁,則用<?section:force-page-count;’end-on-even’?>
3、 以奇數頁結束,主要目的是顯示奇數頁頁首頁尾
<?section:force-page-count;’end-on-odd-layout’?>
如果僅顯示空白頁,則用<?section:force-page-count;’end-on-odd’?>
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是自然數1、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功能插入圖片,也可以僅將該圖片當作佔位圖,在圖片的“設定圖片格式”的網站標籤頁內的“替代文字”,輸入真正的圖片地址:
1、 來自網站的圖片:url:{‘[url]http://localhost:8000/OA_MEDIA/forms_logo.gif’[/url]}。
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>
2.5.6. 圖表
可使用Template Builder嚮導插入圖表,類型有:橫條圖-垂直、橫條圖-水平、餅圖、線形圖。
嚮導產生的程式碼,可在圖片的“設定圖片格式”網站標籤頁內的“替代文字”裡看到,我們可以做進一步修改。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/meteorlWJ/archive/2008/11/17/3321116.aspx