"java.io.StreamCorruptedException:无效的流标头:3C3F786D"尝试将多个子报表合并到一个主报表中时 [英] "java.io.StreamCorruptedException: invalid stream header: 3C3F786D" while trying to merge more than one sub-report in a master-report
问题描述
我想使用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屋!