ireport导出Excel报表的实现

时间:2022-06-11 20:34:48

说明:本文以iReport-5.5.0为例。

提示:对于新手来说,可以先将本文通篇看一下,先行理解,然后再自己手动操作一回。文章中截图较多,看似繁琐,其实只是为了让新手参考而已。

一、下载报表制作工具

    从iReport官方地址(https://community.jaspersoft.com/project/ireport-designer/releases)下载最新版本的报表制作工具,下载完成后解压,无需安装,选择"iReport-5.5.0\bin"目录下iReport.exe即可运行工具。

ireport导出Excel报表的实现

二、新建报表模板

   1、选择菜单栏"文件>New"即会弹出如下窗口,可选择想用的模块,本文默认"Blank A4",点击"Launch Reprot Wizard"按钮进入下一步向导

ireport导出Excel报表的实现

2、为报表模板命名,点击"下一步"按钮进入下一步向导


ireport导出Excel报表的实现

3、默认操作,点击"下一步"按钮。在此提醒一点,使用iReport制作报表模板时,需要为模板添加数据源(DataSource),数据源有多种,数据源可以是使用SQL语句,模板会自动根据SQL查询出要向模板中填充的数据;数据源也可以是"Empty datasource",本文便以"Empty datasource"为例。

ireport导出Excel报表的实现

4、此后傻瓜式的点击"下一步"按钮,直到点击"完成"按钮,一个报表模板便新建成功了。模板文件名的后缀为".jrxml"

ireport导出Excel报表的实现

三、制作报表模板

1、添加属性

      在主页左侧栏有一个"Fields",可将其视为一个匿名类,而在其中添加每个field则对应类的属性。添加的field类型默认为String,若需要修改其字段类型,可在右侧属性窗口进行设置。若无属性窗口,打开"窗口>属性"即可。

      添加两个属性:name、sex

ireport导出Excel报表的实现

2、制作模板

      将Fields中的两个字段依次拖至"Detail 1 Band"中,然后在右侧"组件面板"中将两个"Static Text"拖至"Title Band"中,位于两个Field正上方,并分别改名为"姓名"、"性别"。同时,删除不需要的Band。

ireport导出Excel报表的实现

3、编译

      至此,一个简单的模板便制作成功了。但还需要将模板编译一下,才能让之后的代码成功运行。编译后的文件名后缀为".jasper"。

ireport导出Excel报表的实现

ireport导出Excel报表的实现

四、Java程序实现导出报表(Excel格式)

1、新建一个Java工程,src结构如下:

ireport导出Excel报表的实现

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、效果如下:

ireport导出Excel报表的实现

      结语:本文只是简单地画了一个模板,如何设计模板并未详细介绍。若要像表格一样列出学生信息,可以对模板进行详细设计,可参考其他人的相关的教程。