java - 将 CSV 数据源从 java 程序传递到报告表

标签 java csv jasper-reports datasource

我有一份由一页组成的报告,该报告是使用 CSV 数据适配器生成的。在报告中,我有一些数据和 2 个表,其中两个表都从 CSV 文件中获取数据。首先,我在显示表格时遇到了问题:我在 myTables 中放入了一些数据,但没有显示任何内容。我已经能够通过在 ParameterMap 表部分中使用和映射 REPORT_PARAMETER_MAP 来解决该问题。现在我有同样的问题,但是从java程序调用myReport。在最后,我创建了一个数据源,我将其作为参数发送到报告。结果,除了 2 个表之外,所有数据都会显示。 在 Jaspersof Studio 中,我定义了一个名为 DS 的参数,其类为:“new net.sf.jasperreports.engine.data.JRCsvDataSource”,我将其传递给 myTables,如下所示:

在此处输入图像描述

enter image description here

在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/

相关文章:

java - "unchangable"固定大小的 JPanel 是否可能?

c - 读取一个大的CSV文件并用C语言存储内容

jasper-reports - 使用 iReport 拉伸(stretch)一行以适应 jasper 报告中的数据

python - 分离一个csv进行处理

c# - 带双引号的 CSV 解析

java - 如何在 java 中使用 JRSwapFileVirtualizer 进行碧 Jade 报告

jasper-reports - JasperReports 中的右对齐页码信息

java - 如何使用 JPA 从 MySQL 检索 DateTime,无需毫秒

java - Swing:如何使用多个按钮?

java - 如何在Java中播放长声音文件?没有语法错误但没有声音