#### **功能介紹**
2019版報表中心集中于解決“數據出口(輸出)”的問題,提供數據統計、匯總、分析、打印、輸出、預警等一體化、通用解決方案。報表中心數據可來自于OA標準模塊、流程中心、應用中心所產生的數據,也可來自于MySQL、SQL Server、Oracle等類型第三方開發的業務系統數據。報表中心包含四種制作報表的方法,分別是明細表、統計表、圖表以及復雜報表,其中:
* 明細表適用于以多級表頭形式羅列明細清單的報表應用場景,例如各類人員花名冊、采購清單等,如下圖所示:

* 統計表適用于從橫、縱兩個方向組合多個維度(角度)統計數據的應用場景,例如人員統計表、銷售統計表,如下圖所示:

* 圖表適用于以圖表形式展示統計數據的應用場景,目前支持柱狀圖、棧柱狀圖、條形圖、棧條形圖、曲線圖、面積圖、棧面積圖、餅圖、散點圖、氣泡圖、雷達圖、儀表盤、地圖、混合圖、甘特圖等15種圖表類型,如下圖所示:

* 復雜報表適用于用戶根據管理需求自由繪制報表格式和數據展示形式的應用場景。
本手冊重點介紹復雜報表定義方法,其他類型報表定義請參考《通達OA2019版報表中心使用手冊》。
#### 快速入門
復雜報表包括設計報表和使用報表兩部分組成,設計報表又包括準備數據集和制作報表兩部分。復雜報表操作步驟如下圖所示:

#### **設計報表**
現以設計人員分析表為例,描述復雜報表的設計過程。人員分析表將按部門、分性別統計各個角色人員數量,有小計和合計,如下圖所示:

#### **準備數據集**
*****
依次點擊 “報表中心” 》 “數據源管理”,進入數據源管理界面,如下圖所示:

點擊數據源“TD\_OA”,進入該數據源數據集管理界面,如下圖所示:

點擊上圖中的“新建數據集”,然后點中“SQL語句”,進入以SQL語句定義數據集界面,如下圖所示:

在上述SQL語句編輯框中輸入本次分析需要用到的SQL語句:
*select UID as 人員UID,USER\_ID as 登錄名,USER\_NAME as 真實姓名,if(SEX=0,'男','女') as 性別,USER\_PRIV\_NAME as 角色,(select DEPT\_NAME from department*
*where DEPT\_ID=user.DEPT\_ID) as 所屬部門 from user where DEPT\_ID>0 order by DEPT\_ID,SEX,USER\_PRIV*
數據集名稱指定為“人員情況”,然后點擊“保存”完成數據集定義。在定義數據集過程中,可以通過點擊“預覽”實時查看數據情況。
#### **定義報表**
依次點擊“報表中心”》“報表管理”,進入報表管理界面,如下圖所示:

選擇分類“特性展示”,然后點擊“新建報表”,系統彈出報表類型選擇對話框,如下圖所示:

點選“復雜報表”,進入復雜報表設計器界面,該設計器采取類EXCEL方式設計,操作方式亦與EXCEL類似,如下圖所示:

工具欄包含的功能如下圖:

##### 設計表樣
設計表樣有兩種方法,第一種是在復雜報表設計器里繪制,其操作方式與操作EXCEL類似;第二種方法是通過點擊“導入表樣”按鈕導入已有的EXCEL文件。導入本章開頭里所描述的“人員情況分析表”表樣,如下圖所示:

*友情提示:復雜報表設計器兼容xls格式的EXCEL文件,但還不兼容xlsx格式的EXCEL文件。如果需要導入xlsx格式的EXCEL文件,請先轉成xls格式。*
##### 定義數據列
從字段選擇區中,選擇數據集“人員情況”,然后把字段“角色”拖拽到單元格“D2”中,如下圖所示:

數據列用藍字英文中括號字段名稱表示,如上圖中的\[角色\]。字段放置好之后,接著我們來定義數據其他屬性。選中單元格“D2”,然后點擊工具欄上的“數據設置”,系統彈出數據設置對話框,如下圖所示:

數據設置對話框包含基本、篩選、其他、單位換算三個頁簽,每個頁簽包含若干設置項。
先切換到基本頁簽(默認打開),這個頁簽包含數據集、字段以及分組、列表、匯總、無動作等數據處理方式。這里數據集為:“人員情況”,字段為:“角色”。數據處理方式解釋如下:
* 分組:把提取過來的數據進行分組顯示,分普通分組、相鄰分組以及自定義分組。普通分組指在整列范圍之內進行相同值合并分組,類似于數據庫group by操作;相鄰分組僅相鄰數據進行相同值合并分組;自定義分組可以在原始數據基礎上進行二次加工,然后再進行普通分組。關于如何定義自定義分組,請參考后面章節。
* 列表:把提取過來的數據依次羅列展示,不做任何加工處理。
* 匯總:把原始數據進行匯總計算后再顯示,匯總方式包括求和、求平均、最大值、最小值、求個數五種。
* 無動作:不做任何事情,類似于未定義。
這里按默認設置,即普通分組。
切換至篩選頁簽,如下圖所示:

這里可以定義數據篩選條件表達式以及是否“繼承父格條件”選項。這里要提取所有人信息,所以篩選條件表達式不定義,保持空白。
在其他頁簽可以定義提取數據范圍以及排序規則;單位換算頁簽可以定義數據單位換算規則。這里均保持默認設置即可。
接著定義【角色】數據擴展方式,點擊工具欄“擴展設置”,如下圖所示:

數據擴展方式包括縱向擴展(按行向下)、橫向擴展(按列向右)、不擴展三種,這里指定為“橫向擴展(按列向右)”。
最后定義【角色】父子格,點擊工具欄上的“父子格”,如下圖所示:

父子格包含“左父格”和“右父格”兩種。每種父子格有三種設置,分別是無、默認以及自定義:
* 無:無父子格關系。
* 默認:位于單元格左邊的最靠近且縱向擴展的單元格默認為該單元格的左父格;與此類似,位于單元格上方的最靠近且橫向擴展的單元格默認為該單元格的上父格。
* 自定義:指定具體單元格作為父格。能充當父格的單元格必須是定義了數據列且設置為縱向或橫向擴展。
這里父子格按默認設置即可。關于父子格將在后面章節詳細說明。
到此為止,單元格“D2”數據列設置完成,返回到設計器并把光標移到單元格“D2”上可以看到數據列定義信息,如下圖所示:

接著設置單元格“B3”數據列,設置結果如下圖所示:

單元格“C3”數據列設置結果如下圖所示:

單元格“D3”是要統計同時滿足“部門”-“性別”-“角色”這三個維度組合條件的人數,因此采取“求個數”匯總方式且不擴展,設置結果如下圖所示:

單元格“E3”數據列設置結果如下圖所示:

單元格“D4”是對部門維度一個小計,即統計滿足“部門”-“角色”兩個維度條件(不分性別)的人數,因此“部門”所在的單元格“B3”是左父格,“角色”所在的單元格“D2”是上父格。由于“部門”所在的單元格“B3”不在“D4”單元格的左邊,因此左父格需要設置為“自定義”方式手動指定為左父格為“B3”,而上父格按默認設置即可。“D4”數據列設置結果如下圖所示:

單元格“E4”數據列設置結果如下圖所示:

單元格“D5”數據列設置結果如下圖所示:

單元格“E5“數據列設置結果如下圖所示:

至此,該報表主體已經定義完成。最后,在操作欄中輸入報表名稱為“人員情況分析表”,選擇報表分類為“特性展示”,然后點擊“保存”完成設計報表工作,如下圖所示:

關閉報表設計器界面,返回到報表管理界面,可以看到剛才新建的報表,如下圖所示:

#### 使用報表
在使用報表之前,先分配好權限,點擊上圖中的權限設置圖標,分配權限如下圖所示:

依次點擊“報表中心”》“我的報表”,從左邊報表分類樹里,找到要訪問的報表并點擊即可,如下圖所示:

### **父子格**
#### **父子格概念**
復雜報表定義的基本單元是單元格,單元格之間本身是沒有關系的,為了建立起單元格之間的關系從而引入了“父子格”概念。父子格分左父格和上父格兩種,父子格在子格一方設置,設置了父子格的單元格之間就構成了父子格關系。能作為父格的單元格需要具備以下條件:
* 設置了數據列。
* 設置了擴展方式,且擴展方式必須是橫向擴展或縱向擴展之一。
父子格可選設置有以下三種:
* 無:即該單元格無父格。
* 默認:默認的左父格取位于單元格左邊同一行的或者是合并的單元格能夠覆蓋該行的、最靠近且具備父格條件的單元格;默認的上父格取位于單元格上方同一列或者是合并的單元格能夠覆蓋該列的、最靠近且具備父格條件的單元格。注意:按行向下擴展的單元格才有默認左父格,按列向右擴展的單元格沒有默認左父格;同理,按列向右擴展的單元格才有默認上父格,按行向下擴展的單元格沒有默認上父格。
* 自定義:手動指定父格。
#### **父子格關系**
父子格關系包含以下兩層含義:
* 擴展跟隨關系:子格跟隨父格的擴展而擴展。
* 條件傳遞關系:子格的數據需要滿足父格條件,即父格限制了子格能夠取到的數據范圍。
#### **例子**
為了進一步闡明父子格關系,現舉例說明如下:
##### 默認左父格關系

單元格“A1”、“B1”的左父格及上父格都按默認設置,那么“A1”沒有左父格,也沒有上父格;“B1”左父格是“A1”,沒有上父格,運行該報表結果如下:

從運行結果可以看出:“B1”跟隨“A1”的擴展而擴展,且繼承了“A1”的條件。
##### 自定義左父格關系

單元格“B2”的左父格自定義為單元格“A1”,該報表運行結果如下:

從運行結果可以看出:“B2”跟隨“A1”的擴展而擴展,且繼承了“A1”的條件。
##### 無左父格關系

定義單元格“B2”左父格為無或者默認(由于“A1”和“B2”不在同一行,因此默認設置時“B2”實際上也是沒有左父格的),運行報表后的結果如下:

從運行結果可以看出:“A1”和“B2”各自分別擴展;“B2”沒有跟隨“A1”的擴展而擴展,也沒有繼承“A1”的條件。
##### 默認上父格關系

單元格“A1”、“A2”父子格均按默認設置,即“A2”的上父格為“A1”。運行該報表結果如下:

從運行結果可以看出:“A2”跟隨“A1”的擴展而擴展,且繼承了“A1”的條件。
##### 自定義上父格關系

通過自定義單元格“B2”的上父格為單元格“A1”,使單元格“A1”和單元格“B2”之間構成上父子格關系。運行該報表結果如下:

從運行結果可以看出:“B2”跟隨“A1”的擴展而擴展,且繼承了“A1”的條件。
##### 無上父格關系

根據設置單元格“B2”無上父格,即“A1”和“B2”沒有形成上父子格關系。運行該報表結果如下:

從運行結果可以看出:“A1”和“B2”各自分別擴展;“B2”沒有跟隨“A1”的擴展而擴展,也沒有繼承“A1”的條件。
##### 混合父格

其中,單元格“A1”縱向(按行向下)擴展,父子格默認設置;單元格“B1”橫向(按列向右)擴展,左父格自定義為“A1”,父子格默認設置;單元格“C1”按行向下擴展,父子格默認設置。運行該報表結果如下:

#### **自定義分組**
復雜報表除了支持常規分組之外,還支持自定義分組。在定義數據列時把數據分組設置為“自定義”,然后可以通過點擊“添加分組”來創建自定義分組。我們可以以角色號作為分組標準分成三組,分別為:角色小于等于10為一組,角色號介于10至20之間為二組,角色大于20為三組,如下圖所示:


#### **條件格式**
復雜報表支持條件格式功能,即可通過設置條件來格式化單元格格式。設置的方法是:把光標移到數據列,然后點擊工具欄的“條件格式”功能,即可設置條件格式,如下圖所示:

條件格式由條件和格式組成,一個數據列可以設置多個條件格式,例如某報表銷售額條件格式設置如下圖:

### **表達式詳解**
#### **單元格表達式**
單元格表達式直接在單元格中定義,例如:=sum(A1:A2),類似MS Excel計算公式。當前版本支持以下函數:
ABS、ACOS、ACOSH、AND、ASIN、ASINH、ATAN、ATAN2、ATANH、AVERAGE、AVERAGEA、COS、COSH、COUNT、COUNTA、COUNTBLANK、COUNTIF、DATE、DAY、DOLLAR、EXP、FACT、INT、IF、LN、LOG、LOG10、MAX、MIN、MOD、MONTH、NOT、NOW、ODD、OR、PI、POWER、RADIANS、RAND、ROUND、ROUNDDOWN、ROUNDUP、SIGN、SIN、SINH、SQRT、SUM、SUMSQ、TAN、TANH、TIME、TODAY、TRUNC、YEAR、WEEKDAY、FALSE、TRUE、EVEN、TRIM、CEILING、FLOOR、CONCATENATE、DEGREES、FIXED、HOUR、MINUTE、SECOND、ISEVEN、ISODD、ISBLANK、ISNA、ISLOGICAL、ISERR、ISERROR、ISNONTEXT、ISNUMBER、ISTEXT、LEN、LEFT、RIGHT、MID、LOWER、UPPER、SUMIF、COUNTIF、AVERAGEIF、HLOOKUP、VLOOKUP、RANK
每個函數具體如何應用,請參考EXCEL函數幫助文檔。
#### 數據列篩選條件表達式
數據列篩選條件表達式由函數、算術運算符、關系運算符以及邏輯運算符構成。
* 算術運算符包含:+、-、\*、/、MOD(取余);
* 關系運算符包含:=、\\=、>、LIKE(形如)、IN(屬于)、NOTIN(不屬于)、BETWEEN(介于)、ISNOTNULL(有值)、ISNULL(無值)
* 邏輯運算符包含:&&(與)、||(或)、!(非)
* 函數包含以下幾大類:
* 數值(含貨幣)函數
* 日期和時間函數
* 字符串函數
* 集合函數
* 轉換函數
* 類型不定函數
* 系統函數
* 常量
##### 數值(含貨幣)函數
**FLOOR(\\)**
此函數返回數值表達式的整數部分。例如:FLOOR(125.34) 返回結果為:125。參數類型必須是數值型或者貨幣型。
**ROUND(\\,整數)**
此函數整數部分規定保留的小數點位數。例如:ROUND (125.256,2) 返回結果為:125.26。
**RAND()**
返回一個0至1之間隨機數。
**ABS(\\)**
此函數返回數值表達式的絕對值。例如:ABS (-125) 返回結果為:125。參數類型必須是數值型或者貨幣型。
##### 日期表達式
**YEAR(\\)**
此函數返回日期表達式的年份值。例如:YEAR(#2007.1.28#) 返回結果為:2007。
**MONTH(\\)**
此函數返回日期表達式的月份值。例如:MONTH(#2007.1.28#) 返回結果為:1。
**DAY(\\)**
此函數返回日期表達式的天數。例如:DAY(#2007.1.28#) 返回結果為:28。
**QUARTER(\\)**
此函數返回日期表達式的季度值。例如:QUARTER(#2007.1.28#) 返回結果為:1。
**WEEK(\\)**
此函數返回日期表達式的周數。例如:WEEK(#2007.1.28#) 返回結果為:4。
**DAYOFWEEK(\\)**
此函數返回日期表達式的星期數。注:星期日返回1,星期一返回2,依次類推。
例如:DAYOFWEEK (#2007.1.28#) 返回結果為:1
**HOUR(\\)**
此函數返回日期表達式的小時數。例如:HOUR(#2007.1.28 09:59:42#) 返回結果為:9
**MINUTE(\\)**
此函數返回日期表達式的分鐘數。例如:MINUTE(#2007.1.28 09:59:42#) 返回結果為:59。
**SECOND(\\)**
此函數返回日期表達式的秒數。例如:SECOND(#2007.1.28 09:59:42#) 返回結果為:42。
**THISDATE**
此函數返回當前日期。
**THISYEAR**
此函數返回當前年份值。
**THISQUARTER**
此函數返回當前季度值。
**THISMONTH**
此函數返回當前月份值。
**THISWEEK**
此函數返回當前周數。
**THISDAYOFWEEK**
此函數返回當前星期數。注:星期日返回1,星期一返回2,依次類推
**THISHOUR**
此函數返回當前時間小時部分。
**THISMINUTE**
此函數返回當前時間分鐘部分。
**THISSECOND**
此函數返回當前時間秒部分。
**YEARBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的年份值。例如:YEARBETWEEN(#2005.07.03#,#2007.07.28#) 返回結果為:2。
**MONTHBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的月份值。例如:MONTHBETWEEN(#2007.01.28#,#2007.07.28#) 返回結果為:6。
**DAYBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的天數。例如:DAYBETWEEN(#2007.01.03#,#2007.01.28#) 返回結果為:25。
**QUARTERBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的季度值。例如:QUARTERBETWEEN(#2007.01.03#,#2007.07.28#) 返回結果為:2。
**WEEKBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的周數。例如:WEEKBETWEEN(#2007.01.03#,#2007.01.28#) 返回結果為:3。
**HOURBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的小時值。
例如:HOURTWEEN(#2007.01.03 09:59:42#,#2007.01.24 10:59:42#) 返回結果為:1
**MINUTEBETWEEN(\\,\\)**
此函數返回日期表達式1到日期表達式2的分鐘值。
例如:MINUTEBETWEEN(#2007.01.03 09:59:42#,#2007.01.24 10:59:42#) 返回結果為:60
**SECONDBETWEEN (\\,\\)**
此函數返回日期表達式的秒部分。例如:SECONDBETWEEN(#2007.1.28 09:59:42#) 返回結果為:42
**ADDYEAR(\\,整數)**
此函數返回日期表達式增加指定年數后的日期值。例如:ADDYEAR(#2005.07.03#,2) 返回結果為:#2007.07.03#。
**ADDMONTH(\\,整數)**
此函數返回日期表達式增加指定月數后的日期值。例如:ADDMONTH(#2007.07.03#,2) 返回結果為:#2007.09.03#。
**ADDDAY(\\,整數)**
此函數返回日期表達式增加指定日數后的日期值。例如:ADDDAY(#2005.07.03#,2) 返回結果為:#2005.07.05#。
**ADDQUARTER(\\,整數)**
此函數返回日期表達式增加指定季節數后的日期值。例如:ADDQUARTER(#2007.01.03#,2) 返回結果為:#2007.07.03#。
**ADDWEEK(\\,整數)**
此函數返回日期表達式增加指定周數后的日期值。例如:ADDWEEK(#2007.01.03#,3) 返回結果為:#2007.01.24#。
**ADDHOUR(\\,整數)**
此函數返回日期表達式增加指定小時后的日期值。例如:ADDHOUR(#09:59:42#,1) 返回結果為:#10:59:42#。
**ADDMINUTE(\\,整數)**
此函數返回日期表達式增加指定分鐘后的日期值。例如:ADDMINUTE(#09:59:42#,2) 返回結果為:#10:01:42#。
**ADDSECOND (\\,整數)**
此函數返回日期表達式增加指定秒后的日期值。例如:ADDSECOND (#09:59:42#,1) 返回結果為:#09:59:43#。
##### 字符串函數
**CONCAT(\\,\\,...,\\)**
此函數連接多個字符串。例如:CONCAT(“abc”,”def”,”g”) 返回結果為:”abcdefg”。
**TRIM(\\)**
此函數截取字符串表達式左右兩邊多余空格。例如:TRIM(“ abc “) 返回結果為:”abc”。
**LTRIM(\\)**
此函數截取字符串表達式左邊多余空格。例如:LTRIM(“ abc “) 返回結果為:”abc “。
**RTRIM(\\)**
此函數截取字符串表達式左邊多余空格。例如:RTRIM(“ abc “) 返回結果為:” abc”。
**SUBSTR(\\,起始位,長度>)**
此函數返回字符串表達式從\[起始位\]開始共\[長度\]個字符的子串。例如:SUBSTR(“abcd”, 2, 2) 返回結果為:”bc”。
**STRLEN(\\)**
此函數返回字符串表達式所包含的字符個數。例如:STRLEN(“abcd你好”) 返回結果為:6。
**LEFT(\\,長度>)**
此函數返回字符串表達式左邊開始共\[長度\]個字符的子串。例如:LEFT(“abcd你好”, 5) 返回結果為:”abcd你”。
**RIGHT(\\,長度>)**
此函數返回字符串表達式右邊開始共\[長度\]個字符的子串。例如:左串(“abcd你好”, 3) 返回結果為:”d你好”。
**STRPOS(\\,\\)**
此函數返回字符串表達式1中首次出現字符串表達式2的位置,字符位置從1開始計數,未搜索到時返回0。 例如:STRPOS(“abcd你好”, “bcd”) 返回結果為:2。
**REPLACE(\\,\\,\\)**
此函數返回用替換用的字符串表達式替換待搜索的字符串表達式中出現的所有待查找的字符串表達式。例如:REPLACE(“abcdefghicde”,”cde”,”xxx”) 返回結果為:abxxxfghixxx。
**REG(\\,\\)**
此函數返回字符串表達式是否滿足正則表達式規則,滿足返回1,否則返回0。例如:REG(“fo\\no”, “\\^fo\\no$”) 返回結果為:1。
**PINYINQUANMA(\\)**
返回\\對應的拼音。 例如:PINYINQUANMA(“中國”),返回結果為:zhongguo。
**PINYINJIANMA(\\)**
返回\\對應的拼音簡稱。 例如:PINYINJIANMA(“中國”),返回結果為:zg。
##### 集合函數
**SET(\\,\\,\\)**
例如:集合(1,2,3,4),集合(”abc”,”cde”,”efg”)。
##### 轉換函數
**STRTODATETIME (\\)**
把字符串表達式轉換為日期型。
**STRTOFLOAT(\\)**
把字符串表達式轉換為數值型。
**FLOATTOSTR(\\)**
把數值表達式轉換為字符型。
**FLOATTODATETIME(\\)**
把數值表達式轉換為日期型。
**DATETIMETOSTR(\\)**
把日期表達式轉換為字符型。
##### 類型不定函數
**IF THEN \[ELSE\] END**
例如:IF 商品=“牛奶” THEN 0.02 ELSE 0.1 END,其中ELSE部分可以省略。
**CASE IF cexpr1 THEN expr1 IF cexpr2 THEN expr2 \[ELSE exprn\] END**
例如:CASE IF 商品=“牛奶” THEN 0.02
IF 商品=“面包” THEN 0.015
IF 商品=“電視” THEN 0.15
ELSE 0.1 END
**GREATER (表達式1,表達式2)**
返回表達式1、表達式2中的較大者。
**LESS (表達式1,表達式2)**
返回表達式1、表達式2中的較小者。
##### 系統函數
**LOGIN\_UNIT**
返回當前單位名稱。
**LOGIN\_USER**
返回當前登錄系統的用戶姓名。
**LOGIN\_DEPT**
返回當前登錄系統的用戶所在的部門名稱。
**LOGIN\_PRIV**
返回當前登錄系統的用戶所在的角色名稱。
**WRITE\_DEPT**
返回當前數據的創建者所在部門名稱。
**WRITER**
返回當前數據的創建者姓名。
**WRITETIME**
返回當前數據的創建日期。
**SYSDATE**
返回系統時間戳。
**LOGIN\_USER\_ID**
返回當前登錄用戶USER\_ID。
**LOGIN\_DEPT\_ID**
返回當前登錄用戶所屬部門DEPT\_ID。
**LONG\_DEPT\_NAME**
返回當前登錄用戶所屬部門長部門名稱,例如:分公司一/財務部。
**LOGIN\_OTHER\_PRIV**
返回當前登錄用戶輔助角色ID。
**LOGIN\_UID**
返回當前登陸用戶UID。
##### 常量
**TRUE**
**FALSE**
**NULL**
**#2007.1.28#:**
返回2007年1月28日。
**#1.28#:**
返回本年1月28日。注意:日期常量用"#” 引起來。
**"張三”:**
返回字符常量張三。注意:字符常量用””(英文半角雙引號)引起來。
### API接口
復雜報表除了提供上述標準化功能之外,還允許用戶通過掛接自定義腳本插件以實現個性化報表需求。自定義腳本插件命名規則是XXX.php,其中XXX代表該報表的id(id可以通過查看編輯報表頁面的地址而得到),存放路徑為webroot\\general\\appbuilder\\modules\\report\\plugin。用戶自定義的腳本插必須實現以下函數:
/\*\*
\*這里實現個性化報表需求
\*\\@param $obj\_custome\_report 代表當前復雜報表對象
\*\\@return void
\*/
function mydraw($obj\_custom\_report){
//按以下方式調用復雜報表接口
//$obj\_custom\_report->doCreateSheet(“我的報表”);
}
復雜報表處理引擎會在**解析執行當前報表邏輯完成之后、最終輸出報表之前**判斷本報表是否掛接有腳本插件,如果有,則包含該腳本文件并調用mydraw方法,并給它傳遞代表當前復雜報表對象的$obj\_custom\_report。復雜報表自定義腳本插件舉例如下:
\\<?/\*\*\*這里實現個性化報表需求\*\\@param $obj\_custome\_report 代表當前復雜報表對象\*\\@return void\*/function mydraw($obj\_custom\_report){//按以下方式調用復雜報表接口//$obj\_custom\_report->doCreateSheet(“我的報表”);$arr\_align = \["horizontal" => "left", "vertical" => "center"\];//對齊方式$arr\_border = \["style" => "thin", "color" => \["argb" => "FF000000"\]\];//$arr\_Borders = \["left"=>$arr\_border, "right"=>$arr\_border,"top"=>$arr\_border,"bottom"=>$arr\_border\];// 邊框$arr\_header = \["type"=>"solid", "color"=>\["argb"=>"FF0000FF"\]\];//藍色 表頭背景色$arr\_odd = \["type"=>"solid", "color"=>\["argb"=>"FF00FF00"\]\];//綠色 奇數行背景數$arr\_even = \["type"=>"solid", "color"=>\["argb"=>"FFFFFF00"\]\];//綠色 偶數行背景色
//獲得數據集所有數據$arr\_row = $obj\_custom\_report->doOpenDataset("人員情況");if(!empty($arr\_row)){$i\_col = 0;foreach($arr\_row\[0\] as $s\_key => $s\_val){ //輸出表頭
$obj\_custom\_report->doSetValue(0, $i\_col, 1, iconv("GBK", "UTF-8", $s\_key));$obj\_custom\_report->doSetBorders(0, $i\_col, 1, $arr\_Borders);$obj\_custom\_report->doSetFill(0, $i\_col, 1, $arr\_header);$obj\_custom\_report->doSetAlign(0, $i\_col, 1, $arr\_align);$i\_col++;}
$i\_row = 2;$i\_prev\_row = 2;$s\_prev\_val = "";foreach($arr\_row as $row){//輸出數據$i\_col = 0;foreach($row as $s\_val){$obj\_custom\_report->doSetValue(0, $i\_col, $i\_row, iconv("GBK", "UTF-8", $s\_val));$obj\_custom\_report->doSetBorders(0, $i\_col, $i\_row, $arr\_Borders);if($i\_row % 2 == 0){$obj\_custom\_report->doSetFill(0, $i\_col, $i\_row, $arr\_even);}else{$obj\_custom\_report->doSetFill(0, $i\_col, $i\_row, $arr\_odd);}$obj\_custom\_report->doSetAlign(0, $i\_col, $i\_row, $arr\_align);if($i\_col == 5){if($s\_prev\_val != "" && $s\_prev\_val != $s\_val){if($i\_prev\_row \\< $i\_row - 1){$obj\_custom\_report->doMergeCells(0, 5, $i\_prev\_row, 5, $i\_row - 1);}$i\_prev\_row = $i\_row;}$s\_prev\_val = $s\_val;}$i\_col++;}$i\_row++;}if($i\_prev\_row \\< $i\_row - 1){$obj\_custom\_report->doMergeCells(0, 5, $i\_prev\_row, 5, $i\_row - 1);}}}?>
運行結果如下圖所示:

復雜報表對象$obj\_custom\_report包含有豐富的接口供用戶調用以實現個性化報表需求。復雜報表對象包含的API說明如下:
#### **添加空白工作表**
/\*\*\* 添加空白工作表\* \\@param string $sTitle\* \\@param int $iSheetIndex 插入工作表位置(基于0)\* \\@return MySheet 新工作表對象\*/public function doCreateSheet($sTitle = "", $iSheetIndex = NULL)
#### **拷貝工作表**
/\*\*\* 拷貝工作表\* \\@param string $sSourceSheetName 待拷貝的工作表名稱\* \\@param string $sTargetSheetName 新工作表名稱\* \\@param int $iSheetIndex 插入工作表位置(基于0)\*/public function doCopySheet($sSourceSheetName, $sTargetSheetName, $iSheetIndex = NULL)
#### **刪除工作表**
/\*\*\* 刪除工作表\* \\@param $iSheetIndex 工作表號(基于0)\*/public function doRemoveSheet($iSheetIndex)
#### **獲得工作表號**
/\*\*\* 獲得工作表號\* \\@param $sSheetName 工作表名\* \\@return int\*/public function doGetSheetIndex($sSheetName)
#### **獲得工作表名**
/\*\*\* 獲得工作表名\* \\@param $sSheetName 工作表名\* \\@return string\*/public function doGetSheetName($iSheetIndex)
#### **刪除工作表**
/\*\*\* 刪除工作表\* \\@param $sSheetName 工作表名\*/public function doRemoveSheetByName($sSheetName)
#### **獲得最大列號**
/\*\*\* 獲得最大列號\* \\@param $iSheetIndex 工作表號(基于0)\* \\@return int\*/public function doGetMaxColumn($iSheetIndex)
#### **獲得最大行號**
/\*\*\* 獲得最大行號\* \\@param $iSheetIndex\* \\@return int\*/public function doGetMaxRow($iSheetIndex)
#### **獲得單元格區間**
/\*\*\* 獲得單元格區間\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array \["x1","y1","x2","y2"\]\*/public function doGetRegion($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **獲得字體信息**
/\*\*\* 獲得字體信息\* underline: none double doubleAccounting single singleAccounting\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array\*/public function doGetFont($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **設置字體信息**
/\*\*\* 設置字體\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param array $arrFont 字體信息,參考getFont\*/public function doSetFont($iSheetIndex, $iColumn = 0, $iRow = 1, $arrFont = \[\])
#### **獲得對齊信息**
/\*\*\* 獲得對齊方式\* 水平對齊:general left right center centerContinuous justify\* 垂直對齊:bottom top center justify\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array\*/public function doGetAlign($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **設置對齊信息**
/\*\*\* 設置對齊方式\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param array $arrFont 對齊方式,參考getAlign\*/public function doSetAlign($iSheetIndex, $iColumn = 0, $iRow = 1, $arrAlign = \[\])
#### **獲得單元格邊框**
/\*\*\* 獲得單元格邊框\* 對角線方向:const DIAGONAL\_NONE = 0; const DIAGONAL\_UP = 1; const DIAGONAL\_DOWN = 2;const DIAGONAL\_BOTH = 3;\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array\*/public function doGetBorder($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **設置單元格邊框**
/\*\*\* 設置單元格邊框\* 對角線方向:const DIAGONAL\_NONE = 0; const DIAGONAL\_UP = 1; const DIAGONAL\_DOWN = 2;const DIAGONAL\_BOTH = 3;\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param array $arrBorders: \["left","right","top","bottom","diagonal","diagonaldirection","allborders"\]\*/public function doSetBorders($iSheetIndex, $iColumn = 0, $iRow = 1, $arrBorders = \[\])
#### **獲得單元格填充方式**
/\*\*\* 獲得單元格填充方式\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array\*/public function doGetFill($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **設置單元格填充方式**
/\*\*\* 設置單元格填充方式\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param array $arrFills 格式參考getFill\*/public function doSetFill($iSheetIndex, $iColumn = 0, $iRow = 1, $arrFills = \[\])
#### **獲得單元格數據格式化方式**
/\*\*\* 獲得單元格數據格式化方式\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return array\* code值為:General、\\@、0、0.00、#,##0.00、#,##0.00\*-、0%、0.00%、yyyy-mm-dd、yy-mm-dd、dd/mm/yy、d/m/y、d-m-y、d-m、m-y、mm-dd-yy、d-mmm-yy、d-mmm、mmm-yy、m/d/yy h:mm、d/m/y h:mm、h:mm AM/PM、h:mm:ss AM/PM、h:mm、h:mm:ss、mm:ss、h:mm:ss、i:s.S、h:mm:ss;\\@、yy/mm/dd;\\@、$#,##0.00\*-、$#,##0\*-、\[$EUR \]#,##0.00\*-\*/public function doGetNumberFormat($iSheetIndex, $iColumn = 0, $iRow = 1)
#### **設置單元格數據格式化方式**
/\*\*\* 設置單元格格式化方式\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param array $arrFormat\*/public function doSetNumberFormat($iSheetIndex, $iColumn = 0, $iRow = 1, $arrFormat = \[\])
#### **獲得列寬度**
/\*\*\* 獲得列寬度\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@return int\*/public function doGetColumnWidth($iSheetIndex, $iColumn = 0)
#### **設置列寬度**
/\*\*\* 設置列寬度\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param int $iWidth 寬度\*/public function doSetColumnWidth($iSheetIndex, $iColumn = 0, $iWidth = 0)
#### **獲得行高度**
/\*\*\* 獲得行高度\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return int\*/public function doGetRowHeight($iSheetIndex, $iRow = 1)
#### **設置行高度**
/\*\*\* 設置行高度\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param int $iWidth 寬度\*/public function doSetRowHeight($iSheetIndex, $iRow = 1, $iHeight = 0)
#### **獲得列是否可視**
/\*\*\* 獲得列是否可視\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@return boolean\*/public function doGetColumnVisible($iSheetIndex, $iColumn = 0)
#### **設置列是否可視**
/\*\*\* 設置列是否可視\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 列號(基于0)\* \\@param boolean $bVisible 是否可視\*/public function doSetColumnVisible($iSheetIndex, $iColumn = 0, $bVisible = false)
#### **獲得行是否可視**
/\*\*\* 獲得行是否可視\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@return boolean\*/public function doGetRowVisible($iSheetIndex, $iRow = 0)
#### **設置行是否可視**
/\*\*\* 設置行是否可視\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iRow 行號(基于1)\* \\@param boolean $bVisible 是否可視\*/public function doSetRowVisible($iSheetIndex, $iRow = 0, $bVisible = false)
#### **合并單元格**
/\*\*\* 合并單元格\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iStartCol 起始列號(基于0)\* \\@param $iStartRow 起始行號(基于1)\* \\@param $iEndCol 終止列號(基于0)\* \\@param $iEndRow 終止行號(基于1)\*/public function doMergeCells($iSheetIndex, $iStartCol, $iStartRow, $iEndCol, $iEndRow)
#### **取消合并單元格**
/\*\*\* 取消合并單元格\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iStartCol 起始列號(基于0)\* \\@param $iStartRow 起始行號(基于1)\* \\@param $iEndCol 終止列號(基于0)\* \\@param $iEndRow 終止行號(基于1)\*/public function doUnmergeCells($iSheetIndex, $iStartCol, $iStartRow, $iEndCol, $iEndRow)
#### **插入行**
/\*\*\* 插入行\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iBefore 插入行位置(基于1)\* \\@param $iNumRows 插入行數\*/public function doInsertNewRowBefore($iSheetIndex, $iBefore = 1, $iNumRows = 1)
#### **插入列**
/\*\*\* 插入列\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iBefore 插入列位置(基于1)\* \\@param $NumColumns 插**入列數********\*/********public function doInsertNewColumnBefore($iSheetIndex, $iBefore = 0, $NumColumns = 1)**
#### **刪除行**
/\*\*\* 刪除行\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iRow 刪除行位置(基于1)\* \\@param int $iNumRows 刪除行數\*/public function doDeleteRow($iSheetIndex, $iRow, $iNumRows = 1)
#### **刪除列**
/\*\*\* 刪除列\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param int $iColumn 刪除列位置(基于0)\* \\@param int $iNumColumns 刪除列數\*/public function doDeleteColumn($iSheetIndex, $iColumn = 0, $iNumColumns = 1)
#### **獲得單元格數據**
/\*\*\* 獲得單元格數據\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iColumn 列號(基于0)\* \\@param $iRow 行號(基于1)\* \\@return mixed\*/public function doGetValue($iSheetIndex, $iColumn, $iRow)
#### **設置單元格數據**
/\*\*\* 設置單元格數據\* \\@param $iSheetIndex 工作表號(基于0)\* \\@param $iColumn 列號(基于0)\* \\@param $iRow 行號(基于1)\* \\@param mixed $pValue 數值\*/public function doSetValue($iSheetIndex, $iColumn, $iRow, $pValue)
#### **設置單元格日期時間數據**
/\*\*
\* 設置單元格日期時間數據
\* \\@param $iSheetIndex 工作表號(基于0)
\* \\@param $iColumn 列號(基于0)
\* \\@param $iRow 行號(基于1)
\* \\@param $iYear 年
\* \\@param $iMonth 月
\* \\@param $iDay 日
\* \\@param $iHour 小時
\* \\@param $iMinute 分鐘
\* \\@param $iSecond 秒
\*/
public function doSetDateTimeValue($iSheetIndex, $iColumn, $iRow, $iYear, $iMonth, $iDay, $iHour, $iMinute, $iSecond)
#### **獲得本地數據庫連接**
/\*\*
\* 獲得本地數據庫連接
\* \\@return \\yii\\db\\Connection
\*/
public function doGetDb()
根據數據庫連接操作數據庫,常見方法舉例如下:
$command = $connection->createCommand('SELECT \* FROM post');
$posts = $command->queryAll();
$post = $command->queryOne();
$command = $connection->createCommand('UPDATE post SET status=1');
$command->execute();
$command = $connection->createCommand('SELECT \* FROM post WHERE id=:id');
$command->bindValue(':id', $\_GET\['id'\]);
$post = $command->query();
#### 獲得數據源里配置的數據庫連接
/\*\*
\* 獲得第三方數據庫訪問鏈接功能
\* \\@param $s\_sername 數據源名稱
\* \\@param string $s\_db 數據庫名稱
\* \\@return mixed|null 數據庫連接
\*/
public function doGetOtherDB($s\_sername, $s\_db = "")
#### **獲得參數值**
/\*\*
\* 獲得參數值
\* \\@return array
\*/
public function doGetParams()
#### **打開數據集(返回數據集所有數據)**
/\*\*
\* 打開數據集
\* \\@param $s\_dataset 數據集名稱
\* \\@return array
\*/
public function doOpenDataset($s\_dataset)
- 個人事務
- 電子郵件
- 消息管理
- 任務管理
- 公告通知
- 新聞
- 投票
- 個人考勤
- 日程安排
- 工作日志
- 通訊簿
- 個人文件柜
- 任務中心
- 流程中心
- 流程中心簡介及菜單構成
- 新建工作
- 我的工作
- 工作查詢
- 工作監控
- 超時統計分析
- 工作委托
- 工作銷毀
- 流程日志查詢
- 數據報表
- 工作流設置
- 流程中心應用實例
- 行政辦公
- 公告通知管理
- 公告通知審批
- 新聞管理
- 投票管理
- 詞語過濾管理
- 信息過濾審核
- 工作計劃
- 辦公用品管理
- 會議管理
- 車輛申請與安排
- 固定資產管理
- 圖書管理
- 資源申請與管理
- 組織機構信息
- 知識管理
- 公共文件柜
- 公共文件柜設置
- 網絡硬盤
- 網絡硬盤設置
- 圖片瀏覽
- 圖片瀏覽設置
- 智能門戶
- 門戶管理
- 我的門戶
- 門戶日志管理
- 門戶內容管理
- 應用中心
- 功能介紹
- 使用說明
- EXCEL表單設計器
- 系統自帶應用介紹
- 函數詳解
- 腳本編寫指南
- 報表中心
- 我的報表
- 報表管理
- 復雜報表
- 分類管理
- 回收站
- 人力資源
- 人事管理
- 招聘管理
- 培訓管理
- 考勤管理
- 績效考核
- 積分管理
- 薪酬管理
- 人力資源設置
- 在線考試
- 檔案管理
- 卷庫管理
- 案卷管理
- 文件管理
- 案卷借閱
- 檔案統計
- 檔案銷毀
- 交流園地
- 企業社區
- 討論區
- 討論區設置
- 企業開放平臺
- 單點登錄平臺
- 統一工作待辦
- 移動開放平臺
- 附件程序
- 實用信息
- 即時通訊
- 系統管理
- 組織機構設置
- 行政辦公設置
- 信息交流設置
- 企業微信釘釘集成
- 印章管理
- 手機簽章管理
- 水印管理
- 功能管理中心
- 定時任務管理
- 緊急通知設置
- 界面設置
- 狀態欄設置
- 菜單設置
- 系統代碼設置
- 自定義字段設置
- 數據庫管理
- 系統日志管理
- 系統資源管理
- 附件管理
- 系統訪問控制
- 系統參數設置
- 系統接口設置
- 服務器監控
- 移動設備綁定管理
- 數據源管理
- 注冊外部應用
- 系統信息
- PC客戶端使用手冊
- 移動客戶端使用手冊