说明:本文以iReport-5.5.0为例。
提示:对于新手来说,可以先将本文通篇看一下,先行理解,然后再自己手动操作一回。文章中截图较多,看似繁琐,其实只是为了让新手参考而已。
一、下载报表制作工具
从iReport官方地址(https://community.jaspersoft.com/project/ireport-designer/releases)下载最新版本的报表制作工具,下载完成后解压,无需安装,选择"iReport-5.5.0\bin"目录下iReport.exe即可运行工具。
二、新建报表模板
1、选择菜单栏"文件>New"即会弹出如下窗口,可选择想用的模块,本文默认"Blank A4",点击"Launch Reprot Wizard"按钮进入下一步向导
2、为报表模板命名,点击"下一步"按钮进入下一步向导
3、默认操作,点击"下一步"按钮。在此提醒一点,使用iReport制作报表模板时,需要为模板添加数据源(DataSource),数据源有多种,数据源可以是使用SQL语句,模板会自动根据SQL查询出要向模板中填充的数据;数据源也可以是"Empty datasource",本文便以"Empty datasource"为例。
4、此后傻瓜式的点击"下一步"按钮,直到点击"完成"按钮,一个报表模板便新建成功了。模板文件名的后缀为".jrxml"
三、制作报表模板
1、添加属性
在主页左侧栏有一个"Fields",可将其视为一个匿名类,而在其中添加每个field则对应类的属性。添加的field类型默认为String,若需要修改其字段类型,可在右侧属性窗口进行设置。若无属性窗口,打开"窗口>属性"即可。
添加两个属性:name、sex
2、制作模板
将Fields中的两个字段依次拖至"Detail 1 Band"中,然后在右侧"组件面板"中将两个"Static Text"拖至"Title Band"中,位于两个Field正上方,并分别改名为"姓名"、"性别"。同时,删除不需要的Band。
3、编译
至此,一个简单的模板便制作成功了。但还需要将模板编译一下,才能让之后的代码成功运行。编译后的文件名后缀为".jasper"。
四、Java程序实现导出报表(Excel格式)
1、新建一个Java工程,src结构如下:
2、Student.java文件内容。其中类属性对应模板中的Field,名称及类型都必须相同,否则会出错。
package main; public class Student { /** * 姓名 */ private String name; /** * 性别 */ private String sex; /** * 构造方法 */ public Student() { // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
3、Test.java文件内容
package main; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.sf.jasperreports.engine.JRAbstractExporter; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.export.JExcelApiExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; public class Test { public static void main(String[] args) throws Exception { String jasperName = "report2.jasper";//jasper文件名称 String jasperPath = "D:/";//jasper文件所在目录 File jasperFile = new File(jasperPath, jasperName); File excelFile = new File(jasperPath, jasperFile.getName() + ".xls");//要导出的Excel文件 //如果存在,先删除以避免影响 if (!excelFile.exists()) { System.gc(); excelFile.delete(); } //参数Parameter,对应于模板文件中的Parameter栏 Map params = new HashMap(); params.put("SUBREPORT_DIR", jasperPath);//若有子报表,可在此设置其目录 JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(jasperFile), params, getDataSource()); //导出Excel JRAbstractExporter exporter = new JExcelApiExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream(excelFile));//绑定要导出的文件 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);//TRUE背景设置为白色 exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); //设置Excel的sheet名称 String sheetName = "sheet1"; String[] sheetNames = { sheetName }; exporter.setParameter(JRXlsExporterParameter.SHEET_NAMES, sheetNames); exporter.exportReport(); //快速打开Excel文件 openFile(excelFile); } /** * 打开指定文件 * @param excelFile * @throws Exception */ private static void openFile(File excelFile) throws Exception { final Runtime runtime = Runtime.getRuntime(); Process process = null;// final String cmd = "rundll32 url.dll FileProtocolHandler file://" + excelFile.getAbsolutePath(); process = runtime.exec(cmd); } /** * 生成数据源,在此模拟数据源数据 * @return * @throws Exception */ private static JRDataSource getDataSource() throws Exception { ArrayList<Student> dataList = new ArrayList<Student>(); for (int i = 1; i <= 10; i++) { Student stu = new Student(); stu.setName("学生" + i); stu.setSex("男"); dataList.add(stu); } JRDataSource dataSource = new JRBeanCollectionDataSource(dataList); return dataSource; } }
4、效果如下:
结语:本文只是简单地画了一个模板,如何设计模板并未详细介绍。若要像表格一样列出学生信息,可以对模板进行详细设计,可参考其他人的相关的教程。