开发者使用JasperReport——不同数据源之XML和CSV数据源

前言

    上一篇我们讲解了实体对象数据源,一个很实用的功能。但是有时候我们会用这样的需求,有一个xml或者cvs文件,我们需要将它展现成报表形式,这个实现很简单,今天就来讲解JRXmlDataSource

 

正题

跟之前的一样,我们要生成报表需要以下几个步骤:

1.引入jar包,请看静态文本报表》 。


2.新建报表模版:

为了能够让我们的报表顺利的生成,我们需要对报表模版做一个小更改,在字段标签里面添加<fieldDescription>标签。

 

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
		name="AircraftReportWithDescription">
		
	<field name="ID" class="java.lang.String" >
		<fieldDescription>
			<![CDATA[ID]]>
		</fieldDescription>
	</field>
	<field name="NAME" class="java.lang.String">
		<fieldDescription>
			<![CDATA[NAME]]>
		</fieldDescription>
	</field>
	<field name="SEX" class="java.lang.String" >
		<fieldDescription>
			<![CDATA[SEX]]>
		</fieldDescription>
	</field>
	
	<pageHeader>
		<band height="30">
			<staticText>
				<reportElement x="0" y="0" width="69" height="24" />
				<textElement verticalAlignment="Bottom"/>
				<text>Id</text>
			</staticText>
			<staticText>
				<reportElement x="140" y="0" width="79" height="24" />
				<text>Name</text>
			</staticText>
			<staticText>
				<reportElement x="280" y="0" width="69" height="24" />
				<text>Sex</text>
			</staticText>
		</band>
	</pageHeader>
	
	<detail>
		<band height="40">
			<textField>
				<reportElement x="0" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					$F{ID}
				</textFieldExpression>
			</textField>			
			<textField>
				<reportElement x="140" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					$F{NAME}
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="280" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					$F{SEX}
				</textFieldExpression>
			</textField>
		</band>
	</detail>
</jasperReport>


 

 

 

3.编译报表模版,请看《静态文本报表


4.编写xmlcsv文件:

对于xml文件我们没有限制,只要是符合xml标签格式要求的即可。

 

1)我们新建一个AircraftData.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<AircraftData>
	<aircraft>
		<ID>1</ID>
		<NAME>REBECCA1</NAME>
		<SEX>FEMALE</SEX>
	</aircraft>
	
	<aircraft>
		<ID>2</ID>
		<NAME>REBECCA2</NAME>
		<SEX>FEMALE</SEX>
	</aircraft>
	
	
	<aircraft>
		<ID>3</ID>
		<NAME>REBECCA3</NAME>
		<SEX>FEMALE</SEX>
	</aircraft>
	
	
	<aircraft>
		<ID>4</ID>
		<NAME>REBECCA4</NAME>
		<SEX>FEMALE</SEX>
	</aircraft>
</AircraftData>


 


2)再来建一个AircraftCsv.csv文件

 

ID,NAME,SEX
1,Rebecca1,female
2,Rebecca2,female
3,Rebecca3,female
4,Rebecca4,female
5,Rebecca5,female
6,Rebecca6,female
7,Rebecca7,female
8,Rebecca8,female


 

 

5.编写servlet:

1)读取xml文件的XmlDSReportServlet

 

package com.dan.servlet;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
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.JasperRunManager;
import net.sf.jasperreports.engine.data.JRXmlDataSource;

/**
 * 使用JRXmlDataSource 填充
 * @author zdd
 *
 */
public class XmlDSReportServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2174316885912562306L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		 
		ServletOutputStream servletOutputStream = resp.getOutputStream();
		
		InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftReportWithDescription.jasper");
		
 		
		try{
			JRXmlDataSource xmlDataSource = new JRXmlDataSource(new BufferedInputStream(getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftData.xml")),"/AircraftData/aircraft");
			JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(),xmlDataSource);
			
			servletOutputStream.flush();
			servletOutputStream.close();
		}catch(Exception e){
			StringWriter stringWriter = new StringWriter();
			PrintWriter printWriter = new PrintWriter(stringWriter);
			e.printStackTrace(printWriter);
			resp.setContentType("text/plain");
			resp.getOutputStream().print(stringWriter.toString());
		}
	}

}


 

 

2)读取csv文件的CsvDSReportServlet

 

package com.dan.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
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.JasperRunManager;
import net.sf.jasperreports.engine.data.JRCsvDataSource;

/**
 * 使用JRResultSetDataSource填充
 * @author zdd
 *
 */
public class CsvDSReportServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2174316885912562306L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		 
		ServletOutputStream servletOutputStream = resp.getOutputStream();
		
		InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftReportWithDescription.jasper");
		
 		
		try{
			JRCsvDataSource jRCsvDataSource = new JRCsvDataSource(new InputStreamReader(getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftCsv.csv")));
			jRCsvDataSource.setUseFirstRowAsHeader(true);
			JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(),jRCsvDataSource);
			
			resp.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
		}catch(Exception e){
			StringWriter stringWriter = new StringWriter();
			PrintWriter printWriter = new PrintWriter(stringWriter);
			e.printStackTrace(printWriter);
			resp.setContentType("text/plain");
			resp.getOutputStream().print(stringWriter.toString());
		}
	}

}


 

 

5.配置web.xml,就是配置servlet

 

6.运行项目

看一下我的运行结果:

1)读取xml文件:



2)读取csv文件:



小结:

    xmlcsv文件是我们经常见到的两种数据文件格式,JasperReport将其单独拿出来也说明了这点,其他形式的数据源还会继续给大家进行更新。

 

 

posted @ 2013-04-24 21:22  javawebsoa  Views(497)  Comments(0Edit  收藏  举报