需求:多个皕杰报表展示信息导出到一个excel文件夹中。
解决方案:
在皕杰报表演示实例5.2提供了批量导出实例(BIOS Server\webapps\iface\report文件夹下的export.jsp和batchExport.jsp)
export.jsp:提供了3个皕杰报表访问信息、选择导出的excel版本和文件名称的实例。
export.jsp将导出的信息以规定的格式(rpts=Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997&filetype=xls&filename=myexcel)传递到batchExport.jsp中。
batchExport.jsp:获取export.jsp传递过来的信息并处理。
〈%
//rpts参数格式:a.brt|b.brt^params=p1=val1;p2=val2^vars=v1=val3;v2=val4
//示例:batchExport.jsp?rpts=Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997&filetype=xls&filename=myexcel
//这个地方的编码与tomcat的server.xml及report_config.xml中的一致
request.setCharacterEncoding("UTF-8");
//获取访问皕杰报表的url(http://localhost:8080/report/ReportEmitter)
String emitter = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/ReportEmitter";
//如果前端请求的url是经过javascript的encodeURIComponent函数编码的,获取rpts后应该再用java.net.URLDecoder.decode(rpts,"UTF-8")解码一次
String rpts = request.getParameter("rpts");//传递过来的报表信息
String fileName = request.getParameter("filename");//导出文件名
String fileType = request.getParameter("filetype");//导出格式(xls)
String sessionId = request.getSession().getId();
//将多个报表信息根据“|”拆分(Demo/分组报表/5分组汇总.brt|Demo/参数报表/时间参数.brt^params=year=1997)
String[] rptArr = rpts.split("\\|");
// 创建一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
for (int i = 0; i < rptArr.length; i++) {
//拆分报表信息里的报表路径和参数信息和变量信息
String[] rptPart = rptArr[i].split("\\^");
try {
//这个地方的编码与tomcat的server.xml及report_config.xml中的一致
String urlencode = java.net.URLEncoder.encode(rptPart[0],"UTF-8");
//遍历参数或变量数组并url转码
for(int j=1;j
if("vars".equals(rptPart[1].substring(0,4).toLowerCase())){
urlencode= urlencode+"&vars="+java.net.URLEncoder.encode(rptPart[j].substring(5),"UTF-8");
}else if("params".equals(rptPart[1].substring(0,6).toLowerCase())){
urlencode= urlencode+"¶ms="+java.net.URLEncoder.encode(rptPart[j].substring(7),"UTF-8");
}
}
//创建一个新的url(http://localhost:8080/report/ReportEmitter?rpt=Demo/参数报表/时间参数.brt¶ms=year=1997)
URL url = new URL(emitter + "?rpt=" + urlencode + "&emitter=toobj");
//此处的urlConnection对象实际上是根据URL的 请求协议(此处是http)生成的URLConnection类的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象
urlc = (HttpURLConnection) url.openConnection();
// 设定请求的方法为"POST",默认是GET
urlc.setRequestMethod("GET");
//设置这个url的cookie
urlc.setRequestProperty("Cookie", "JSESSIONID="+sessionId);
//设定传送的内容类型是流
urlc.setRequestProperty("Content-type", "application/octet-stream");
//获取url的生成的输入流
InputStream in = urlc.getInputStream();
//从已经保存的ReportBean数据输入流创建一个报表运算结果
ReportBean rptBean = new ReportBean(in);
//使用传入POI文档对象,生成Excel
rptBean.toExcel(wb);
//设置这个excel的sheet页的名称
wb.setSheetName(i, rptBean.getReportName());
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//输出excel流到页面
response.resetBuffer();
//设置excel名称
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1") + ".xls");
//设置excel从页面下载
response.setContentType("application/x-msdownload;charset=utf-8");
//创建输出流
ServletOutputStream outStream = response.getOutputStream();
//excel写入到输出流
wb.write(outStream);
outStream.flush();
outStream.close();
outStream = null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>
网友评论