我有一份由一页组成的报告,该报告是使用 CSV 数据适配器生成的。在报告中,我有一些数据和 2 个表,其中两个表都从 CSV 文件中获取数据。首先,我在显示表格时遇到了问题:我在 myTables 中放入了一些数据,但没有显示任何内容。我已经能够通过在 ParameterMap 表部分中使用和映射 REPORT_PARAMETER_MAP 来解决该问题。现在我有同样的问题,但是从java程序调用myReport。在最后,我创建了一个数据源,我将其作为参数发送到报告。结果,除了 2 个表之外,所有数据都会显示。 在 Jaspersof Studio 中,我定义了一个名为 DS 的参数,其类为:“new net.sf.jasperreports.engine.data.JRCsvDataSource”,我将其传递给 myTables,如下所示:
在此处输入图像描述
在java中我有:
public JasperPrint createReport(InputStream inp) throws SQLException, OutputNotFoundException, OutputEnvelopeCreationException
{
JasperPrint jasperPrint = null;
try
{
String[] columnNames = new String[]{"xxx3", "xxx4", "xxx2", "xxx1"];
JRCsvDataSource ds = new JRCsvDataSource(inp);
ds.setFieldDelimiter(';');
ds.setUseFirstRowAsHeader(true);
ds.setColumnNames(columnNames);
_parameters.put("DS", ds);
jasperPrint = JasperFillManager.fillReport(_jasperReport, _parameters, ds);
}
catch (Exception e)
{
putKOReport(outputStreamEnvelopeFactory,e.toString().getBytes());;
e.printStackTrace();
writeErrorLog("OPS: readReportConfiguration " + e.getMessage() + " " + e);
throw new RuntimeException(e);
}
return jasperPrint;
}
public void prepareReport() throws SQLException, OutputNotFoundException, OutputEnvelopeCreationException
{
_parameters.put("PARAM1", "/main/prj/xxx1.png");
_parameters.put("PARAM2", "/main/prj/xxx2.jpg");
_parameters.put("PARAM3", "/main/prj/xxx3.jpg");
_parameters.put("PARAM4", "/main/prj/xxx4.jpg");
try
{
_jasperReport = JasperCompileManager.compileReport(pathReportJasper);
writeInfoLog("OPS: Report Configuration "+pathReportJasper+" has been prepared");
}
catch (Exception e)
{
putKOReport(outputStreamEnvelopeFactory,e.toString().getBytes());
e.printStackTrace();
writeErrorLog("OPS: prepareReport " + e.getMessage() + " " + e);
throw new RuntimeException(e);
}
}
public byte[] writeOutputFile(JasperPrint jasperPrint)
{
byte[] reportPdf = null;
try
{
reportPdf = JasperExportManager.exportReportToPdf(jasperPrint);
}
catch(Exception e)
{
putKOReport(outputStreamEnvelopeFactory,e.toString().getBytes());
e.printStackTrace();
writeErrorLog("OPS: writeOutputFile " + e.getMessage() + " " +e);
throw new RuntimeException(e);
}
return reportPdf;
}
我做错了什么吗?请问有人可以帮助我吗?
提前谢谢您!
最佳答案
您正在重复使用相同的数据源来填充主数据集和表格:
JRCsvDataSource ds = new JRCsvDataSource(inp);
...
_parameters.put("DS", ds);
jasperPrint = JasperFillManager.fillReport(_jasperReport, _parameters, ds);
由于同一数据源有多个使用者,这会产生不可预测的结果。
如果您可以控制 InputStream
源(例如文件路径),您可以将其作为参数传递,并为每个需要的表构造一个新的 JRCsvDataSource
实例它。
关于java - 将 CSV 数据源从 java 程序传递到报告表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60167856/