本文不讲原理,因为网上的资源很多,本文以一个简单的日销售报表为例,记录在 ireport 中使用 javabe an 作数据源开发 基于 jasperreports 报表 过程 .
一.准备工作
1. 正确安装 jdk
2. 到 http://ireport.sourceforge.net/ 去下载 ireport, 本文使用 1.3.1 版本,解压 iReport 在任意目录,解压后的文件里面有一个 iReport.bat ,通过双击运行。
3. 到 http://jasperreports.sourceforge.net/index.html 下载 jasperreport, 本文使用的是 1.3.1 版本,解压到任意目录,开发中需要使用其中的 jasperreports-1.3.1.jar 、 commons-logging-1.0.2.jar 、 commons-collections-2.1.jar ,使用 bean 做为数据源还需要 commons-beanutils-1.7.jar, 如果需要生成 pdf 文件 , 还需要 itext-1.3.1.jar 、 iTextAsian.jar, 如果使用动态编译 jrxml 文件,还需要 commons-digester-1.7.jar 。
二.创建 javabean
1. 创建 DailySales.java, 一个简单 VO bean 。
import java.io.Serializable;
public class DailySales implements Serializable
{
private static final long serialVersionUID = 1L;
private String productNo ;
private String productName ;
private int number ;
private int money ;
private int id ;
public DailySales(String productNo, String productName, int number, int money)
{
this . productNo = productNo;
this . productName = productName;
this . number = number;
this . money = money;
}
public String getProductNo()
{
return productNo ;
}
public void setProductNo(String productNo)
{
this . productNo = productNo;
}
public String getProductName()
{
return productName ;
}
public void setProductName(String productName)
{
this . productName = productName;
}
public int getNumber()
{
return number ;
}
public void setNumber( int number)
{
this . number = number;
}
public int getMoney()
{
return money ;
}
public void setMoney( int money)
{
this . money = money;
}
public int getId()
{
return id ;
}
public void setId( int id)
{
this . id = id;
}
}
2 .生成数据源
import java.util.Arrays;
import java.util.Collection;
/**
* 简单工厂类,取得数据
* @author xmlin
*
*/
public class DailySalesFactory
{
// 为了在 ireport 中能够测试,必须使用 static 方法
public static Collection<DailySales> getBeanCollection()
{
// 数据源的生成,通常调用 dao 操作
List<DailySales> data = new ArrayList<DailySales>();
for ( int i = 0; i < 100; i++)
{
data.add( new DailySales( " 货号 " + i, " 产品 " + i, i, i * 100));
}
return data;
}
}
三.使用 ireport 开发报表样式
1.新建一个项目。
2.设置类路径,在菜单“ options” 中选择 Classpath, 点击在弹出框中的 add folder ,填写 javabean 编译成的 .class 文件存放的路径 . 点 save Classpath 完成。如图
3.设置数据源.在菜单" Data "中选择” Connection/Data sources”, 点击在弹出框中的 new 按钮增加一个数据源.如图
其中 Name 随便取一个名字,T ype of Connection/Data 选择 JavaBeans set data source, 如果使用其它的数据源则选择其它的选项.F actory class 为我们刚才创建的 Factory 类,里面包含取得测试数据的静态方法 getBeanCollection() .用 Test 测试是否成功,点 Save 保存.
4. 设置活动连接.在菜单" Data "中选择” Set Active Connection”.
5. Report Query , 在菜单" Data "中选择” Report Query”, 填写 javabean, 即我们创建的 VO bean. 如图
6 . 设计报表.
设计日期字段如图
设计填充字段 , 如图
设计页数字段如图
设计好的报表样式如图
点菜单" build "中的" compile "进行编译,然后再” execute with connection datasource” 就可以看到报表的结果了.
报表设计完成,在 ireport 的执行路径下会生成一个 DailySales.jasper 的文件.
四.生成报表
生成的 DailySales.jasper 可以在 web 服务端生成报表 , 也可以在肥客户端如 swing 生成 , 这里写一个在肥客户端和简单运用 .
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
public class TestReport
{
public static void main(String[] args)
{
TestReport. showReport ();
}
private static void showReport()
{
String reportPath = "D:\\dailySales.jasper" ;
Map parameters = new HashMap();
// 如果报表中有用到变量,在这里给它赋值.
//parameters.put("ReportTitle", " 报表标题 ");
try
{
JasperReport jasperReport = (JasperReport) JRLoader. loadObject (reportPath);
JasperPrint jasperPrint = JasperFillManager. fillReport (jasperReport, parameters, new JRBeanCollectionDataSource(getBeanCollection() ) );
JasperViewer jrview = new JasperViewer(jasperPrint);
jrview.setPreferredSize( new Dimension(200,100));
jrview.setVisible( true );
}
catch (JRException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
运行生成的结果如图
生成各种格式的报表文件 :
public static void main(String[] args)
{
try
{
// 编译报表,并 jrxml 所在的目录中生成 jasper 文件
JasperCompileManager. compileReportToFile ( "d:\\test.jrxml" );
Map param = new HashMap ();
JasperPrint jasperPrint = JasperFillManager. fillReport ( "d:\\test.jasper" , param,
new JRBeanCollectionDataSource(DailySalesFactory. getBeanCollection ()));
// 生成 html 和 pdf 也可以使用 JRExporter 来生成
JasperExportManager. exportReportToHtmlFile (jasperPrint, "d:\\test.html" );
JasperExportManager. exportReportToPdfFile (jasperPrint, "d:\\test.pdf" );
// 使用 JRExporter 来生成 XLS, 很多参数可以查 api 或 ireport 的属性窗口
JRExporter xlsExporter = new JRXlsExporter();
ByteArrayOutputStream xlsOut = new ByteArrayOutputStream();
xlsExporter.setParameter(JRExporterParameter. JASPER_PRINT , jasperPrint);
xlsExporter.setParameter(JRExporterParameter. OUTPUT_STREAM , xlsOut);
xlsExporter.setParameter(JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS , Boolean. TRUE ); // 删除记录最下面的空行
xlsExporter.setParameter(JRXlsExporterParameter. IS_ONE_PAGE_PER_SHEET , Boolean. FALSE ); // 删除多余的 ColumnHeader
xlsExporter.setParameter(JRXlsExporterParameter. IS_WHITE_PAGE_BACKGROUND , Boolean. FALSE ); // 显示边框
xlsExporter.exportReport();
FileOutputStream out = new FileOutputStream( new File( "d:\\test.xls" ));
out.write(xlsOut.toByteArray());
// 使用 JRExporter 来生成 html , 很多参数可以查 api 或 ireport 的属性窗口
JRExporter htmlExporter = new JRHtmlExporter();
ByteArrayOutputStream htmlOut = new ByteArrayOutputStream();
htmlExporter.setParameter(JRHtmlExporterParameter. JASPER_PRINT , jasperPrint);
htmlExporter.setParameter(JRHtmlExporterParameter. OUTPUT_STREAM , htmlOut);
htmlExporter.setParameter(JRHtmlExporterParameter. CHARACTER_ENCODING , "utf-8" );
htmlExporter.setParameter(JRHtmlExporterParameter. IS_USING_IMAGES_TO_ALIGN , Boolean. FALSE );
htmlExporter.exportReport();
FileOutputStream out2 = new FileOutputStream( new File( "d:\\test1.html" ));
out2.write(htmlOut.toByteArray());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}