JaperReport生成报表的例子

这个例子中我们依然是想生成上面用iReport生成的输出结果.

这里我们需要有一个Java工程,然后把.jrxml放在工程的某处目录中,然后在servlet中访问数据库Useraccount表获取所有成年用户的信息,保存在list中,求出成年用户的平均年龄,存放在map中,然后按照4.1节那样生成报表输出

[@more@]

这个例子中我们依然是想生成上面用iReport生成的输出结果.

这里我们需要有一个Java工程,然后把.jrxml放在工程的某处目录中,然后在servlet中访问数据库Useraccount表获取所有成年用户的信息,保存在list中,求出成年用户的平均年龄,存放在map中,然后按照4.1节那样生成报表输出

首先我们在iReport中打开上节中的myFirstReport.jrxml文件,然后把它另存为你的Java工程的某个目录中,这里我使用的是一个是名为StrutsTestTomcat工程,我把myFirstReport.jrxml保存在WEB-INF/src/pdf/xmls目录下。然后打开这个文件,点击,sql去掉,点击,创建userid,passwd,age三个field,去掉averAge这个value,创建一个averAgeparameter,至于动态文本的放置,除了把averAge动态文本元素的表达式改为$P{averAge},另外把这四个按纽的属性对话框TextField选项卡中的Blank when null中的勾选上,这样当某个动态文本没有获取到相应的值时,不会显示为null,而显示为空字符串

保存这个.jrxml文件。

然后,我们创建一个名为testmyFirstReport.jsp的网页,内容如下:

怎样获取年龄,做数据库查询,获得成年用户信息的list及存放其他非重复信息,如平均年龄的map,这是简单的根据jsp页面请求,我们就不用多说了,无论用户用什么架构封装这些功能都行,反正最后必须在session中或是request中保存有listmap,并且最后能发到我们创建PDF输出的GeneralPDFServlet中就行。下面是GeneralPDFServlet.java源代码:

package servlets;
import java.io.*;
import java.util.*:

import javax.servlet.*;
import javax.servlet.http.*:

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;

public class GeneratePDFServlet extends HttpServlet {

protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

public static final String XML_FILE_PATH ="E:/eclipse/workspace/StrutsTest/WEB-INF/src/pdf/xmls/";

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

//创建response输出流,设置responxe回应的头部
OutputStream out = res.getOutputStream();
res.setContentType("application/pdf");
res.setHeader("Content-Disposition","attachment; filename=myFirstReport.pdf"); //filename
为生成PDF的文件名

//从当前sessionrequest中获取.jrxml文件的文件名,存放成年用户信息的list,存放平均年龄的map

String fileName = (String) req.getAttribute("FileName");
List list = (List) req.getAttribute("List");
Map map = (Map) req.getAttribute("Map");

//调用createPdf()获得PDF输出的字节流并打印出来。
byte[] bytes = createPdf(fileName, list, map);
res.setContentLength(bytes.length);
out.write(bytes, 0, bytes.length);
out.flush();
}

protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGet(req, res);
}

//封装创建PDF输出的compilerun方法,返回最终生成的字节流

private byte[] createPdf(String fileName, List list, Map map) {
String path = XML_FILE_PATH + fileName;//.jrxml
文件的全路径
String jrFile = XML_FILE_PATH + "testXML.jasper";//
编译结果.jasper文件的全路径
byte[] bytes = null;
try{
JasperCompileManager.compileReportToFile(path, jrFile);
}catch (JRException e){
e.printStackTrace();
}
try{
bytes =JasperRunManager.runReportToPdf(jrFile, map, new JRBeanCollectionDataSource(list));
}catch (JRException e){
e.printStackTrace();
}
return bytes;
}

}

在这个servlet中,我们首先创建输出流和设置response回复的头部,然后再从请求或是会话中获取.jrxml文件的文件名,存放成年用户信息的list,存放平均年龄的map,这里我用的是struts架构,把测试页面的请求发给一个action,获得FileName,list,map并以request.setAttribute()方法来保存起来,然后转发到GeneratePDFServlet,所以上述goGet()方法中直接调用req.getAttribute()方法就可以获得这三个变量,如果是保存在session中,则doGet()中,必须调用req.getSession()方法获取session,然后再调用session.getAttribute()方法获取这三个变量,这是架构和封装上的问题,无论程序员怎么做都行,只要能在servlet中获取到这个变量即可。

这样我们就可以在网页中的文本框输入18,然后点击打印报表按纽后出现,文件打开可保存的对话框,点击打开就可以看到像上一章那样的输出结果,不过,不是JRview预览,而是一个名为myFirstReport.pdfPDF文件。

好了,关于iReportJasperReport整合做Java报表的话题就讨论到这儿了。由于本人系大三年级学生,上面只是暑假实习过程中为公司做了一些报表的一点经验之谈,是我花费一整天的时间写出来的,比较累,但也比较粗糙,不妥之处敬请大家指教,也欢迎编程爱好者和就iReportJasperReport及其他话题和我讨论

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7767849/viewspace-908381/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7767849/viewspace-908381/

你可能感兴趣的:(JaperReport生成报表的例子)