iReport制作报表2:Java结合模板生成报表

上一篇博文中lz介绍了报表模板的制作,但在实际的应用中,还是要通过代码来生成报表。接下来lz就来描述Java结合模板生成报表的过程。

而在本文中,lz会使用另一种数据源JavaBean。因为如果使用JDBC数据源,在代码中需要传入JDBC的数据库连接对象Connection,该对象的生命周期需要自己维护。而且项目中一般都在使用Hibernate或者Mybatis这种数据库框架,无法复用其中的连接对象。但是,lz使用JavaBean来作为数据源的话,就可以利用框架查询出的数据来显示报表,这样更加灵活。

1.修改数据源

lz先来将上文中报表模板的数据源改为JavaBean。

jasper1

点击下一步,给数据源起个名字就可以了,其他的不用修改。

然后lz来建立作为数据源的JavaBean:

public class Campaign {
	private String campaignname;
	private String date;
	private BigDecimal impression;
	private BigDecimal clicks;
	private BigDecimal clickrate;
	private BigDecimal cost;
	private BigDecimal clickprice;
	public String getCampaignname() {
		return campaignname;
	}
	public void setCampaignname(String campaignname) {
		this.campaignname = campaignname;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public BigDecimal getImpression() {
		return impression;
	}
	public void setImpression(BigDecimal impression) {
		this.impression = impression;
	}
	public BigDecimal getClicks() {
		return clicks;
	}
	public void setClicks(BigDecimal clicks) {
		this.clicks = clicks;
	}
	public BigDecimal getClickrate() {
		return clickrate;
	}
	public void setClickrate(BigDecimal clickrate) {
		this.clickrate = clickrate;
	}
	public BigDecimal getCost() {
		return cost;
	}
	public void setCost(BigDecimal cost) {
		this.cost = cost;
	}
	public BigDecimal getClickprice() {
		return clickprice;
	}
	public void setClickprice(BigDecimal clickprice) {
		this.clickprice = clickprice;
	}
}

然后添加该类Class文件的路径,“工具”——>“选项”——>“Classpath”,添加Classpath:
jasper2
然后lz将上次添加的JDBC的field删除,改为JavaBean的field
jasper3
通过包名和类名读取该Class文件,自动将类中的属性导入作为新的field,这里类的属性名也要与$F{}中的名称相一致。
好了,数据源修改完成,现在可以生成EXCEL报表了。

2.生成EXCEL报表

先在pom中添加相关的jar包:

<dependency>
	<groupId>org.codehaus.groovy</groupId>
	<artifactId>groovy-all</artifactId>
	<version>2.0.1</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.9</version>
</dependency>
<dependency>
	<groupId>net.sf.jasperreports</groupId>
	<artifactId>jasperreports</artifactId>
	<version>6.0.0</version>
</dependency>

下面是生成EXCEL报表的代码:

public static void main(String[] args) throws FileNotFoundException, JRException {
	Campaign campaign = new Campaign();
	campaign.setCampaignname("计划1");
	campaign.setDate("2014-10-10");
	campaign.setImpression(new BigDecimal(500));
	campaign.setClicks(new BigDecimal(100));
	campaign.setClickrate(new BigDecimal(100/500));
	campaign.setCost(new BigDecimal(1000.00));
	campaign.setClickprice(new BigDecimal(1000.00/100));

	List<Campaign> reports = new ArrayList<Campaign>();
	reports.add(campaign);
	JRDataSource dataSource = new JRBeanCollectionDataSource(reports);
	JasperPrint print = JasperFillManager.fillReport(new FileInputStream(new File("src\\main\\java\\com\\ee\\test\\jasper\\sample.jasper")), 
			new HashMap<String, Object>(), dataSource);
	JRXlsExporter exporter = new JRXlsExporter();
	exporter.setExporterInput(new SimpleExporterInput(print));
	exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(new File("src\\main\\java\\com\\ee\\test\\jasper\\sample.xls")));
	exporter.exportReport();
}

JRXlsExporter类生成的是EXCEL2003以前的版本(.xls),如果要生成EXCEL2003以后的版本(.xlsx),则使用JRXlsxExporter。
jasper4
EXCEL报表成功生成,但是离我们想要的效果相距甚远,背景颜色没有。我们来修改一下模板,把有底色的Static Text设为不透明,并且设置上底色:

jasper5

jasper6

我们还可以使用SimpleXlsReportConfiguration类对报表进行配置:

	...
SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setRemoveEmptySpaceBetweenRows(true); //移除空行
configuration.setOnePagePerSheet(false); //不分栏
configuration.setWhitePageBackground(false); //无背景色
exporter.setConfiguration(configuration);
	...

jasper7
EXCEL报表便制作好了。

1 Reply to “iReport制作报表2:Java结合模板生成报表”

发表评论