"java.io.StreamCorruptedException:无效的流标头:3C3F786D"尝试将多个子报表合并到一个主报表中时 [英] "java.io.StreamCorruptedException: invalid stream header: 3C3F786D" while trying to merge more than one sub-report in a master-report

查看:264
本文介绍了"java.io.StreamCorruptedException:无效的流标头:3C3F786D"尝试将多个子报表合并到一个主报表中时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用jasper report和java中的spring boot将多个子报告合并到主报告中,但无法将子报告合并到主报告中.只有一份报告.

I want to merge more than one sub-report into a master report using jasper report and spring boot in java, but not able to merge the sub-report into master report.while the below code works for me, if there is only one report.

report[0] = "/reports/subreport1.jrxml";
report[1] = "/reports/master1.jrxml";
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(productService.report());
for(int i =0 ;i<=1;i++)
{
    inputStream[i] = this.getClass().getResourceAsStream(report[i]);
    jasperReport[i] = JasperCompileManager.compileReport(inputStream[i]);
    jasperPrint[i] = JasperFillManager.fillReport(jasperReport[i], null, dataSource);
    HtmlExporter exporter = new HtmlExporter(DefaultJasperReportsContext.getInstance());
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint[i]));
    exporter.setExporterOutput(new SimpleHtmlExporterOutput(response.getWriter()));
    exporter.exportReport();
}

获取错误为"java.io.StreamCorruptedException:无效的流标头:3C3F786D"

getting error as "java.io.StreamCorruptedException : invalid stream header: 3C3F786D"

推荐答案

我已经有了解决方案,在这里最初我无法合并报告,因为我是从数据库中获取数据的,但是我已经写了从列表中获取数据的代码.所以这是更新的代码.

I have got my solution for this, here initially i was not able to merge the reports because, i was getting my data from database but, i have write the code for getting the data from list. so here is the updated code.

首先自动装配数据源的依赖性为:

First Autowire the dependency of DataSource as:

@Autowired
private DataSource dataSource; 

我上面修改的代码是:

public void report(HttpServletResponse response) throws Exception {

        response.setContentType("text/html");
        String[] report = new String[2];
        InputStream[] inputStream = new InputStream[2];
        JasperReport[] jasperReport = new JasperReport[2];

        List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();

        report[0] = "/reports/master1.jrxml";
        report[1] = "/reports/subreport.jrxml";

        for(int i =0 ;i<=1;i++)
        {
            inputStream[i] = this.getClass().getResourceAsStream(report[i]);
            jasperReport[i] = JasperCompileManager.compileReport(inputStream[i]);
            JasperPrint jasperPrint1 = JasperFillManager.fillReport(jasperReport[i], null, dataSource.getConnection());
            jasperPrintList.add(jasperPrint1);
            HtmlExporter exporter = new HtmlExporter();
            exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
            exporter.setExporterOutput(new SimpleHtmlExporterOutput(response.getWriter()));
            exporter.exportReport();
        }

我代码中的主要修改是在fillReport中传递参数代替数据源"的过程中,存在"datasource.getConnection()".

Major modification in my code is during passing of parameter in fillReport in place of "datasource" there is "datasource.getConnection()".

这篇关于"java.io.StreamCorruptedException:无效的流标头:3C3F786D"尝试将多个子报表合并到一个主报表中时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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