导出报表数据时重定义文件名
在一个项目中要求导出的当前报表时重定义导出的文件名,我们都知道默认情况下,比如一个报表文件名是 STUDENT.rpx 导出为 excel 文件 (例如是 xlsx) 那么最终的文件就是 STUDENT.xlsx。现在要求对导出的文件名重新定义,例如这样的格式:M_yyyy_mm_dd.xlsx,文件名中的 yyyy_mm_dd 是用户选择参数模板中的日期。例如用户选择的日期是 2024-01-01,那么最终的文件名是 M_2024_01_01.xlsx。
我参考了这个帖子中介绍的方式修改了 showReport.jsp,并且在不设置参数模板的情况下 (因此不会存在 STUDENT_arg.rpx) 我从报表的 (1,1) 的位置取值作为导出后的文件名,确实可以达到重定义文件名的目的。本文的案例文件在文章末尾
但通常情况下报表是需要提供用户接口方便查询数据的,因此当我设置了参数模板之后,发现情况发生了变化,我已经把测试案例打包放在文章末尾,这个测试案例使用的是润乾自带的案例数据库
这个测试报表用来展示润乾案例数据库中的学生表基本信息,用户可以选择班级和日期,其实只是想把用户选择的日期作为报表文件名的一部分,在查询数据时日期并不是 SQL 中的条件,班级则是真正的条件。
STUDENT.rpx 设计界面:
A1 的值 =“M”+p_date,这个单元格的值将作为导出文件的文件名
参数设置:
数据集设置:
数据集参数:
参数模板 STUDENT_arg.rpx
设计界面:
D2 是一个下拉框,变量名:p_classname
G2 是一个日期框,变量名:p_date
完成之后把 STUDENT.rpx 和 STUDENT_arg.rpx 放在润乾报表 web\webapps\demo\WEB-INF\reportFiles\rpx 目录下,
因为我修改的是 showReport.jsp, 所以在浏览器中地址栏使用这个文件打开报表,完整的 URL:
http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=rpx/STUDENT.rpx
预览结果如下:
此时查看润乾的控制台可以看到 showReport.jsp 里面输出的调试信息:
然后直接导出文件,选择 excel
可以看到下载的文件名是 M.xlsx, 因为没有选择日期,所以 A1 中的只有固定值 M, 这个结果没有问题。
但是当我选择了日期,并且点击了【查询】按钮之后,可以看蓝色区域变成了 M2024-01-30
如果选择导出文件,那么文件名应该是 M2024-01-30.xlsx, 但是实际上是 STUDENT.xlsx
此时查看润乾控制台,发现没有调试信息输出。
showReport.jsp 的变化情况:
增加了引用
<%@ page import=“com.raqsoft.report.model.*”%>
<%@ page import=“com.raqsoft.report.util.,com.raqsoft.report.usermodel.”%>
<%@ page import=“com.raqsoft.report.view.*,com.raqsoft.report.usermodel.Engine”%>
<%@ page import=“com.raqsoft.report.view.excel.ExcelReport”%>
String reportPath = request.getRealPath("/WEB-INF/reportFiles/"+report);
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);
Context cxt = new Context(); //构建报表引擎计算环境
Engine engine = new Engine(rd, cxt); // 构造报表引擎
IReport iReport = engine.calc(); // 运算报表
String tab=iReport.getCell(1,1).getValue().toString();
System.out.println("tab========================="+tab);
在 66 行增加了
cxt.setParamValue(paramName,paramValue);
在 119 行增加了
saveAsName=“<%=tab%>”
在本文最后我把本次用的案例文件重新整理一下,在这里可以下载到 showReport.jsp 和报表源文件
showReportzip
demozip
自带的 showReport.jsp,点查询时调用的是 queryReport.jsp,所以应该在 queryReport.jsp 中增加相应的设置。
然后你现在用的是 api 计算报表获取 A1 的值,如果只是获取参数的话,在 queryReport 里应该不用计算报表,用 requert.getParameter(“P_date”),这样就能获取到那个日期,就没必要计算报表了,当然如果有其他设置需要计算报表的话,那按照你之前的写就行
谢谢大神给予指导,其实我在 STUDENT.rpx 的 A1 里面写的 "M"+p_date 只是一个模拟的表达式,实际情况下这个表达式更复杂有其他的常量和变量,因此不是单纯的从参数模板取参数,昨天测试了你的思路,修改了 queryReport.jsp 确实可以从参数模板直接得到参数,但是实际上我的文件名是多个参数加常量组成的,并且不同的报表名称不同使用的参数也不通,所以是想在报表上设置一个单元格然后把完整的文件名字符串 (不包含文件后缀) 在报表上计算好,然后在 JSP 里面取到这个值之后作为真正的文件名
根据大神的思路,在参数模板中设置了一个单元格用来计算出最终的文件名,
B2 位置的表达式是 =D1+“_”+year(G1)+“_”+month(G1)+“_”+day(G1),并且设置这个单元格的名称为 p_newname, 在 queryRepor.jsp 里面增加代码:
查询的时候,确实可以在润乾控制台看到提示信息
但是发现只有第一次打开报表时,B2 的值是正常的,如果我改变了日期,参数模板上的 B2 的值就不会在变化了
点查询后,参数模版不会重新参与计算,所以按照你这么做一直取的是第一次的。
看了下你这个参数模版的 B2 的值,有两种方式实现:
一:在 queryReport.jsp 里分别获取 D1 和 G1 的值,然后在 jsp 里通过 java 的函数取 G1 的年月日,然后和获取 D1 的值拼在一起,这些操作都是在 jsp 的 java 代码里做,java 有对应的方法处理日期数据,这个搜下就行。
二:如果还有更复杂的命名规则,那可以像你最开始那样,在结果报表里找个单元格,里边通过表达式拼值,然后在 queryReport 里通过 api 计算报表然后获取那个格子的值。
第二种方法有点费事了,所以如果只是你那几个参数值拼在一起的,用第一种方法比较简单点
您好,请问如果在 querReport.jsp 获取结果报表单元格值怎么写呢,因为查询条件一般传参就是编号的,文件名称希望可以是传参对应的中文名称呢