上一篇博文中lz介绍了报表模板的制作,但在实际的应用中,还是要通过代码来生成报表。接下来lz就来描述Java结合模板生成报表的过程。
而在本文中,lz会使用另一种数据源JavaBean。因为如果使用JDBC数据源,在代码中需要传入JDBC的数据库连接对象Connection,该对象的生命周期需要自己维护。而且项目中一般都在使用Hibernate或者Mybatis这种数据库框架,无法复用其中的连接对象。但是,lz使用JavaBean来作为数据源的话,就可以利用框架查询出的数据来显示报表,这样更加灵活。
1.修改数据源
lz先来将上文中报表模板的数据源改为JavaBean。
点击下一步,给数据源起个名字就可以了,其他的不用修改。
然后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:
然后lz将上次添加的JDBC的field删除,改为JavaBean的field
通过包名和类名读取该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。
EXCEL报表成功生成,但是离我们想要的效果相距甚远,背景颜色没有。我们来修改一下模板,把有底色的Static Text设为不透明,并且设置上底色:
我们还可以使用SimpleXlsReportConfiguration类对报表进行配置:
... SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration(); configuration.setRemoveEmptySpaceBetweenRows(true); //移除空行 configuration.setOnePagePerSheet(false); //不分栏 configuration.setWhitePageBackground(false); //无背景色 exporter.setConfiguration(configuration); ...
楼下是疯子。哈哈