gpt4 book ai didi

java - 无法使用 Jasper 报告库生成 Excel 工作表报告

转载 作者:行者123 更新时间:2023-12-01 11:51:29 27 4
gpt4 key购买 nike

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

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();
}

}
}

该程序正在生成以下异常

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

最佳答案

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

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

/**
* 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 jasperPrint = JasperFillManager.fillReport(jasperReportFile, reportParameters, dataSource);

在此代码中,jasperReportFile 是与编译的报告文件(不是 jrxml)相对应的对象。在你的情况下 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

关于java - 无法使用 Jasper 报告库生成 Excel 工作表报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com