报表如何批量导出成 excel 文件
需求说明
报表展现后可以通过工具栏中的导出按钮将当前展现的报表导出成 excel 文件,但是在实际使用中通常会要求报表不需要展现,直接通过一些操作将报表导出成 excel 文件,并且往往会要求批量导出成 excel 文件,下面通过几个示例介绍下报表不展现,如何批量生成 excel 文件。
实现这种需求一般要用到 api 方式,批量生成 excel 文件,按照方式上来分大体上可以分为三类:
一:单表导出单 excel 多 sheet
二:多表导出单 excel 多 sheet
三:多表导出多 excel 文件
单表多 sheet
此种方式通常是报表格式固定,然后根据某个参数对数据过滤,导出 excel 时需要导出多个参数的数据,并且每个参数的数据放到同一个 excel 的不同 sheet 里,比如本例中按照地区统计订单信息,要求导出时每个地区数据导出到一个 sheet 中,地区名称做为 sheet 名,下面看下这种做法:
报表设计界面不必多说,按照需求设计就行,如下图:

报表中增加一个参数:area,用于接收地区参数,然后在数据集中通过这个参数过滤数据就行。
Api 中用到 jsp 代码如下:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="com.raqsoft.report.model.*"%>
<%@ page import="com.raqsoft.report.usermodel.*"%>
<%@ page import="com.raqsoft.report.view.*"%>
<%@ page import="com.raqsoft.report.util.*"%>
<%@ page import="com.raqsoft.report.view.excel.ExcelReport"%>
<%
String report = request.getParameter( "report" );//获取报表名称
if(report==null) report="订单.rpx";//如果url上报表名为空,则取订单表
String fileName=report.substring(0,report.length()-4);//读取文件名,用于设置excel名称
String reportName = request.getRealPath("WEB-INF\\\reportFiles\\\"+report);//
String exportPath=request.getRealPath("/export");//在应用根目录下建export目录,放置导出文件
ReportDefine rd = (ReportDefine)ReportUtils.read(reportName);//读取报表
String areas="华北,东北,西北,华南,西南";//此例按照地区循环,实际中可以接收其他参数,也可以从数据库中获取数据
String\[\] area=areas.split(",");
ExcelReport er=new ExcelReport();
for(int i=0;i<area.length;i++){//按照地区做循环
Context cxt = new Context();
cxt.setParamValue("area",area\[i\]);//area是报表中定义参数,此处设置参数值
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc(); //运算报表
er.export(area\[i\],iReport);//将报表结果设置到excel sheet里
}
er.saveTo(exportPath+"/"+fileName+".xls");//生成excel
%>
这样,就会在应用根目录的 export 目录下生成对应的 excel 文件,生成 excel 文件如下:

多表多 sheet
此种情况应用于导出的 excel 由多个报表组成,然后每个报表导出到 excel 中不同 sheet 中,并且有可能每个报表的参数不同(如果参数相同,那么和示例一类似,只是按报表名称循环就行),下面看下具体实现过程:
由于不同报表参数可能会不同,所以在 api 中解析每个报表以及对应参数难度会比较大,此例要求通过 url 访问报表时,按照特定格式访问,比如:
http://localhost:6868/demo/reportJsp/exportExcel1.jsp?report={无参数报表名 1}{无参数报表名 2}{报表 1( 参数 1=value1; 参数 2=value2;…)}{报表 2( 参数 1=value1; 参数 2=value2;…)},比如:http://localhost:6868/demo/reportJsp/exportExcel1.jsp?report={test1.rpx}{test2.rpx(arg1=11;arg2=22;arg3=33)}这种方式,现在在高版本的 tomcat 中,会有一些特殊符号的限定,使用时可以将 {} 转换成对应的 urlencode 方式,{为 %7B,}为 %7B,如果有其他值的话,做对应转换就行,url 设置完成后,接下来就看下如何解析这个 url,并且批量生成 excel,代码如下:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="com.raqsoft.report.model.*"%>
<%@ page import="com.raqsoft.report.usermodel.*"%>
<%@ page import="com.raqsoft.report.view.*"%>
<%@ page import="com.raqsoft.report.util.*"%>
<%@ page import="com.raqsoft.report.view.excel.ExcelReport"%>
<%
//此JSP参数格式为:report={无参数报表名1}{无参数报表名2}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}
request.setCharacterEncoding( "UTF-8" );
String report = request.getParameter( "report" );
if( report == null || report.trim().length() == 0 ) throw new Exception( "请输入报表文件名及参数串report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..." );
String exportPath=request.getRealPath("/export");//在应用根目录下建export目录,放置导出文件
String report1=report.replace("}","");//去掉串中的}
String report2=report1.substring(1,report1.length());//去掉串中的最左侧的{
String\[\] a=report2.split("\\\{");//此时串中多个报表之间用{分隔,所以此处按照该符号split生成数组
ExcelReport er=new ExcelReport();
for(int i=0;i<a.length;i++){//按数组进行循环,也就是按报表循环
if(a\[i\].lastIndexOf("(")<=0)//判断分割后的子串中是否包含(,如包含,代表有参数,不包含,则没有参数
{
String reportPath = request.getRealPath("WEB-INF\\\reportFiles\\\"+a\[i\]);//获取报表路径
String sheetName=a\[i\].substring(0,a\[i\].length()-4);//获取sheet名称
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);//读取报表
Context cxt = new Context();
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc(); //计算报表
er.export(sheetName,iReport);//将报表结果放入sheet
}
else{
System.out.println("报表有参数,报表名为="+a\[i\].split("\\\(")\[0\]);//如果有参数,则按(字符split,左侧为报表名
String reportPath = request.getRealPath("WEB-INF\\\reportFiles\\\"+a\[i\].split("\\\(")\[0\]);
String sheetName=a\[i\].split("\\\(")\[0\].substring(0,a\[i\].split("\\\(")\[0\].length()-4);
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);
Context cxt = new Context();
String\[\] cs=a\[i\].split("\\\(")\[1\].replace(")","").split(";");//右侧为参数串,并且去掉参数串的),多个参数用;隔开,所以此处按照;split
for(int j=0;j<cs.length;j++){//按参数循环
cxt.setParamValue(cs\[j\].split("=")\[0\],cs\[j\].split("=")\[1\]);//设置参数
}
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc();
er.export(sheetName,iReport);
}
}
er.saveTo(exportPath+"/test.xls");//生成excel
%>
多表多 excel
此种方式和示例二类似,在实际使用中导出 excel 时要求每个报表导出成不同的 excel 文件,但是后续可能会涉及到下载问题,所以此种方式一般是要建立个临时目录,然后将多个 excel 放到临时目录内,可以进行打包下载。具体代码如下:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="com.raqsoft.report.model.*"%>
<%@ page import="com.raqsoft.report.usermodel.*"%>
<%@ page import="com.raqsoft.report.view.*"%>
<%@ page import="com.raqsoft.report.util.*"%>
<%@ page import="com.raqsoft.report.view.excel.ExcelReport"%>
<%
//此JSP参数格式为:report={无参数报表名1}{无参数报表名2}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}
request.setCharacterEncoding( "UTF-8" );
String report = request.getParameter( "report" );
if( report == null || report.trim().length() == 0 ) throw new Exception( "请输入报表文件名及参数串report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..." );
String exportPath=request.getRealPath("/export");//在应用根目录下建export目录,放置导出文件
String fileName=Double.toString(Math.random()*100000000).toString().substring(0,6);
String excelPath=exportPath+"\\\"+fileName;
java.io.File file = new java.io.File(excelPath);
if(!file.exists()) {
file.mkdirs();
} else {
}
String report1=report.replace("}","");//去掉串中的}
String report2=report1.substring(1,report1.length());//去掉串中的最左侧的{
String\[\] a=report2.split("\\\{");//此时串中多个报表之间用{分隔,所以此处按照该符号split生成数组
ExcelReport er=new ExcelReport();
for(int i=0;i<a.length;i++){//按数组进行循环,也就是按报表循环
if(a\[i\].lastIndexOf("(")<=0)//判断分割后的子串中是否包含(,如包含,代表有参数,不包含,则没有参数
{
String reportPath = request.getRealPath("WEB-INF\\\reportFiles\\\"+a\[i\]);//获取报表路径
String sheetName=a\[i\].substring(0,a\[i\].length()-4);//获取sheet名称
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);//读取报表
Context cxt = new Context();
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc(); //计算报表
ReportUtils.exportToExcel2007(excelPath+"/"+sheetName+".xlsx",iReport,false);
er.export(sheetName,iReport);//将报表结果放入sheet
}
else{
System.out.println("报表有参数,报表名为="+a\[i\].split("\\\(")\[0\]);//如果有参数,则按(字符split,左侧为报表名
String reportPath = request.getRealPath("WEB-INF\\\reportFiles\\\"+a\[i\].split("\\\(")\[0\]);
String sheetName=a\[i\].split("\\\(")\[0\].substring(0,a\[i\].split("\\\(")\[0\].length()-4);
ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);
Context cxt = new Context();
String\[\] cs=a\[i\].split("\\\(")\[1\].replace(")","").split(";");//右侧为参数串,并且去掉参数串的),多个参数用;隔开,所以此处按照;split
for(int j=0;j<cs.length;j++){//按参数循环
cxt.setParamValue(cs\[j\].split("=")\[0\],cs\[j\].split("=")\[1\]);//设置参数
}
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc();
ReportUtils.exportToExcel2007(excelPath+"/"+sheetName+".xlsx",iReport,false);
}
}
er.saveTo(exportPath+"/test.xls");//生成excel
%>
总结
本文中介绍了如何通过 api 将报表批量导出成 excel 的方法,实际中也有可能生成 pdf 或者 txt 等,思路是一样到,到时候换用不同的 api 就行。
更多打印导出类问题请看:打印导出分类导航
* web 如何实现精准打印
* 银行存折套打续打功能 – 报表如何记录上次打印的位置
* 如何实现报表直接打印需求
* 如何实现报表的批量打印需求
* echarts 统计图如何实现打印导出
报表如何批量导出成 excel 文件的更多相关文章
- Pl/sql 如何将oracle的表数据导出成excel文件?
oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件-- ; 结果视图 2)在查询结果的空白处,右键选择Copy to Excel 3) 查看导出e ...
- SSIS 中将csv 文件批量导出到excel 文件,并设置excel 文件中某些列的data column format 为Text
csv 文件是文本文件类型,但是打开csv 文件后(默认使用本地已经安装的excel 来打开excel 文件),默认显示出来的是general 类型(column data format)的数据, 这 ...
- mysql中数据导出成excel文件语句
代码如下 复制代码 mysql>select * from xi_table into outfile ’d:test.xls’; 导出为txt文件: 代码如下 复制代码 select * f ...
- MySQL要导出成excel的方法
MySQL 要导出成 excel 文件很简单,执行类似这样的命令: select * from 某个表 into outfile 'd:/文件名.xls'; 上述命令你在服务器上执行,就导在 ...
- GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏
GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏 GridView 导出成Excel文件,这个代码在网上比较多.但是发现存在一个问题,导出的数据中如果有&q ...
- 使用宏批量将多个csv文件转成excel文件
在一个压缩文件中有100多个csv文件,要求要将此100多个csv文件转成excel文件,名字命名不变,有三种方式: 1. 傻不拉几的复制粘贴法 2. 一个一个打开csv文件,另存为xls文件,工作量 ...
- php将数据库导出成excel的方法
<?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...
- Qt中将QTableView中的数据导出为Excel文件
如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...
- 网站开发进阶(三十一)js如何将html表格导出为excel文件(后记)
js如何将html表格导出为excel文件(后记) 前言 项目前期做了个导出Excel表格的功能,但是经过测试发现只有在IE上才可以正确实现,在Chrome等浏览器中无法实现导出效果.经过上网搜索,尝 ...
- 网站开发进阶(二十五)js如何将html表格导出为excel文件
js如何将html表格导出为excel文件 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! jsp页面数据导出成excel的方法很 ...
随机推荐
- 关闭mysql上锁的表/数据
一.输入查询语句,查看是否有数据被上锁 select * from information_schema.innodb_trx; 取 trx_mysql_thread_id 字段值 kill < ...
- C++ //谓词 //一元谓词 //概念:返回bool类型的仿函数称为 谓词 //如果 operator()接受一个参数,那么叫做一元谓词 //如果 operator()接受 2 个参数,那么叫做一元谓词
1 //谓词 2 //一元谓词 3 //概念:返回bool类型的仿函数称为 谓词 4 //如果 operator()接受一个参数,那么叫做一元谓词 5 //如果 operator()接受 2 个参数, ...
- spring重点后置处理器
1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definitio ...
- vscode 格式化 vue 和 js代码 vetur prettier beautify
这个文档 不涉及eslint 只专注自动格式化 格式化个性化需求: js中 自动去分号 js中 双引号变单引号 最大空换行数 是2 vue template中 属性自动折行 vue 的自动格式化 需要 ...
- 阿里云Python UDP Server和client基础教程
壹: socket通信是常用的一种通信方式,熟练掌握,快速的入戏,是一个程序员必备的素质. 贰: 注意:udp和tcp的套接字: 服务端代码: #!/usr/bin/env python3 # -*- ...
- 基于python的固定间隔时间执行实例解析
一 概念 datetime的用法如下: import datetime. # 打印当前时间 time1 = datetime.datetime.now() print(time1) # 打印按指定格式 ...
- Java的Class类,注解与反射
Class对象: 我们每创建一个类,经过build都会生成对应的.class文件 该类无法只能由虚拟机创建对象,其构造函数为private 当我们创建某个类的对象,ClassLoader(一个类)就会 ...
- tomcat中虚拟主机以及web应用程序的配置
一:新建虚拟主机 1. 在tomcat里新建文件夹myapps,在里面添加ROOT文件,放入网站的首页文件 新建文本文档,输入你想要的内容我这里的内容是TOM.AI,把文本文档的名字改成index.h ...
- 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.安全特性 在上篇文章中,我们了解到HTTP在通信过程中,存在以下问题: 通信使用明文(不加密),内容可能被窃听 不验证通信方的身份,因 ...
- vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道 ...