`

JasperReport学习笔记4-查询数据库生成动态的报表(WEB)

阅读更多
分两种方法
第一种
1.模版
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="DBReport">
	<parameter name="hp" class="java.lang.Integer"></parameter>	
	<queryString>
		<![CDATA[
			select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs on(tb.id = tbs.tbid) where tb.id > $P{hp}
		]]>
	</queryString>
	<field name="marks" class="java.lang.Integer"></field>
	<field name="name" class="java.lang.String"></field>
	<field name="age" class="java.lang.Integer"></field>
	<pageHeader>
		<band height="30">
			<staticText>
				<reportElement x="0" y="0" width="69" height="24" />
				<text><![CDATA[marks:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="140" y="0" width="79" height="24" />
				<text><![CDATA[name:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="280" y="0" width="69" height="24" />
				<text><![CDATA[age:]]></text>
			</staticText>	
			
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[you don't see this]]></text>
			</staticText>		
		</band>
	</pageHeader>
	
	<detail>
		<band height="30">
			<textField>
				<reportElement x="0" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{marks}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="140" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					<![CDATA[$F{name}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="280" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{age}]]>
				</textFieldExpression>
			</textField>	
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[If you don't see this, it didn't work]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>

2.把上面的JRXML文件生成JASPER文件,方便在WEB里面的调用(可以用下面的方法先生成好,放到你知道的文件夹下面)
JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQL.xml","WebRoot\\report\\JasperReportSQL.jasper");

3.写Servlet调用
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

public class DynamicCreateReportWithServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Connection connection = null;
		//获得输出流
		ServletOutputStream servletOutputStream = response.getOutputStream();
		//获得JASPER文件的输入流,一定要知道你的文件的地方
		InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQL.jasper");
		//生成Map对象传数据
		HashMap hm =  new HashMap();
		hm.put("hp", new Integer(3));
		try {
			//连结JDBC
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");
			//生成相于的PDF输入流,这个JasperRunManager对象还有很多种方法的,这只是一种
			JasperRunManager.runReportToPdfStream(is,servletOutputStream,hm, connection);
			//设置格式
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (JRException e) {
			e.printStackTrace();
		}		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}


第二种方法
1.这种方法JRXML文件里面不用写SQL
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="DBReport">
	<field name="id" class="java.lang.Integer"></field>
	<field name="name" class="java.lang.String"></field>
	<field name="marks" class="java.lang.Integer"></field>
	
	<pageHeader>
		<band height="30">
			<staticText>
				<reportElement x="0" y="0" width="69" height="24" />
				<text><![CDATA[id:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="140" y="0" width="79" height="24" />
				<text><![CDATA[name:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="280" y="0" width="69" height="24" />
				<text><![CDATA[marks:]]></text>
			</staticText>	
			
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[you don't see this]]></text>
			</staticText>		
		</band>
	</pageHeader>
	
	<detail>
		<band height="30">
			<textField>
				<reportElement x="0" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{id}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="140" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					<![CDATA[$F{name}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="280" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{marks}]]>
				</textFieldExpression>
			</textField>	
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[If you don't see this, it didn't work]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>

2.同样是用下面的方法生成JASPER文件
	    	JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQLResult.xml","WebRoot\\report\\JasperReportSQLResult.jasper");


3.写出Servlet

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperRunManager;

public class DynamicCreateReportWithServletDateSource extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Connection connection = null;
		Statement statument = null;
		ResultSet resultSet = null;
		String sql = "select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs";
		ServletOutputStream servletOutputStream = response.getOutputStream();
		InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQLResult.jasper");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");
			statument = connection.createStatement();
			resultSet = statument.executeQuery(sql);
			//这里把ResultSet封装到JRResultSetDataSource对象里面了
			JasperRunManager.runReportToPdfStream(is,servletOutputStream,new HashMap(), new JRResultSetDataSource(resultSet));
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (JRException e) {
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}



注意:JRXML文件里面数据库的字段都是用$F{marks},而parameter是用$P{xxxx}表示的
,而parameter的值都是传过去的那个HashMap里面设置的
分享到:
评论

相关推荐

    Jasperreport+ireport学习笔记(1).rar

    JasperReport是一款开源的报告生成库,它允许开发者创建复杂的、可定制的打印和Web报表。JasperReport支持多种数据源,包括数据库连接、CSV文件、XML数据等,可以生成PDF、HTML、Excel、CSV等多种格式的报表。其强大...

    jasperreport笔记1

    而"Jasperreport+ireport学习笔记(1).pdf"很可能是作者个人学习JasperReports和IReport的心得体会,可能会包含实战操作步骤、常见问题解决方案以及一些个人技巧分享。 综合以上信息,JasperReports的学习内容可能...

    jasperreoprt+ireport学习笔记3

    《jasperreport+ireport学习笔记3》是关于企业级报表工具JasperReport与iReport深度结合使用的进阶教程。这两个工具在IT行业中被广泛应用于Web报表的开发,提供了强大的数据可视化和报告生成能力。 JasperReport是...

    jasperreoprt+ireport学习笔记4

    4. **报表填充**:使用JasperFillManager的fillReport方法,传入.jasperreport文件、数据源和参数,生成填充后的报表实例。 5. **报表渲染**:最后,将填充后的报表实例通过JasperExportManager的exportReportToXXX...

    JasperReport + IReport 开发文档

    2. **这几天在弄ireport.doc**:可能是个人的学习笔记,记录了作者使用IReport时的经验和技巧。 3. **JasperReport初级教程(2_0_3)图文详解_绝对原创 - 川江号子_cn - CSDN博客.mht**:针对JasperReport的基础教程,...

    ireport开发交叉报表资料及笔记

    【ireport开发交叉报表资料及笔记】 交叉报表(Crosstab)是数据分析中常用的一种工具,它可以将数据按行和列的方式进行交叉展示,便于用户更直观地理解数据间的关联和对比。Ireport是一款强大的开源报表设计工具,...

    IReport详细帮助文档附带案例web案例

    - **jasperreoprt+ireport学习笔记1.pdf**:分享了作者的学习经验和技巧,有助于提升报表设计能力。 通过以上知识点的学习和实践,你将能够充分利用IReport在MyEclipse中创建出美观且功能丰富的报表,为你的业务...

    JasperReports研究笔记

    报表查询语句(JasperReport Query Language,JRQL)是JasperReports特有的查询语言,它允许在报表设计阶段直接编写SQL查询。 4. **表达式和变量** 在报表设计中,表达式和变量是两个关键概念。表达式用于计算和...

Global site tag (gtag.js) - Google Analytics