前言
本文講述的多Sheet頁EXCEL報表開發(fā)方式和開發(fā)HTML,PDF這類報表的方法大致是一致的,唯一不同的是該報表輸出是一個XML文件,但是這種XML文件支持EXCEL直接打開。
這種方式有如下兩點點非常明顯的優(yōu)點:
(1) 靈活性。
如果客戶對報表顯示樣式要求非常嚴格的話,那用這種方式就非常方便了,就比如我這次項目的客戶是個德國人,對報表的顯示樣式要求極為苛刻,甚至嚴格到每個列的顏色,邊框線,列寬,字體等。用這種方法就可以以類似CSS開發(fā)方式一樣來編寫EXCEL的顯示樣式代碼,然后到輸出數(shù)據(jù)的時候套用不同的樣式即可。
(2) 數(shù)據(jù)處理非常方便。
當報表對輸出的數(shù)據(jù)要做大量的計算,分類匯總等操作時,如果在編寫代碼的時候直接進行計算,分類匯總等,一旦數(shù)據(jù)量大的時候會導致報表運行非常慢,很影響效率。而用這種方法,只需從系統(tǒng)里取出最基本的數(shù)據(jù)即可,然后寫好各種計算和分類匯總等的公式,等報表跑出來后利用EXCEL自帶的功能自動計算。這樣做一方面可以提高報表的性能,另一方面可以使得整個報表的數(shù)據(jù)是動態(tài),在報表里修改了基本數(shù)據(jù)后,那些通過計算和分類匯總等操作得出的數(shù)據(jù)也會聯(lián)動改變。
3.EXCEL電子表格
該報表輸出文件是一個XML文件,該XML文件和我們常見的文件非常類似,只不過普通XML件是一個無格式的資源文件,而該XML文件是帶格式的資源文件。就像我們打開任何一個excel文件,選擇另存為“XML電子表格2003(*.xml)”的格式。然后用記事本打開那個xml文件,就可以看到EXCEL表格的廬山真面目。
下面對EXCEL表格的XML格式文件做個簡單介紹。
3.1 示例
(1)EXCEL文件以XML格式打開后可以看到其結構圖如下:
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站建設、網(wǎng)站設計、迭部網(wǎng)絡推廣、小程序制作、迭部網(wǎng)絡營銷、迭部企業(yè)策劃、迭部品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供迭部建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:jinyejixie.com
(2)單個Sheet頁的結構圖如下:
3.2 語法結構
1.題頭
前兩行是題頭,跟XML Publisher一樣,我們可以在第一行的xml標簽里增加對編碼的控制。
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?>
2. Workbook
Workbook標簽包住的就是整個電子表格,有點類似于HTML語言中的html標簽。而Worksheet標簽包住的就是其中的一個sheet頁,有點類似于HTML語言中的body標簽,只不過在XML電子表格里可以有多個“body”。
3.”Head”
我們可以看到,從Workbook的開始標簽到第一個Worksheet之間還有很多內(nèi)容,其中包括DocumentProperties、OfficeDocumentSettings、ExcelWorkbook和Styles四個標簽。這些內(nèi)容就相當于HTML語言中的head標簽,對整個電子表格進行控制。前三者我們可以不去關注,其中ExcelWorkbook中的ActiveSheet標簽決定XML電子表格打開時默認展現(xiàn)第幾個sheet頁。
4.Styles
“Head”中最重要的是Styles標簽。顧名思義,Styles就是電子表格的樣式。Style是Styles的子標簽,是單個樣式。Styles里包含了整張電子表格需要用到的全部樣式。
拿下面這個Style來看。
<Style ss:ID="normal"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <Font ss:FontName="宋體" x:CharSet="134" ss:Size="11" ss:Color="#000000"/> </Style>
XML電子表格標記語言跟HTML語言比較類似。標簽的各個屬性之間用空格隔開,屬性名稱跟屬性值間用“=”連接,屬性值都需要用雙引號包住。不同的一點是,每個屬性名稱的前面都要加上一個“ss:”。
Style標簽一定要設置的屬性只有一個,就是ID,用來區(qū)分不同的Style。Style里面可以有許多的子標簽,比如控制單元格邊框的Border、控制字體的Font、控制單元格背景的Interior和控制單元格鎖定的Protection。
5.Worksheet
Worksheet的Name是sheet頁顯示的名稱,必須有且不可重復,否則excel無法打開。
Worksheet還有一個有用的屬性,在上面的例子中沒有呈現(xiàn),是Protected。Protected設置為”1”可以使該sheet頁的全部單元格不可編輯。但是XML電子表格不能支持密碼保護,也就是說,用戶其實可以通過單擊Excel“審閱”中的“撤消工作表保護”來使其失效。另外,Style中也有單元格控制,Style的Protection優(yōu)先級要高于Worksheet的Protected。
6.Table
Table是Worksheet的子標簽,是具體顯示數(shù)據(jù)的標簽。從結構上看,我猜想一個Worksheet里應該可以有多個Table,但經(jīng)過多次測試都未能找到在一個Worksheet里放多個Table的方法,暫時認為一個Worksheet最多存放一個Table。
Table有兩個屬性很重要,是ExpandedColumnCount和ExpandedRowCount。這將決定Excel在打開時按照幾行幾列的標準去讀取文件中的數(shù)據(jù),ExpandedColumnCount和ExpandedRowCount可以大于實際有效區(qū)域的列數(shù)和行數(shù),但是絕不可以小,否則excel無法打開。例如, 一個四行四列成績單sheet頁內(nèi)共有4*4個有效區(qū)域,如果ExpandedColumnCount改成3,excel就無法打開,而ExpandedColumnCount改成5,excel可以正常打開。
7. WorksheetOptions
從Table的結束標簽到Worksheet的結束標簽之間,還有一個標簽:WorksheetOptions。這個標簽可以定義該Sheet頁的很多屬性,比如打開該Sheet頁時,鼠標定位在什么位置;以及打印區(qū)域設定;還有該Sheet頁權限鎖定限制也是在此處定義,這里要注意:當Sheet頁選擇鎖定時,用戶對該Sheet是不能做任何操作的,包括改變行高列寬,添加行或列,刪除行或列等,但是通常用戶選擇鎖定Sheet頁時,僅僅希望內(nèi)容不能被修改,其余的像改變行高列寬,添加行或列,刪除行或列等,這些權限是不需要被鎖定的,針對這種情況,EXCEL也提供了相應的辦法,也是在此處進行設置,就像下面這些常用的權限控制,需要那個就在此處添加該標簽即可:
<AllowFormatCells/> :是否允許對單元格的格式做調(diào)整 <AllowSizeCols/> :是否允許改變列寬 <AllowSizeRows/> :是否允許改變行高 <AllowInsertCols/> :是否允許插入列 <AllowInsertRows/> :是否允許插入行 <AllowInsertHyperlinks/> :是否允許插入超鏈接 <AllowDeleteCols/> :是否允許刪除列 <AllowDeleteRows/> :是否允許刪除行 <AllowSort/> :是否允許排序 <AllowFilter/> :是否允許使用自動篩選 <AllowUsePivotTables/> :是否允許使用數(shù)據(jù)透視圖
注意:此處鎖定Sheet頁是對整個Sheet頁進行鎖定了,但是客戶要求被鎖定Sheet頁中部分內(nèi)容要能夠被修改,比如:樣例報表第一層中在報表跑出來后手動填寫的區(qū)域。這種情況應該如何實現(xiàn)呢?其實很簡單,只需在一個地方稍作修改即可:
在需要被修改區(qū)域的樣式 <Style>標簽中添加一行 <Protection ss:Protected="0"/>即可,例如:
<Style ss:ID="normal"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <Font ss:FontName="宋體" x:CharSet="134" ss:Size="11" ss:Color="#000000"/> <Protection ss:Protected="0"/> </Style>
8.Row&Cell
Row一般設置行的屬性,比如行高、是否自適應行高等等, Cell設置該單元格的屬性,比如合并單元格、單元格樣式、是否用公式等等。
常見的格式如下:
<Row ss:AutoFitHeight="0" ss:Height="30">
<Cell ss:StyleID="(此處為Style的ID)" ss:Formula="(此處為公式)"><Data ss:Type="(此處為數(shù)據(jù)類型,一般為String或Number)">(此處為顯示的數(shù)據(jù))</Data></Cell>
</Row>
Style前面已經(jīng)介紹過了,Cell通過設置StyleID的屬性值來確定使用哪種樣式。
Data標簽來指明在該單元格內(nèi)的數(shù)據(jù)時什么類型的,這個很重要,因為只有此處類型為Number的單元格值才能參與后續(xù)的計算,否則即使單元格里的值看著是數(shù)字,但是其類型如果不是Number的話,是不能和其他的數(shù)值一起進行計算的。
看到此處,大家可能注意到,在什么位置設置列的寬度呢?大家可能會想到在<Cell> 標簽里加 ss:Width 標簽,其實這樣是不對,為什么呢?因為EXCEL的整列的寬度是一樣寬的,不像在HTML表格里同一列的不同單元格的寬是可以不一樣寬的,所以在EXCEL里不能在<Cell>設置單元格的寬度,<Table>標簽下,<Row>標簽之上單獨定義每一列的寬度,如下一個sheet頁所示的位置:
<Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="2" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5"> <Column ss:AutoFitWidth="0" ss:Width="74.25"/> <Row ss:AutoFitHeight="0" ss:Height="30"> <Cell><Data ss:Type="Number">134</Data></Cell> </Row> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> …… </WorksheetOptions> </Worksheet>
4.開發(fā)步驟
了解了EXCEL表格XML電子表格的語法后,我們就可以像做HTML報表那樣,直接在PL/SQL Package中進行開發(fā)EXCEL報表了。
4.1 制作Excel模板
我們可以先用Excel做出我們想要的報表的樣板,再通過另存為XML文件的形式,獲取到大量的現(xiàn)成代碼,尤其是報表樣式的定義。這樣可以給開發(fā)大大減少工作量。而且客戶提出的任何需求只要他們能在EXCEL中表現(xiàn)出來,咱們就能開發(fā)出來。
4.2 編寫公共程序
得到Excel模板生成的代碼后,我們就可以編寫程序來執(zhí)行報表的輸出工作。附件(CUX_EXCEL_REPORT_TEMPLATE.pck)是一個完整的報表模版程序包示例。
以下為公共程序包的主要Procedure。
1.PROCEDURE output_xml_header
此PROCEDURE的作用就是輸出XML的header,可以直接從EXCEL另存為得到的XML文件中COPY得到,即從一開始的<?xml version="1.0"?>一直COPY到Styles標簽結束。這樣報表頭部的定義就完成了。需要注意的是,Excel生成的StyleID全都是sXX的格式,可讀性差。如有必要,可以在這里將Style的ID命名成自己容易看懂的名稱,如gray、green和title等等。
2. PROCEDURE output_xml_ending
此PROCEDURE的作用“</Workbook>”結尾標簽。
3.
PROCEDURE OUTPUT_XML_SHEET_HEADER(P_SHEET_TITLE IN VARCHAR2, P_COL IN NUMBER, P_ROW IN NUMBER)
此PROCEDURE的作用是定義一個Sheet頁,其中p_sheet_title是Sheet頁的名稱。p_col是該Sheet頁有效數(shù)據(jù)區(qū)域的最大列數(shù)。p_row是該Sheet頁有效數(shù)據(jù)區(qū)域的最大行數(shù)。拷貝XML模板代碼中任意一個Sheet頁的定義代碼,并用相應參數(shù)變量替換Worksheet的Name屬性, Table的ExpandedColumnCount和ExpandedRowCount屬性。
4. PROCEDURE output_xml_sheet_ending
此PROCEDURE的作用輸出</Table>結尾標簽和定義該sheet頁的鼠標定位,頁面鎖定等信息,最后結束該Sheet頁。即COPY模版代碼中從Table的結束標簽到Worksheet的結束標簽。
5.
PROCEDURE OUTPUT_XML_ONE_ROW(P_DATA IN G_STRING_ARRAY, P_TYPE IN G_STRING_ARRAY, P_STYLE IN G_STRING_ARRAY)
此PROCEDURE的作用是輸出Sheet頁內(nèi)的一行數(shù)據(jù),即一個Row標簽的內(nèi)容。
其中p_data存放每個單元格的數(shù)據(jù),p_type存放每個單元格對應的數(shù)據(jù)類型,p_style存放每個單元格對應的StyleID。
具體如何輸入一行數(shù)據(jù),請查看CUX_EXCEL_REPORT_TEMPLATE.pck中該PROCEDURE的定義。
4.3 編寫報表的主程序
有了公共程序后,開發(fā)EXCLE報表就和開發(fā)HTML的報表的邏輯基本一致。只需要先分別將數(shù)據(jù)、數(shù)據(jù)類型和樣式ID依次分別存入三個數(shù)組內(nèi),再將三個數(shù)組傳給公共程序包完成輸出即可,詳細請查看CUX_EXCEL_REPORT_TEMPLATE.pck模版中的process_request過程。
4.4 定義報表
和其他報表一樣:定義可執(zhí)行、并發(fā)程序和參數(shù)等。
注意:
1. 并發(fā)程序的輸出類型選擇XML。
4.常見問題
4.1 Excel公式
EXCEL轉換成XML后,兩個文件中對公式的寫法有比較大的不同。
在EXCEL中文件的公式中可以直接用“B4”、“A5”這樣的字符串,而在XML文件中則要轉換成“R[n]C[m]”這樣的形式。
特別要注意的是這里的n和m并不是單元格的行序號和列序號,而是相對于當前單元格位置的行列偏移量。當偏移量是0時,可以直接寫“R”或“C”。其中,向右和向下偏移是正數(shù),向左和向上偏移是負數(shù)。因此,“RC”就代表當前單元格,“R[1]C”就代表當前單元格下面的那個單元格,“RC[-1]”就代表當前單元格左邊的那個單元格,依此類推。
4.2 Excel限制
(1) Sheet頁的命名不能重復,也不能太長。否則報表運行時不會報錯,但是打開的時候會報錯,這個是excel的限制。
(2) Sheet頁的個數(shù)不能超過5000個,超過的話Excel打不開(這個限制因為數(shù)據(jù)不夠,我沒有測試。只是在網(wǎng)上看到有這么一說,所以貼出來大家心里有個數(shù)就行。)。
本文題目:EBS多sheet頁Excel動態(tài)報表開發(fā)過程
文章出自:http://jinyejixie.com/article20/poedjo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、建站公司、Google、關鍵詞優(yōu)化、App設計、面包屑導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)