Oracle EBS R12 XML數據表格的Excel腳本報表


一.概述

在EBS系統中,報表是一個非常重要的客戶化開發內容,也是系統一種比較常見的數據輸出形式。報表的做法有很多種,輸出格式也有多種,較為常見的就是“數據文件+報表模板”的形式,例如用腳本程序輸出XML數據源,RTF模板控制數據格式的方式。也有直接用PLSQL程序輸出HTML格式的報表,數據和格式統一在程序中控制。

Excel是一種非常常用的辦公軟件,操作比較容易被用戶接受,對表格中數據的控制也比較容易,一系列的公式支持也為用戶節省了很大的工作量。

Excel標准格式為".xls"或".xlsx"文件格式,也可以另存為XML數據表格的格式(".xml"),這就為程序直接輸出XML格式的腳本來生成Excel表格提供了有利條件。經過實際的操作,利用這種方式輸出的報表,可以在EBS R12中輸出,在Excel中打開,並且可以進行表格相關格式控制。

 

注1:Excel文件 ”.xls” 或”.xlsx” 另存為”.xml”文件可能存在兼容性問題。

注2:Excel文件”.xls” 或”.xlsx”與”.xml”之間的相互轉換可能存在一些對象的不相互兼容問題(例如”.xls”或”.xlsx”中的圖表)。相關支持內容請查看MSDN

 

 

二. 解決的問題

2.1 解決的問題

以當前項目中的實際為例,客戶要求對生產計划和效率產出做一個比較,月初做計划,月底做對比,提交並發程序輸出報表。設計文檔中報表的樣式為Excel表格,其中一些特殊的格式,例如豎排文字,多次匯總,分隔匯總,數據格式控制,公式,字體,表格狀的動態增長報表,經過分析,這種形式的報表用Excel的形式輸出是非常合適的,相類似HTML在格式控制上沒有Excel靈活。

所以此文需要解決的問題是,輸出Ecxel腳本報表。Excel的”.xls”或”.xlsx”為二進制文件,直接輸出二進制腳本可行性並不大,難度大,所以改用XML腳本的Excel文件來輸出。

 

 

 

2.2 准備

相關工具及輸入輸出

編程:PLSQL Developer X

輸出:XML

系統:EBS R12

瀏覽器:(建議為)IE8及以上版本

其他:Office 20XX

                                                       

注:多次測試發現IE6在打開特定頭的XML文件時,常出現卡死狀態,不建議使用。

 

三. 一個最簡單的XML格式的Excel報表

把”.xls”或”.xlsx”文件以”XML數據表格”的格式另存,用記事本或其他文本編輯器打開,就可以看到此表格的XML腳本。這種形式的Excel文件腳本大體分為4個部分,XML頭,Excel樣式,Sheet主數據塊,XML尾。

 

其中有一些部分的信息是可以沒有的,經過簡化,將一個最基本的文件結構提取出來,形成如下的例子。

 

3.1 腳本代碼

復制代碼
 1 <?xml version="1.0"?>  
2
<?mso-application progid="Excel.Sheet"?>
3
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4
xmlns:o="urn:schemas-microsoft-com:office:office"
5
xmlns:x="urn:schemas-microsoft-com:office:excel"
6
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7
xmlns:html="http://www.w3.org/TR/REC-html40">
8
<Worksheet ss:Name="Demo Sheet">
9
<Table>
10 <Row>
11 <Cell><Data ss:Type="String">Hello!World!</Data></Cell>
12 </Row>
13 <Row>
14 <Cell><Data ss:Type="String">Hello!World!</Data></Cell>
15 </Row>
16 <Row>
17 <Cell><Data ss:Type="String">Hello!World!</Data></Cell>
18 </Row>
19 </Table>
20 </Worksheet>
21 </Workbook>
復制代碼

 

 

3.2 效果

用Excel打開文件,效果如下:

 

 

 

四. XML格式的Excel文件結構分析

分析文件結構,能夠使我們清楚的掌握要用程序輸出一個正確的腳本所必須的要素。XML和HTML的一個很大的區別在於,HTML為已定義的標簽,每一個標簽在瀏覽器中作用並不會存在很大的沖突,這里的意思是,瀏覽器在解釋HTML腳本的時候,並不會太嚴格,原因是互聯網剛發展的時候網絡並不佳,請求丟包很多,所以HTML在丟失少量tag或某些特殊字符時,並不會出現嚴重的問題。但是XML不一樣,XML是結構化自定義的,在確定了namespaces的情況下,必須按照namespace的結構定義來組成XML文件,特別是應用程序特殊處理的XML文件,不能出現細微錯誤的情況,例如tag有開始沒有結束時,在Excel中就無法正確打開這個XML文件。

XML數據表格格式的Excel文件的頂級tag是Workbook,二級Tag主要有:

以下分別說明每一個tag的用途和主要屬性。

                                                      

 

4.1 XML頭

頭信息(必須)

1 <?xml version="1.0"?> 
2
3 <?mso-application progid="Excel.Sheet"?>

 

XML文件頭以

                  <?xml version="1.0"?>

開始,表明這是一個XML文件;對於需要用Excel來默認打開的XML文件,需要再加一句:

      <?mso-application progid="Excel.Sheet"?>

表明此XML文件用Excel默認打開。

 

注:后者其實可以不添加,打開時右鍵用Excel打開也是可行的,但是不推薦。

 

 

4.2 Tag: Namespaces

Namespaces信息(必須,固定內容)

1 <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
2 xmlns:o="urn:schemas-microsoft-com:office:office"
3 xmlns:x="urn:schemas-microsoft-com:office:excel"
4 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
5 xmlns:html="http://www.w3.org/TR/REC-html40">

 

這個部分為XML的開始,我們可以看到XML電子表格格式的Excel文件的頂級tag是<workbook> ,放在這個tag里面的屬性為Namespace信息,相關控制文件都來自Microsoft.com,說明Excel在打開這種類型的XML文件的時候,是嚴格按照這幾個Namespaces的格式來讀取文件的。

這個部分的Namespaces信息為固定的,必須的內容。

 

4.3 Tag: DocumentProperties

DocumentProperties(非必須)

一個例子:

1 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
2 <Created>2012-02-13T11:21:51Z</Created>
3 <LastSaved>2012-02-13T14:03:08Z</LastSaved>
4 <Version>14.00</Version>
5 </DocumentProperties>

這個部分主要設置Excel的文檔屬性內容,可以看到里有創建時間,修改時間和版本信息。

 

注:這個部分的信息非必須的意思是,系統輸出XML之后,其實還是”.xml”格式的文件,用Excel打開之后,保存,這些信息會自動添加到腳本中,如果程序要求中不需要這樣的信息,可以不添加。

 

4.4 Tag: OfficeDocumentSettings

OfficeDocumentSettings (非必須)

一個例子

1 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> 
2 <AllowPNG/>
3 <RemovePersonalInformation/>
4 </OfficeDocumentSettings>

這個部分設置Offce 文檔屬性。

 

4.5 Tag: ExcelWorkbook

ExcelWorkbook (非必須)

一個例子:

復制代碼
1 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
2 <WindowHeight>11640</WindowHeight>
3 <WindowWidth>19200</WindowWidth>
4 <WindowTopX>0</WindowTopX>
5 <WindowTopY>90</WindowTopY>
6 <ProtectStructure>False</ProtectStructure>
7 <ProtectWindows>False</ProtectWindows>
8 </ExcelWorkbook>
復制代碼

這個部分設置工作表的屬性。

 

4.6 Tag: Styles

Styles(非必須)

Style是一個可以作很大文章的部分,里面的屬性設置包含了Excel里面常見的所有單元格,數據,顏色,方向等等,以ID的方式關聯到具體的行,列或者單元格,對工作薄的格式設置支持比較完全。

一個例子:

復制代碼
 1 <Styles>  
2
<Style ss:ID="m76469184">
3
<Alignment ss:Vertical="Bottom" ss:Rotate="90" ss:Horizontal="Center"/>
4
<Borders>
5
<Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Bottom"/>
6
<Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Left"/>
7
<Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Right"/>
8
<Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Top"/>
9
</Borders>
10 <Font ss:Size="8" ss:FontName="Helv" ss:Bold="1" x:Family="Swiss"/>
11 <Interior ss:Color="#FFFF99" ss:Pattern="Solid"/>
12 <NumberFormat ss:Format="Fixed"/>
13 </Style>
14 </Styles>
復制代碼

以上這個例子中,<Styles>中可以有若干個<Style>,每一個Style確定一種樣式,以ID區分不同的樣式(ID為必須,如果ID為”Default”,則該樣式為默認樣式,只能有一個”Defulat”樣式)。可以看到,樣式定義中,可以定義對其方式,邊框,字體,填充,數據格式等。

常用樣式解釋如下

<Alignment>

主要屬性有:

屬性

ss:Vertical

枚舉:Bottom/Center/Top

ss:Horizontal

枚舉:Left/Center/Right

ss:Rotate

數字,逆時針旋轉,例如“90”代表單元格內容逆時針旋轉90度

ss:WrapText

數字,“1”代表此單元格為多行顯示

 

 

 

 

 

 

< Borders >

Borders里面下一級tag為Border,每一個Border為一個方向的邊框格式設置,Border屬性主要有:

屬性

ss:Position

枚舉:Bottom/ Left/ Right/ Top

ss:LineStyle

枚舉:Continuous/…

ss:Weight

數字,邊框粗細

 

 

 

 

 

<Font>

主要屬性有:

屬性

ss:FontName

枚舉,字體

x:Family

枚舉,字體類

ss:Bold

數字,1代表加粗

ss:Italic

數字,1代斜體

ss:Size

數字,字體大小

ss:Underline

枚舉:Single/…

ss:Color

RGB或顏色號,文字顏色(不是填充顏色)

 

 

 

 

 

 

 

 

 

<Interior>

主要屬性有:

屬性

ss:Color

RGB或顏色號,填充顏色(不是字體顏色)

ss:Pattern

枚舉:Solid/…,填充類型

 

 

 

 

<NumberFormat>

主要屬性為

屬性

ss:Format

”0.0”/”0”/”Fixed”/”0%”/…

 

 

 

 

4.7 Tag: Worksheet

Worksheet(必須)

這個部分為工作薄的數據表格部分,格式引用Styles中定義的Style。一個例子:

復制代碼
 1 <Worksheet ss:Name="Sheet1">  
2
<Table ss:DefaultColumnWidth="54" ss:StyleID="s119" ">
3
<Column ss:StyleID="s119" ss:Width="34.5" ss:AutoFitWidth="0"/>
4
<Column ss:StyleID="s119" ss:Width="34.5" ss:AutoFitWidth="0"/>
5
<Column ss:StyleID="s119" ss:Width="34.5" ss:AutoFitWidth="0"/>
6
<Row ss:StyleID="s28" ss:Height="15" ss:AutoFitHeight="0">
7
<Cell ss:StyleID="s17"><Data ss:Type="String">data here</Data></Cell>
8
<Cell ss:StyleID="s17"><Data ss:Type="String">data here</Data></Cell>
9
<Cell ss:StyleID="s17"><Data ss:Type="String">data here</Data></Cell>
10 </Row>
11 <Row ss:StyleID="s28" ss:Height="15" ss:AutoFitHeight="0">
12 <Cell ss:StyleID="s17" ss:MergeAcross="1" ><Data ss:Type="String">data here</Data></Cell>
13 <Cell ss:StyleID="s17"><Data ss:Type="String">data here</Data></Cell>
14 </Row>
15 </Table>
16 <Worksheet>
復制代碼

每一個Worksheet代表一個工作薄,即Excel中每一個工作頁,”ss:Name” 代表工作表的名字,可以有多個工作表,不可重名。

<Worksheet>二級標簽主要是<Table>和<WorksheetOptions>

 

4.7.1 <Table> (必須)

每一頁工作表為一個Table,Table標簽常用屬性有

屬性

ss:DefaultColumnWidth

數字,默認列寬

ss:StyleID

引用樣式ID

 

 

 

 

 

注:每一處引用Style樣式(包括后面的單元格樣式),必須在之前的Styles標簽中定義過,否則無法正常打開文件。

 

Table的二級標簽主要是<Column>和<Row>:

  1. <Column>主要作用是放在< Row >之前,控制每一列的寬度,不作顯示數據用;
  2. < Row >是具體行,<Row>標簽內是<Cell>,確定行內的每一個單元格。

Table的形式是這樣的,先確定列寬度,然后確定行,然后確定單元格,其中值得注意的是列寬只能在<Column>的屬性里確定,不能在<Cell>里指定單元格寬度;行高只能在<Row>的屬性里確定,不能在<Cell>里指定單元格高度,否則會出現問價無法發開的情況。例如這樣設置是正確的:

<Column ss:StyleID="xxC" ss:Width="35" ss:AutoFitWidth="0"/>

<Row ss:StyleID="xxR" ss:Height="15" ss:AutoFitHeight="0">

 

<Column>主要屬性有:

屬性

ss:Width

數字,寬度

ss:AutoFitWidth

數字,”0”代表非自動寬度

 

 

 

 

 

<Row>主要屬性有:

屬性

ss:Height

數字,高度

ss:AutoFitHeight

數字,”0”代表非自動高度

 

 

 

 

 

<Cell>內一般放置單元格的內容,用<Data>來包裹內容,<Cell>的主要屬性有:

屬性

ss:MergeAcross

數字,向右合並單元的數

ss:MergeDown

數字,向下合並單元格數

ss:Index="5"

標記列號,index列號不受合並影響。

 

 

 

 

 

 

注:列號可以不指定,但是不便於代碼閱讀,例如,在A1這個<Cell>位置做了向下合並3,向右合並2,代碼如下來編寫:

復制代碼
1 <Table>  
2
<Row>
3
<Cell ss:Index="1" ss:MergeDown="3" ss:MergeAcross="2"><Cell/
4
<Cell ss:Index="4" ><Cell/>
5
</Row>
6
<Row>
7
<Cell ss:Index="4" ><Cell/>
8
</Row>
9
<Row>
10 <Cell ss:Index="4" ><Cell/>
11 </Row>
12 <Row>
13 <Cell ss:Index="4" ><Cell/>
14
</Row>
15 <Row>
16 <Cell ss:Index="1" ><Cell/>
17 <Cell ss:Index="2" ><Cell/>
18 <Cell ss:Index="3" ><Cell/>
19
<Cell ss:Index="4" ><Cell/>
20
</Row>
21 </Table>
復制代碼

效果:

 

<Data>的屬性主要有:

屬性

ss:Type

枚舉:”String”/”Number”/…

 

 

 

4.7.2 <WorksheetOptions> (非必須)

此處為一些附加信息,例如

復制代碼
1 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
2 <PageSetup>
3 <Print>
4 <Zoom>80</Zoom>
5
<Selected/>
6 <Panes>
7 <ProtectObjects>False</ProtectObjects>
8 <ProtectScenarios>False</ProtectScenarios>
9 </WorksheetOptions>
復制代碼

 

 

 

五. EBS系統的開發過程

在實際開發的過程中,一般流程是現在Excel中確定報表的模板,格式,然后把”.xls” 或”.xlsx” 另存為”.xml”文件,用文本編輯器編輯一些內容,刪除冗余代碼,然后再關鍵邏輯(一般是動態增長的部分)用程序邏輯來控制輸出即可。可執行和並發程序的定義和標准一致,並發程序的輸出用“HTML”。

 

5.1 PLSQL程序

PLSQL程序輸出

1 PROCEDURE output(p_content IN VARCHAR2) IS 
2 BEGIN
3

4 fnd_file.put_line(fnd_file.output, p_content);
5
6 END output;

例如用以上的方法輸出,就可以在並發程序的輸出中查看,而在程序中,輸出的方法,形式,按照具體的需求來就行,和PLSQL輸出HTML報表的做法大致相同。

 

 

5.2 可執行及並發程序

可執行定義

定義可執行為PL/SQL程序,關聯相應的程序包方法,例如:

 

並發程序定義

定義並發程序關聯可執行,設置參數,例如:

 

 

 

5.3 效果

打開方式及效果

並發程序輸出用Excel方式打開:

 

瀏覽器中可選擇以下方式:

 

保存或者直接打開,選擇“打開”時如下的提示,選擇”是”:

 

如果XML腳本正確,Excel就可以打開:

 

如果是之前是的是“保存”,然后手動打開,會有如下提示:

 

點擊“是”直接打開。

 

5.4 快速獲取XML腳本

逆向工程

對於開發時,沒有必要一行一行的寫腳本,先用Excel編輯”.xls” 或”.xlsx” 文件,然后另存為”.xml”文件,把一些非必須的腳本代碼刪除,有關鍵邏輯的地方特殊處理,就可以在plsql代碼中直接輸出了。

對於一些特殊的格式,屬性的設置,也沒有太大的必要去記住,在需要時,”.xls” 或”.xlsx” 文件逆向工程生成XML文件就可以根據ID查出單元格等各種屬性的設置。

 

注:用逆向工程生成的代碼,在<styles>內重復率很高,代碼重用率不高,對於這種代碼,可以進行合並,在指定worksheet里各個tag的屬性時,根據需要,調整ID,清除不必要的重復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM