无法使用Jasper报告库生成Excel工作表报告 [英] Couldn't generate Excel sheet report using Jasper report library

查看:344
本文介绍了无法使用Jasper报告库生成Excel工作表报告的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用以下代码生成Excel报告。

I tried to generate Excel report, using the below code.

import java.util.*;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.export.OutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsReportConfiguration;

public class FirstReport 
{
public static void main(String[] args) 
{
    try
    {

        JRXlsExporter exporter = new JRXlsExporter();
        exporter.setExporterInput(new         SimpleExporterInput("FirstReport.jrxml"));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("C://sample_report.xls"));

        SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
        configuration.setOnePagePerSheet(true);
        configuration.setDetectCellType(true);
        configuration.setCollapseRowSpan(false);
        exporter.setConfiguration(configuration);   
        exporter.exportReport();

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

}
}

此程序正在生成以下异常

This program is generating following exception

net.sf.jasperreports.engine.JRRuntimeException:net.sf.jasperreports.engine.JRException:从文件加载对象时出错:FirstReport.jrxml
at net.sf.jasperreports.export.SimpleExporterInput。(SimpleExporterInput.java:157)
在FirstReport.main(FirstReport.java:33)
引起:net.sf.jasperreports.engine。 JRException:从文件加载对象时出错:net.sf.jasperreports.engine.util.JRLoader.loadObject中的FirstReport.jrxml
(JRLoader.java:131)net.sf.jasperreports.engine.util上的
.JRLoader.loadObject(JRLoader.java:103)
at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromFile(JRLoader.java:94)
at net.sf.jasperreports.export.SimpleExporterInput 。 (SimpleExporterInput.java:153)
... 1更多
引起:java.io.StreamCorruptedException:无效的流标题:java.io.ObjectInputStream.readStreamHeader(未知来源)中的3C3F786D

at java.io.ObjectInputStream。(Unknown Source)
at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream。 (ContextClassLoaderObjectInputStream.java:57)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:126)
... 4 more

net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error loading object from file : FirstReport.jrxml at net.sf.jasperreports.export.SimpleExporterInput.(SimpleExporterInput.java:157) at FirstReport.main(FirstReport.java:33) Caused by: net.sf.jasperreports.engine.JRException: Error loading object from file : FirstReport.jrxml at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:131) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:103) at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromFile(JRLoader.java:94) at net.sf.jasperreports.export.SimpleExporterInput. (SimpleExporterInput.java:153) ... 1 more Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.(Unknown Source) at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream. (ContextClassLoaderObjectInputStream.java:57) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:126) ... 4 more

推荐答案

exporter.setExporterInput()的参数必须基于JasperPrint对象(不是jrxml文件)。

Parameter of exporter.setExporterInput() must be based on JasperPrint object (not jrxml file).

您可以在 net.sf.jasperreports.export.SimpleExporterInput 类中看到它。此类中的一些代码:

You can see it at net.sf.jasperreports.export.SimpleExporterInput class. Some code from this class:

/**
 * Creates an {@link ExporterInput} object with a single item wrapping the {@link JasperPrint} object that will be exported. 
 * If you already have a JasperPrint object, you can pass it to the exporter using this type of input.
 */
public SimpleExporterInput(JasperPrint jasperPrint)
{
    if (jasperPrint != null)
    {
        this.items = new ArrayList<ExporterInputItem>();
        items.add(new SimpleExporterInputItem(jasperPrint));
    }
}


/**
 * Creates an {@link ExporterInput} object with a single {@link JasperPrint} item read from the provided input stream. 
 * If you want to read the JasperPrint object from an input stream (like a web location), you can pass the stream to this constructor.
 */
public SimpleExporterInput(InputStream inputStream)
{
    if (inputStream != null)
    {
        JasperPrint jasperPrint = null;
        try
        {
            jasperPrint = (JasperPrint)JRLoader.loadObject(inputStream);
        }
        catch (JRException e)
        {
            throw new JRRuntimeException(e);
        }
        this.items = new ArrayList<ExporterInputItem>();
        items.add(new SimpleExporterInputItem(jasperPrint));
    }
}

JasperPrint对象是执行方法fillReport的结果。例如:

JasperPrint object is result of execution method fillReport. For example:

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReportFile, reportParameters, dataSource);

在此代码中,jasperReportFile是与编译的报告文件(不是jrxml)对应的对象。在你的情况下FirstReport.jasper

In this code jasperReportFile is object which corresponds with compiled report file (not jrxml). In your case FirstReport.jasper

一些代码来自 net.sf.jasperreports.engine.JasperFillManager

/**
 * @see #fill(String, Map, JRDataSource)
 */
public static JasperPrint fillReport(
    String sourceFileName, 
    Map<String,Object> params,
    JRDataSource dataSource
    ) throws JRException
{
    return getDefaultInstance().fill(sourceFileName, params, dataSource);
}
....
    /**
 * Fills the compiled report design loaded from the specified file and returns
 * the generated report object.
 * 
 * @param sourceFileName source file containing the compile report design
 * @param params     report parameters map
 * @param dataSource     data source object
 * @return generated report object
 */
public JasperPrint fill(
    String sourceFileName, 
    Map<String,Object> params,
    JRDataSource dataSource
    ) throws JRException
{
    File sourceFile = new File(sourceFileName);

    JasperReport jasperReport = (JasperReport)JRLoader.loadObject(sourceFile);

    JasperReportsContext lcJrCtx = getLocalJasperReportsContext(sourceFile);

    return JRFiller.fill(lcJrCtx, jasperReport, params, dataSource);
}

HTH

这篇关于无法使用Jasper报告库生成Excel工作表报告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆