反饋已提交

網絡繁忙

JS實現大數據集匯出Excel

1. 概述

1.1 版本

報表伺服器版本功能變更
11.0-
11.0.10

新增支援匯出為 CSV 型別檔案,支援修改編碼格式

1.2 應用場景

大批量資料匯出的時候,會對伺服器、網路傳輸、資料庫造成一定的壓力。
為了防止這樣的風險,FineReport 11.0 新增了「大數據集匯出」的功能,可直接根據資料集結果進行匯出。

1.3 功能描述

「大數據集匯出」是一種佔用資源少且速度快的 Excel 匯出方式,無需前臺資料展示即可進行後臺流式匯出。
該功能主要是針對明細表,使用者透過自訂 JavaScrpit 代碼呼叫API,實現跨越報表計算直接取數匯出。實現原理如下:
1)使用 SXSSFWorkbook 流式行匯出,速度快。
2)使用生産者消費者模式,一個執行緒用於取數,把資料行存在佇列中,另一執行緒讀取行匯出。

1.4 API簡介

大數據集匯出API:directExportToExcel: function (dsName, fileName, params, colNames,forMat,enCoding)

Key  Value  舉例  
sessionID具體 sessionID-
dsName資料集名稱ds1
fileName匯出檔案名稱稱,不指定使用預設「範本名-資料集名稱.xlsx」銷量
params資料集參數 JSON,參數名:參數值{

id: '9527',

name:'Stephen'

}

colNames

列名稱用逗號分割,不指定使用資料集所有欄位

col1,col2,...

forMat

注:11.0.10及以後新增

匯出的格式只支援 xlsx 或 csv,可以不寫,預設匯出為Excel

"xlsx"

注:若不設定,則為""

enCoding

注:11.0.10及以後新增

編碼格式值可以為 UTF-8 或 GBK,匯出格式為 csv 時生效,預設為 UTF-8

"UTF-8"

注:若不設定,則為""

API範例如下:

//API為directExportToExcel: function (dsName, fileName, params, colNames)
//注意參數中的特殊字元需要進行url編碼,比如大括號,冒號等。
var paramStr = encodeURIComponent("{param1:1,param2:\"21','22\",param3:\"text\",...}")
//資料集傳參,字串參數建議寫成格式\"text\"
var colNames = encodeURIComponent("col1, col2, col3,...")
//指定匯出的資料列,匯出欄位按此順序排列,為空預設匯出所有
_g().directExportToExcel("資料集名稱", "匯出檔案名稱稱", paramStr, colNames, forMat, enCoding)

1.5 注意事項

1)此功能只支援關系型資料庫。且 SQL Server 資料庫需要把游標設定為伺服器游標。
2)Oracle 資料庫,SQL 查詢時預設傳回的列名是大寫,所以 JS 傳入 colNames 參數時,列名大小寫要與其保持一緻。
3)此功能無法直接匯出 date/datetime 型空值,需要在 JDBC 資料連結的 URL 後新增 zeroDateTimeBehavior=convertToNull 參數。
4)建議匯出的資料量不超過「1000W 行 * 20 列」,資料量超大可能會導緻僅匯出部分資料。
5)匯出的 Excel 是透過 SQL 語句直接從資料庫中獲取的資料,並非報表中的資料,因此報表中設定的資料格式等無法被匯出。
6)此功能不支援行動端。
7)匯出超過 5s 時顯示進度條。
8)不支援cptx範本(cptx 範本指原10.0版本使用新計算引擎製作的報表。)

2. 範例一:大數據集匯出固定參數值

2.1 建立範本

2.1.1 建立資料集

建立普通報表,建立資料集,SQL 語句如下:
ds1:SELECT * FROM 銷量 where 1=1 and 地區 in ('${area}') and 銷售員 in ('${stuff}')
ds2:SELECT 銷售員 FROM 銷量 where 地區 in ('${area}')

2.1.2 設計報表

報表主體樣式如下圖所示:

2.2 設定查詢元件

編輯參數面板,新增兩個「標簽元件」,兩個「下拉複選框元件」,一個「查詢元件」。如下圖所示:

2.2.1 地區元件

選中第一個「下拉複選框元件」,設定元件名稱為「area」,標簽章稱為「地區:」,資料字典設定為資料庫 FRDemo 中「銷量」表中的「地區」,傳回值型別為「字串」,分隔符為',',如下圖所示:

2.2.2 銷售員元件

選中第二個「下拉複選框元件」,設定元件名稱為「stuff」,標簽章稱為「銷售員:」,資料字典設定為資料集「ds2」中的「銷售員」,傳回值型別為「字串」,分隔符為',',如下圖所示:

2.3 設定匯出元件

2.3.1 新增元件

新增一個「按鈕元件」,點選「元件設定>屬性」,設定按鈕名稱為「大數據集匯出」,如下圖所示:

2.3.2 設定點選事件

選中「按鈕元件」,點選「元件設定>屬性」,新增「點選事件」,輸入 JavaScript 語句,如下圖所示:

JavaScript 代碼如下:

//API為directExportToExcel: function (dsName, fileName, params, colNames)
//注意參數中的特殊字元需要進行url編碼,比如大括號,冒號等。
var paramStr = encodeURIComponent("{area:\"華北','華東\",stuff:\"孫林','王偉\"}")
//資料集傳參
var colNames = encodeURIComponent("地區,銷售員,産品型別,産品,銷量")
//指定匯出的資料列,匯出欄位按此順序排列,為空預設匯出所有
_g().directExportToExcel("ds1", "銷量", paramStr, colNames, "excel", " ")

注1:這裏的參數名是指範本參數名,而不是資料集中的資料列名。
注2:在 SQL 參數值的前後需要加上 \ ,防止被決議。

2.4 效果預覽

儲存範本,點選「分頁預覽」。點選「大數據集匯出按鈕」,可以將「地區為華北、華東且銷售員為孫偉、王林」的 ds1 資料集匯出為 Excel 檔案。匯出內容與查詢內容無關,如下圖所示:

注:不支援行動端。

3. 範例二:大數據集匯出動態參數值

3.1 建立範本

2.1.1 建立資料集

建立普通報表,建立資料集,SQL 語句如下:
ds1:SELECT * FROM 銷量 where 1=1 and 地區 in ('${area}') and 銷售員 in ('${stuff}')
ds2:SELECT 銷售員 FROM 銷量 where 地區 in ('${area}')

3.1.2 設計報表

報表主體樣式如下圖所示:

3.2 設定查詢元件

編輯參數面板,新增兩個「標簽元件」,兩個「下拉複選框元件」,一個「查詢元件」。如下圖所示:


3.2.1 地區元件

選中第一個「下拉複選框元件」,設定元件名稱為「area」,標簽章稱為「地區:」,資料字典設定為資料庫 FRDemo 中「銷量」表中的「地區」,傳回值型別為「字串」,分隔符為',',如下圖所示:

3.2.2 銷售員元件

選中第二個「下拉複選框」元件,設定元件名稱為「stuff」,標簽章稱為「銷售員:」,資料字典設定為資料集 ds2 中的「銷售員」,傳回值型別為「字串」,分隔符為',',如下圖所示:


3.3 設定動態匯出列

新增一個「標簽元件」,一個「下拉複選框元件」。選中「下拉複選框元件」,點選「元件設定>屬性」,設定元件名稱為「col」,標簽章稱為「匯出列」,資料字典型別為「公式」,實際值為:TABLEDATAFIELDS("ds1"),如下圖所示:

3.4 設定匯出元件

3.4.1 新增元件

新增一個「按鈕元件」,點選「元件設定>屬性」,設定按鈕名稱為「大數據集匯出」,如下圖所示:

3.4.2 設定點選事件

選中「按鈕元件」,點選「元件設定>屬性」,新增「點選事件」,輸入 JavaScript 語句,如下圖所示:

JavaScript 代碼如下:

var widgetNames = ['area', 'stuff']; //定義陣列存放元件名稱

function getWidgetValueByName(name) {
var widget = _g().parameterEl.getWidgetByName(name); //根據元件名獲取元件值
if (widget == undefined) return;
var obj = {};
obj[name] = widget.getValue();
return obj; //傳回元件值組成的陣列
}
var paramJson = widgetNames.map(getWidgetValueByName).reduce(function(a, b) {
return Object.assign(a, b)
});

var paramJsonStr = JSON.stringify(paramJson); //將json資料轉換為字串
var col = _g().getParameterContainer().getWidgetByName("col").getValue();
//alert(col);
//參數進行url編碼
var colNames = encodeURIComponent(col)
//var colNames = encodeURIComponent("地區,銷售員,産品型別,産品,銷量") //指定匯出的資料列,匯出欄位按此順序排列,為空預設匯出所有
//呼叫匯出API
//console.log(paramJsonStr);
//console.log(colNames);
_g().directExportToExcel("ds1", "銷量", encodeURIComponent(paramJsonStr), colNames," "," ");

3.5 效果預覽

儲存範本,點選「分頁預覽」。查詢「地區」、「銷售員」,選擇需要匯出的資料列,點選「大數據集匯出按鈕」,匯出內容與查詢內容一緻,且僅匯出指定的資料列。如下圖所示:


注:不支援行動端。

4. 已完成範本

4.1 範例一

已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Parameter\大數據集匯出固定參數值.cpt
點選下載範本:大數據量匯出固定參數值.cpt

4.2 範例二

已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Parameter\大數據集匯出動態參數值.cpt
點選下載範本:大數據量匯出動態參數值.cpt

5. 注意事項

大數據集匯出時連結的是 Presto 資料庫,如果匯出失敗且有如下報錯資訊:
警告:14:39:00 EventThread ERROR [standard] com.facebook.presto.jdbc.NotImplementedException: Method Connection.prepareStatement is not yet implemented

只需要將驅動升級到 presto-jdbc-339.jar 即可,進入 Presto官網 ,下載驅動的方法如下圖所示:

附件列表


主題: 報表專題
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙