BOOS让用JasperReports做报表,只能老老实实请教度娘了,但是网上资源又多又乱,多是copy的,代码都不知道有没有验证过、、、
自己做了一遍,贴出来供大家学习.
首先要确定你的tomcat、JDK、iReport是配置好的,下面我们开始,我用的事Myeclipse开发网站
一个很常见的例子
一、定义bean
ProductBean.java
package test6;
public class ProductBean
{
private String productName;
public String getProductName()
{
return productName;
}
public void setProductName(String productName)
{
this.productName = productName;
}
}
二、在iReport中设定数据源及创建报表
1、首先把路径添加上去,就是你编译好的class文件的路径:iReport、工具--选项--路径(classpath)添加我的路径是最下面的那个,就是编译好的class文件路径
2、在工具栏找到ReportDataSources工具,添加数据源:点击新建、之后选择JavaBeans set datasource
选中之后会出现如下界面:
需要填写的包括Name、Factory class和static method,这个地方要注意,如果你已经编写好了数据制造工厂,就是说不基于网络来做,那么
你要填写Factory class这一栏,路径为:package.XXXXX,其中XXXX是你自己创建的工厂类的名字;同时在static method,,里面填写你创建的函数,即返回的list列表。
这种方式,下次有时间我再写出来,今天说基于网络的。
基于网络的那么就不用填写下面两项,只要把名字写一下好了,比如我的是
新建一个报表,一路next下去创建好之后,在界面上很容易找到添加数据的一个按钮:选择第二个选项,JavaBean Datasource
我新建的包是test6所以输入的classname就是test6.ProductBean
点击右边Read attributes就会出现一个class一个productName,当然,后面就是我们之前新建的一个属性,添加都会的吧
添加之后在我们的报表左边栏Fields里面看到了,将它拖入到编辑面板,要拖入到Details里面,这个我就不多说了,不懂看文档
之后是这样效果:
保存编译,之后找到你创建报表的路径,里面会有编译好的文件,我的文件名是repor_tservlet,所以生成两个
我们这次使用上面那个.jasper文件,当然下面的也是可以使用的,只是代码不同,如果又人需要留言好了,下面将report_servlet.jasper拷贝到你的服务器文件夹下,随便新建个文件夹就行
我新建了一个jasper文件夹,
下面编写我们的Servlet程序:BeanReportServlet.java
package test6;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;
public class BeanReportServlet extends HttpServlet
{
private static final long serialVersionUID = 348226870594216833L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try
{
//生成测试数据
ArrayList<ProductBean> data = new ArrayList<ProductBean>();
for(int i = 1; i <= 100; i++)
{
ProductBean bean = new ProductBean();
bean.setProductName("Product " + i);
data.add(bean);
}
JRDataSource dataSource = new JRBeanCollectionDataSource(data);
//获取报表模板文件
String root_path = this.getServletContext().getRealPath("/");
root_path = root_path.replaceAll("\\\\", "/");
String reportFilePath = root_path + "jasper/report_servlet.jasper";
System.out.println("jasper file is " + reportFilePath);
// File reportFile = new File(reportFilePath);
//生成JasperPrint
JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);
// JasperReport report = (JasperReport)JRLoader.loadObject(reportFile);
JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource);
//设定输出格式
OutputStream ouputStream = resp.getOutputStream();
resp.setContentType("application/pdf");
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode("PDF报表", "UTF-8") + ".pdf\"");
// 使用JRPdfExproter导出器导出pdf
JRPdfExporter exporter = new JRPdfExporter();
// 设置JasperPrintList
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
exporter.exportReport();
ouputStream.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
这个代码是我从其他网友那边拷贝来的,当然问题很多、不能用,我修改之后的这个应该是没问题的,至少在我的电脑环境下是可以用的。
新建之后要注意一些Jar包的引入,因为我也是初学,所以才用最笨的方法,就是将D:\Program Files\Jaspersoft\iReport-4.6.0\ireport\modules下面的所有的jar包全部放到WEB-INF的lib下面
这样肯定是没什么问题了,把一些必要的jar包引入你的代码
注意:
如果你是从其他地方拷贝来的代码,注意以下几点
root_path = root_path.replaceAll("\\\\", "/");
很多博客写的不规范,就是不能用,上面这种写法是正确的一种,给个参考:http://www.blogjava.net/hefang/articles/324456.html
JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);
这一行可能会报错,说loadObject什么已经过期,我郁闷了好久,最后是把所有的jar包拷贝到WEB-INF的lib下面解决的,具体还有待研究
String root_path = this.getServletContext().getRealPath("/");
root_path = root_path.replaceAll("\\\\", "/");
String reportFilePath = root_path + "jasper/report_servlet.jasper";
注意路径修改成你的路径
上面做好之后,记得在web.xml里面配置
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>report</servlet-name>
<servlet-class>test6.BeanReportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>report</servlet-name>
<url-pattern>/report</url-pattern>
</servlet-mapping>
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
基本上是没什么问题了吧,如果我还没有遗漏的话、、、
运行Tomcat在浏览器里面输入:http://localhost:8080/Jb_test6/report
report是在xml里面的映射名,不用解释吧
<img src="https://img-blog.csdn.net/20140829132926115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" height="452" width="666" alt="" />
看到最下面的提示了吧,那说明我们的运行成功了,点击打开
看到我们生成的100个产品了吧
<img src="https://img-blog.csdn.net/20140829133041104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
好的,GameOver如果有哪位还有问题可以留言,
需要原代码的也留言
第一次认真的写博客,蛋蛋的忧伤