现在的位置: 首页 > 综合 > 正文

ORACLE XML Publisher

2013年04月11日 ⁄ 综合 ⁄ 共 11242字 ⁄ 字号 评论关闭

ORACLE XML Publisher这个工具已经发布很久了,但是之前一直没有对其具体的功能和使用进行过研究和测试,经过几天的研究和测试,现将其部分主要功能和使用方法做以简述。

  先介绍一下我进行测试的环境。应用环境是 Oracle EBS 11.5.8,XML Publisher版本为Oracle XML Publisher Desktop 5.6.2.

  本文章主要简单介绍ORACLE XML Publisher以下几个功能和使用方法。

  1. ORACLE XML Publisher的安装及配置

  2. Template Builder For Word 的使用

  3. Template Viewer 的使用

  4. 使用WORD进行报表制作

  5. Template Builder高级应用

  下面将分别逐一进行介绍。

  ORACLE XML Publisher的安装及配置

  ORACLE XML Publisher的安装其实是比较傻瓜型的,就像一般的软件安装一样,一路的“下一步”的ok了,但是有两点需要注意一下:

  1. java的配置

  要正常使用XML publisher,你的机器必须安装相应的java文件,因为XML转换需要调用到很多java*.exe,所以,务必在安装XML publisher之前确认你已经安装了JRE,在安装XML publisher的过程中,安装程序会提示你指定相应的JRE文件夹。

  2. 工作路径的设置

  这个就比较容易了,就和其他应用软件一样,指定一个工作目录。

  Template Builder for Word 的使用

  我们在安装完XML Publisher,会在开始菜单里面发现如下的几个项目

  顾名思义,大家都知道相应各项目的具体含义,这一节我们主要说一下Template Builder for Word的使用。

  在使用之前,我们首先要将Template Builder嵌入到WORD中,使用“Template Builder for Word 语言”这个程序,运行之后会提示我们对UI进行设置,之后我们再打开我们的WORD,会发现在工具栏上多了一个“加载项”,如下图所示,其中的语言由我们前一步讲到的设置UI属性决定,这里以简体中文为例:

  通过这些功能栏,我们就可以制作一些RTF模板(其实远不止这些,详细功能在后面会介绍)。

  首先,我们加载一个事先已经准备好的XML文件(可以通过系统并发输出XML文件或者外挂报表生成XML文件两个途径来生成)。这里需要说明一下,由于11.5.8没有集成XML publisher,所以想通过并发请求生成XML文件,需要首先在内挂报表定义的时候选择输出类型为“XML”,这样,在提交完并发请求后,输出才会是XML文件。在11.5.10中,已经完善了该功能,可以在并发请求中直接选择生成文件的类型。

  在WORD中通过以下方式进行XML文件的加载。

  

  加载成功后,会有提示 ,这表明我们的XML文件已经被成功的加载到Template Builder中了,接下来的工作就该是我们自定义模板了。

  在“插入”选项卡里面,有很多可以自定义的形式,我们现在只介绍最简单的模板制作,稍复杂的功能我们会在后面做以介绍。

  选择“插入字段”,会有如下的功能界面显示。

 

  这张图中列示的是我们已经装载的XML文件中的信息,也就是我们报表中SQL中SELECT出来的字段,这些是我们制作模板的基础。在这里我们选择需要显示的列名,会逐一的列示在word中,模板做好后效果如下图所示:

  

  这里我们还可以对每一个字段的属性进行编辑(双击字段名,会有属性框弹出,对字段属性进行编辑),这里就不详细说明了。

  PDF预览效果:

  

  当然,还有另一种比较好的办法,就是通过插入表/表单进行实现,具体方法是“插入表/菜单”,类似于Report Builder中的报表向导,模板制作好后效果如下图所示:

  

  PDF预览效果:

  

  此外,通过Template Builder还可以生成很多图示的报表,比如柱状图,饼状图等等,下面我们来看几个例子:

  

  从这张图标上我们可以很明了的看清楚各地区的销售量的情况。

  再来看一个各销售人员的业绩情况图示:

  

 

  我们可以看见,这张图中,横轴是销售人员的名字,纵轴是销售量,同样清晰明了。

  下面我们用Template Builder来做一个相对复杂一点的报表,按产品、销售地区进行汇总,并加以小计,配以品种销量图以 及销售人员销售情况图:

  

  

  到这里为止,我们已经介绍了如何将XML文件加载到Template Builder中,并使用Template Builder制作简单的报表。

  值得注意的一点,在我们将XML文件加载到Template Builder中后,并制作简单报表的同时,Template Builder会提示我们保存一份模板文件(。RTF),这个文件的用途我们会在稍后介绍到。

 

  Template Viewer 的使用

  我们先看一下Template Viewer的使用界面:

  

  这就是Template Viewer的应用界面,分为左右两部分,分别是源数据和模板。输出的格式有PDF/HTML/ETexT/RTF/EXCEL.这一节,我们主要讲的是将系统并发产生的XML文件或是外挂报表工具生成的XML文件如何处理成以上相应的输出格式。

  先介绍一下这个Template Viewer的功能。它的主要功能就是将XML文件转换成不同的模板样式的报表,这样,无疑是极大的方便的最终用户,根据不同的需求角度可以将一张内容丰富的报表通过不同的模板从不同的角度进行展现并且分析,而且,输出的文件格式也是很丰富,包括最易进行编辑的EXCEL;同时也减轻了开发人员的工作,针对于类似需求的报表,不必逐一进行开发,只需要定制不同的模板即可。

  使用这个功能,需要具备两个前提,一是源文件,也就是XML文件;另一个是模板文件。XML文件可以通过系统并发输出XML文件或者外挂报表生成XML文件两个途径来生成。而模板文件则需要我们自己来制作,当然,软件安装完成后,会自带一些比较典型的模板文件和相应的预览效果,可以仿效。

  在上一节,我们用Template Builder生成预览的同时,会提示让我们保存相应的rtf文件,也就是我们的模板文件,现在我们在Template Viewer中使用前面生成的模板文件。

  

  输出格式我们这里选择excel,看看效果

  

  这样,我们把这份报表顺利的生成了EXCEL文件,方便编辑。当然,如果使用不同的模板文件,最终报表出来的效果也不一样。通过Template Viewer也可以生成其他的格式文件(PDF/HTML/ETexT/RTF/EXCEL),这里就不一一列举了。

 

  使用word进行报表制作

  XML Publisher除了可以对XML文件进行转换、载入、编辑处理之外,还可以通过在WORD中的加载项连到数据库直接进行报表的制作,下面我们就来简单介绍一下。

  这里连接数据库和我们平时使用EXCEL连数据库有很大的区别,EXCEL是通过ODBC连数据库,而这里并不是,下面我们来看一下。

  通过WORD加载项中的数据报表向导,可以引导我们进行数据库的连接。

  首先,我们需要指定报表的的输出路径以及名称等信息。

  

  接下来,进行数据库连接,包括数据源的名称、用户名、口令以及主机信息,端口信息和SID.如下图所示:

  

  数据库连接完毕后,接下来的工作有点像我们平时使用Report Builder,进行SQL块的编写,也就是报表的主体。

  

  接下来的步骤就和我们在Report Builder中做报表中很相似了,如设定分组,设定排序等等对报表的布局进行设置,以及汇总等常用功能的设定。不过功能肯定不如Report Builder强,但是实现简单布局的报表还是绰绰有余。

  Template Builder高级应用

  前面介绍了Template Builder的一些简单应用,下面介绍一下Template Builder稍微复杂点的应用。

  在WORD加载项中我们可以看到这个选项

  

  在“向导”里面可供选择的向导类型共有三种,分别是“表”、“表单”、“自由格式”,这几种向导生成的模板都比较简单,我在这里就不逐一介绍了,下面将着重介绍高级向导。

  打开高级向导我们会看到如下界面:

  

 

  这个界面主要分为三部分,两个树形面板和一个属性控制面板。最左边的面板显示源数据的数据结构,中间的面板是我们将要选择添加到报表模板中的数据,在这个模板中,我们可以根据不同的需求,设计不同复杂报表的布局样式,例如分组报表、矩阵报表等。最右面的属性面板主要是对模板中各元素的属性进行设置。

  下面,我们将举两个例子来介绍这个高级报表向导的使用。

  首先我们来看一下“产品销量报表”,通过高级报表向导,设计的模板样式如下:

  

  其中包括明细的数据报表,还有三个不同角度的分析图。接下来我们看一下使用这个报表模板最终产生的报表:

  

  这个报表基本上是将前面讲到的一些简单使用综合到一张报表中,下面我们介绍一个稍微复杂一点的报表,报表模板样式采用左边分组矩阵的样式,并且增加汇总。

  首先看一下设计面板:

  

  这里,我们根据需求在这个功能界面的“模板”面板设计报表模板样式,并在属相面板设置相关模板元素的属性(例如分组等),经过设置调整,生成如下的模板样式:

  

  这个模板为左边分组矩阵报表,并加以合计,我们看一下最终报表的效果:

  

  这里再多讲两句,由于通过Template Builder制作报表或者报表模板很灵活,所以,最终的报表展示也很灵活,在同一张报表中可以同时出现多种模板的效果,如可以将普通的报表和相关的图表结合在一张报表或者一个报表模板中,呵呵,是不是有点BI的味道啊。
1.

ERROR:

The uploaded file CUX_GABRIEL_TEST_EMP.RTF is invalid. The file should be in RTF format

新建了一个word文档,然后再里面做的资料,最后将文件名“新建 Microsoft Word 文档.doc”改成了“CUX_GABRIEL_TEST_EMP.RTF”,上传为xml publisher templates 的template file时,出现如上错误。

Solution:将word文档重新另存,保存类型选择 “RTF格式(*.rtf)”。

2.

查看服务器端XML Publisher 版本号

在網上找到的方法:http://ora-apps.blogspot.com/2007/10/find-xml-publisher-version.html方法1):查看產出的PDF文件,在PDF Reader中File --> Properties,可以看到是用那個XML Publisher版本產生。方法2):登入DB Server,查看數據庫目前安裝的補丁包,可以知道上了那些XML
Publisher版本補丁
SELECT DECODE (bug_number
, '3554613', '4.5.0'
, '3263588', 'XDO.H'
, '3822219', '5.0.0'
, '4236958', '5.0.1'
, '4206181', '5.5.0'
, '4561451', '5.6.0'
, '4905678', '5.6.1'
, '5097966', '5.6.2') PATCH, bug_number
FROM ad_bugs
WHERE bug_number IN
('3554613'
, '3263588'
, '3822219'
, '4236958'
, '4206181'
, '4561451'
, '4905678'
, '5097966');方法3):登入AP Server,查看$OA_JAVA/oracle/apps/xdo/common/MetaInfo.class看來11.5.10.2是自帶XML Publisher 5.0版

3.

Xml publisher 类型的报表,主sql中有设定别名的,记得查看group中元素的属性-“XML标记”,看是否和元素的名称相同,因为在rtf格式设定的时候,是用“XML标记”的值来调用这个元素的,所以,不同的时候,改成相同(比较直观方便)或在rtf中使用“XML标记”的值。(做报表时,run出来发现有个有值的栏位为空,检查到此问题)。

4.

报表数字栏位显示为字符,在excel中选择多单元格时右下角无显示求和等(excel设置正确)。

Solution: 由于在rtf文件中数字设置了右对齐,因此没有注意到变量字符后面有空格,可左对齐一下即能发现。删除空格,解决。

5.

测试RUN 报表,跑完之后状态为COMPLETED, WARNING
此时点DIAGNOSTICS------view XML,如果有错误,一般是report.rdf有问题,例如元素的的xml tag和rtf中所引用的不同。

view XML时一般是如下错误:

无法显示 XML 页。
使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。

--------------------------------------------------------------------------------

名称以无效字符开头。处理资源 'http://erp-test.chiic.com:8002/OA_CGI/FNDWRR.exe?temp_id=967179952' 时出错。第 13 行,位置: 8

<09-10>1400</09-10>
-------^

6.

在RTF中将数据排序
在<?for-each:G_GROUP1?>后面添加<?sort:SORT_BY_COL;'ascending';data-type='number'?>

排序可以选择ascending或desending,data-type可以选择number或text
7.

转excel的报表,可以在rtf中对值进行处理,改为T("值")以将值转换为文本,以解决数字型文本显示为科学记数等

朋友提示<fo:bidi-override direction="ltr" unicode-bidi="bidi-override"><?CUST_PO_NUMBER?></fo:bidi-override>可以解决数字型字符位于前面的0消失的问题,有时间理解一下

 

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 FilesOracleXML Publisher DesktopsamplesRTF 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时才显示列,在目标列的单元格内写如下语句
<"?>字段值和格式<?end if?>
注:这还不是真正的动态列。
3、 比如偶数行底色为灰色,在行的任何单元格内写如下语句
<() 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,如<?>。
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可在页眉页脚部分实现首页不同或奇偶页不同,没法实现末页不同,即使借助代码控制,实际实现的也是末页布局不同,而非“页眉页脚”不同。
< body?>
报表本身仅有一页时,则用< body?>
例子“AdvancedLast 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、 动态拼接的地址:)}。
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向导插入图表,类型有:条形图-垂直、条形图-水平、饼图、线形图。

向导生成的代码,可在图片的“设置图片格式”网站标签页内的“可选文字”里看到,我们可以做进一步修改liangxichen 发表于:2011.08.16 09:34 ::分类: ( 开发类 ) ::阅读:(147次) :: Permanent link

【上篇】
【下篇】

抱歉!评论已关闭.