历史版本17 :JS实现大数据集导出 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

  报表服务器版本JAR 包
10.02018-12-27

1.2 应用场景

大批量数据导出的时候,会对服务器、网络传输、数据库造成一定的压力。

为了防止这样的风险,FineReport 10.0 新增了「大数据集导出」的功能,可直接根据数据集结果进行导出。

1.3 功能描述

「大数据集导出」是一种占用资源少且速度快的 Excel 导出方式,无需前台数据展示即可进行后台流式导出。

该功能主要是针对明细表,用户通过自定义 JavaScrpit 代码调用接口,实现跳过报表计算直接取数导出。实现原理如下:

1)使用 SXSSFWorkbook 流式行导出,速度快。

2)使用生产者消费者模式,一个线程用于取数,把数据行存在队列中,另一线程读取行导出。

1.4 接口简介

大数据集导出接口:directExportToExcel: function (dsName, fileName, params, colNames)

Key  Value  举例  
sessionID具体 sessionID-
dsName数据集名称ds1
params数据集参数 JSON,参数名:参数值{

id: '9527',

name:'Stephen'

}

columns

列名称用逗号分割,不指定使用数据集所有字段

col1,col2,...
fileName导出文件名称,不指定使用默认的「模板名-数据集名称.xlsx」

接口示例如下:

//接口为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)

1.5 注意事项

1)此功能只支持关系型数据库。且 SQL Server 数据库需要把游标设置为服务器游标。

2)MySQL 数据库,不能在 where 子句中使用列别名,否则无法成功导出。

3)大数据集导出无法导出 date/datetime 型空值。

4)建议导出的数据量不超过「1000W 行 * 20 列」,数据量超大可能会导致仅导出部分数据。

5)导出的 Excel 是通过 SQL 语句直接从数据库中获取的数据,并非报表中的数据,因此报表中设置的数据格式等无法被导出。

6)此功能不支持移动端。

2. 示例一:大数据集导出固定参数值编辑

2.1 新建模板

2.1.1 新建数据集

新建普通报表,新建数据集,如下图所示:

ds1:SELECT * FROM 销量 where 1=1 and 地区 in ('${area}') and 销售员 in ('${stuff}')

ds2:SELECT 销售员 FROM 销量 where 地区 in ('${area}')

2020-05-18_17-05-56.png

2.1.2 设计报表

报表主体样式如下表所示:

image.png

2.2 设置查询控件

编辑参数面板,新增两个标签控件,两个下拉复选框控件,一个查询控件。如下图所示:

image.png

2.2.1 地区控件

选中第一个下拉复选框控件,设置控件名称为area,标签名称为地区:,数据字典设置为销量表中的地区,返回值类型为字符串,分隔符为',',如下图所示:

2020-05-18_18-46-47.png

2.2.2 销售员控件

选中第二个下拉复选框控件,设置控件名称为stuff,标签名称为销售员:,数据字典设置为数据集 ds2中的销售员,返回值类型为字符串,分隔符为',',如下图所示:

image.png

2.3 设置导出控件

2.3.1 新增控件

新增一个按钮控件,点击控件设置>属性,设置按钮名字为大数据集导出,如下图所示:

image.png

2.3.2 设置点击事件

选中按钮控件,点击控件设置>事件,新增点击事件,输入 JavaScript 语句,如下图所示:

2020-05-18_19-12-59.png

JavaScript 代码如下:

//接口为directExportToExcel: function (dsName, fileName, params, colNames)
//注意参数中的特殊字符需要进行url编码,比如大括号,冒号等
var paramStr = encodeURIComponent("{area:\"华北','华东\",stuff:\"孙林','王伟\"}")
//数据集传参,字符串参数建议写成格式\"text\",参数多值写法为\"text1','text2\"
var colNames = encodeURIComponent("地区,销售员,产品类型,产品,销量")
//指定导出的数据列,导出字段按此顺序排列,为空默认导出所有
_g().directExportToExcel("ds1", "销量", paramStr, colNames)

注1:这里的参数名是指模板参数名,而不是数据集中的数据列名。

注2:在 SQL 参数值的前后需要加上 \ ,防止被解析。

2.4 效果预览

保存模板,点击分页预览

点击大数据集导出按钮,可以将「地区华北、华东销售员孙伟、王林」的 ds1 数据集导出为 Excel 文件。导出内容与查询内容无关,如下图所示:

image.png

注:不支持移动端。

3. 示例二:大数据集导出动态参数值编辑

3.1 新建模板

2.1.1 新建数据集

新建普通报表,新建数据集,如下图所示:

ds1:SELECT * FROM 销量 where 1=1 and 地区 in ('${area}') and 销售员 in ('${stuff}')

ds2:SELECT 销售员 FROM 销量 where 地区 in ('${area}')

2020-05-18_17-05-56.png

3.1.2 设计报表

报表主体样式如下表所示:

image.png

3.2 设置查询控件

编辑参数面板,新增两个标签控件,两个下拉复选框控件,一个查询控件。如下图所示:

image.png

3.2.1 地区控件

选中第一个下拉复选框控件,设置控件名称为area,标签名称为地区:,数据字典设置为销量表中的地区,返回值类型为字符串,分隔符为',',如下图所示:

2020-05-18_18-46-47.png

3.2.2 销售员控件

选中第二个下拉复选框控件,设置控件名称为stuff,标签名称为销售员:,数据字典设置为数据集 ds2中的销售员,返回值类型为字符串,分隔符为',',如下图所示:

image.png

3.3 设置动态导出列

新增一个标签控件,一个下拉复选框控件

选中下拉复选框控件,点击控件设置>属性,设置控件名称为col,标签名称为导出列,数据字典类型为公式,实际值为TABLEDATAFIELDS("ds1"),如下图所示:

2020-05-18_19-30-48.png

3.4 设置导出控件

3.4.1 新增控件

新增一个按钮控件,点击控件设置>属性,设置按钮名字为大数据集导出,如下图所示:

image.png

3.4.2 设置点击事件

选中按钮控件,点击控件设置>事件,新增点击事件,输入 JavaScript 语句,如下图所示:

2020-05-18_19-38-15.png

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 = this.options.form.getWidgetByName("col").getValue();
//alert(col);
//参数进行URL编码
var colNames = encodeURIComponent(col)
//var colNames = encodeURIComponent("地区,销售员,产品类型,产品,销量")
//指定导出的数据列,导出字段按此顺序排列,为空默认导出所有
//调用导出接口
//console.log(paramJsonStr);
//console.log(colNames);
_g().directExportToExcel("ds1", "销量", encodeURIComponent(paramJsonStr), colNames)

3.5 效果预览

保存模板,点击分页预览

查询地区销售员,选择需要导出的数据列,点击大数据集导出按钮,导出内容与查询内容一致,且仅导出指定的数据列。如下图所示:

2020-05-18_19-48-34.png

注:不支持移动端。

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

1596433975663825.png

只需要将驱动升级到 presto-jdbc-339.jar 即可,进入 Presto官网 ,下载驱动的方法如下图所示:

1596434342154400.png