首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试合并主报表中的多个子报表时出现"java.io.StreamCorruptedException: invalid stream header: 3C3F786D“

尝试合并主报表中的多个子报表时出现"java.io.StreamCorruptedException: invalid stream header: 3C3F786D“
EN

Stack Overflow用户
提问于 2019-06-24 15:16:10
回答 1查看 3.1K关注 0票数 0

我想使用java中的jasper report和spring boot将多个子报告合并到一个主报告中,但不能将子报告合并到主report.while中。如果只有一个报告,下面的代码适用于我。

代码语言:javascript
运行
复制
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 : invalid stream header: 3C3F786D“

EN

回答 1

Stack Overflow用户

发布于 2019-06-25 20:20:56

我有我的解决方案,在这里,我最初不能合并报告,因为,我从数据库中获取数据,但我已经编写了从列表中获取数据的代码。下面是更新后的代码。

首先将DataSource的依赖项自动绑定为:

代码语言:javascript
运行
复制
@Autowired
private DataSource dataSource; 

我上面修改过的代码是:

代码语言:javascript
运行
复制
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()“代替了"datasource”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56731529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档