9.1 设计报表模板
9.1.1 使用Table组件新建模板(步骤参考教程七)如下:
9.1.2 模板自带变量
$V{PAGE_NUMBER} :代表当前页数(可以是页码也可以是页数,通过TextField的计算时间的不同值来设置)
$V{PAGE_COUNT} :当前页面中记录的数目
$V{groupname_COUNT} : 代表当前组的记录数
$V{COLUMN_NUMBER} :列号码
$V{COLUMN_COUNT} :当前列中记录的数目(是当前页里行的序号,在新页上会重置为1)
$V{REPORT_COUNT} :当前文档中数据源记录数目。
这里主要使用 $V{PAGE_NUMBER} 来做报表分页
对于$V{PAGE_NUMBER}:当evaluationTime="Now"时,即是计算当页所在哪一页。 (now:即时执行此表达式)
当evaluationTime="Report"时,计算最后一页,即总页数。(Report:整个报表执行完后才执行此表达式)
9.1.3 拖动6个Text Field组件到Page Footer Band中
设置 第几页 ,注意 其 Evaluation Time 选中 Now。
设置 共几页 ,注意 其 Evaluation Time 选中 Report。
9.1.4 设置 首页、上一页、下一页、末页 需要使用超链接
新建一个模板,把 首页 拷贝过去(这里使用DemoReport1.jrxml)
点击首页显示Properties ,搜索HyperLink PageException
设置 链接 为 “https://www.baidu.com/”
保存后,以 HTML 方式 Preview 后,点击首页跳转到百度。
9.1.5 设置 首页、上一页、下一页、末页
在 Hyperlink PageExpression 框中输入时需要注意,我们需要设定变量才能正确的导向是哪一页
以下是各选择在HyperlinkPage Expression框中输入的信息
首页 : "/JasperWeb/JasperServlet9?page=0"
上一页 : "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}-Long.valueOf("1"))
下一页 : "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}+Long.valueOf("1"))
末页 : "/JasperWeb/JasperServlet9?page=lastPage"
保存模板文件后拷贝到JasperWeb项目中
9.2 编写java代码,实现分页逻辑及大量数据内存处理
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
Map<String,Object> parameters =
new HashMap<String,Object>(
16);
-
String pageStr = request.getParameter(
"page");
-
HttpSession session = request.getSession();
-
int pageIndex =
0;
-
int lastPageIndex =
0;
-
-
//list数据源
-
List<Users> list =
new ArrayList<Users>();
-
for(
int i =
1 ; i <=
50 ; i++) {
-
Users users =
new Users(i,
"name"+i,
"grade"+i,
"college"+i,
"mobile"+i);
-
list.
add(users);
-
}
-
ModelTableSource mts =
new ModelTableSource();
-
mts.setDate(
new SimpleDateFormat(
"yyyy-MM-dd").format(
new Date()));
-
mts.setTableData(
new JRBeanCollectionDataSource(list));
-
List<ModelTableSource> mlist =
new ArrayList<ModelTableSource>();
-
mlist.
add(mts);
-
-
String jrxmlPath = request.getServletContext().getRealPath(
"/")+
"/jrxml/DemoReport9.jrxml";
-
//由jrxml文件编译后生产jasper文件的路径
-
String jasperPath = request.getServletContext().getRealPath(
"/")+
"/jasper/DemoReport9.jasper";
-
PrintWriter
out =
null;
-
try {
-
-
//编译jrxml生产jasper文件
-
JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
-
-
//JasperPrint将数据全部取出,放到session中
-
JasperPrint jasperPrint = (JasperPrint) session.getAttribute(
"jasperPrint");
-
if(
null == jasperPrint) {
-
jasperPrint =
this.getJasperPrint(jasperPath, parameters, mlist);
-
session.setAttribute(
"jasperPrint", jasperPrint);
-
}
-
-
-
if(
null != jasperPrint.getPages()) {
-
lastPageIndex = jasperPrint.getPages().size() -
1;
-
}
-
if(
null == pageStr) {
-
pageStr =
"0";
-
}
-
try {
-
pageIndex = Integer.valueOf(pageStr);
-
if(pageIndex >
0) {
-
pageIndex = pageIndex
-1 ;
-
}
-
}
catch (Exception e) {
-
// 如果得到的非数字字符串
-
if(
"lastPage".
equals(pageStr)) {
-
pageIndex = lastPageIndex;
-
}
-
}
-
-
if (pageIndex <
0) {
-
pageIndex =
0;
-
}
-
if (pageIndex > lastPageIndex) {
-
pageIndex = lastPageIndex;
-
}
-
-
//将html输出到浏览器上
-
JRHtmlExporter exporter =
new JRHtmlExporter();
-
response.setCharacterEncoding(
"UTF-8");
-
out = response.getWriter();
-
//分页
-
exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);
-
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
-
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,
out);
-
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
-
exporter.exportReport();
-
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
out.flush();
-
out.close();
-
}
-
}
-
-
-
private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {
-
//解决大数据量保留在内存中,只在内存中保留两页,剩下的放入磁盘中
-
JRFileVirtualizer virtualizer =
new JRFileVirtualizer(
2,
"D:/data");
-
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
-
virtualizer.setReadOnly(
true);
-
-
return JasperFillManager.fillReport(jasperPath, parameters,
new JRBeanCollectionDataSource(list));
-
}
-
访问servlet,如下:
将第三页存储在磁盘中。
教程就先写到这,以后有知识点再加添补。本教程Demo源码提供,JasperWeb源码