反饋已提交
網絡繁忙
大批量数据导出的时候,会对服务器、网络传输、数据库造成一定的压力。
为了防止这样的风险,FineReport 10.0 新增了「大数据集导出」的功能,可直接根据数据集结果进行导出。
「大数据集导出」是一种占用资源少且速度快的 Excel 导出方式,无需前台数据展示即可进行后台流式导出。
该功能主要是针对明细表,用户通过自定义 JavaScrpit 代码调用接口,实现跳过报表计算直接取数导出。实现原理如下:
1)使用 SXSSFWorkbook 流式行导出,速度快。
2)使用生产者消费者模式,一个线程用于取数,把数据行存在队列中,另一线程读取行导出。
大数据集导出接口:directExportToExcel: function (dsName, fileName, params, colNames)
id: '9527',
name:'Stephen'
}
列名称用逗号分割,不指定使用数据集所有字段
接口示例如下:
//接口为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)此功能只支持关系型数据库。且 SQL Server 数据库需要把游标设置为服务器游标。
2)Oracle 数据库,SQL 查询时默认返回的列名是大写,所以 JS 传入 colNames 参数时,列名大小写要与其保持一致。
3)此功能无法直接导出 date/datetime 型空值,需要在 JDBC 数据连接的 URL 后添加 zeroDateTimeBehavior=convertToNull 参数。
4)建议导出的数据量不超过「1000W 行 * 20 列」,数据量超大可能会导致仅导出部分数据。
5)导出的 Excel 是通过 SQL 语句直接从数据库中获取的数据,并非报表中的数据,因此报表中设置的数据格式等无法被导出。
6)此功能不支持移动端。
新建普通报表,新建数据集,SQL 语句如下:
ds1:SELECT * FROM 销量 where 1=1 and 地区 in ('${area}') and 销售员 in ('${stuff}')
ds2:SELECT 销售员 FROM 销量 where 地区 in ('${area}')
报表主体样式如下图所示:
编辑参数面板,新增两个「标签控件」,两个「下拉复选框控件」,一个「查询控件」。如下图所示:
选中第一个「下拉复选框控件」,设置控件名称为「area」,标签名称为「地区:」,数据字典设置为数据库 FRDemo 中「销量」表中的「地区」,返回值类型为「字符串」,分隔符为',',如下图所示:
选中第二个「下拉复选框控件」,设置控件名称为「stuff」,标签名称为「销售员:」,数据字典设置为数据集「ds2」中的「销售员」,返回值类型为「字符串」,分隔符为',',如下图所示:
新增一个「按钮控件」,点击控件设置>属性,设置按钮名字为「大数据集导出」,如下图所示:
选中「按钮控件」,点击控件设置>事件,新增「点击事件」,输入 JavaScript 语句,如下图所示:
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 参数值的前后需要加上 \ ,防止被解析。
保存模板,点击「分页预览」。点击「大数据集导出按钮」,可以将「地区为华北、华东且销售员为孙伟、王林」的 ds1 数据集导出为 Excel 文件。导出内容与查询内容无关,如下图所示:
注:不支持移动端。
选中第二个「下拉复选框控件」,设置控件名称为「」,标签名称为「销售员:」,数据字典设置为数据集 ds2 中的「销售员」,返回值类型为「字符串」,分隔符为',',如下图所示:
新增一个「标签控件」,一个「下拉复选框控件」。选中「下拉复选框控件」,点击控件设置>属性,设置控件名称为「col」,标签名称为「导出列」,数据字典类型为「公式」,实际值为TABLEDATAFIELDS("ds1"),如下图所示:
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; //返回控件值组成的数组}//将参数拼接起来,若新增参数,直接 widgetNames中此增加控件名即可,此处无需修改。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)
保存模板,点击「分页预览」。查询「地区」、「销售员」,选择需要导出的数据列,点击「大数据集导出按钮」,导出内容与查询内容一致,且仅导出指定的数据列。如下图所示:
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Parameter\大数据集导出固定参数值.cpt
点击下载模板:大数据量导出固定参数值.cpt
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Parameter\大数据集导出动态参数值.cpt
点击下载模板:大数据量导出动态参数值.cpt
大数据集导出时连接的是 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後關閉