【问题标题】:Pass CSV DataSource from java program to Report's Tables将 CSV 数据源从 java 程序传递到报表的表
【发布时间】:2020-02-11 11:30:17
【问题描述】:

我有一份由一页组成的报告,该报告是使用 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;
}

我做错了什么?请问有谁可以帮帮我吗?

提前感谢您!

【问题讨论】:

    标签: java csv jasper-reports datasource


    【解决方案1】:

    您正在重复使用相同的数据源来填充主数据集和表格:

    JRCsvDataSource ds = new JRCsvDataSource(inp);
    ...
    _parameters.put("DS", ds);
    
    jasperPrint = JasperFillManager.fillReport(_jasperReport, _parameters, ds);
    

    由于同一数据源的多个消费者,这会产生不可预知的结果。

    如果您可以控制 InputStream 源(例如文件路径),则可以将其作为参数传递,并为每个需要它的表构造一个新的 JRCsvDataSource 实例。

    【讨论】:

    • 是的,我使用的是同一个数据集!我已经尝试创建一个新的 JRCsvDataSource 实例,例如: JRCsvDataSource dsTab = new JRCsvDataSource(inp); ... _parameters.put("DS", dsTab); jasperPrint = JasperFillManager.fillReport(_jasperReport, _parameters, ds);但 myTable 没有出现。我可以控制 InputStream。我尝试更改 jrDataSource 表达式并发送输入文件,但出现“引用错误...”
    • 您仍在重复使用在一个地方使用的同一 InputStream。所以你不能重复使用它。粘贴 File 方法以查看您卡在哪里
    • 对不起,我错了...我无法管理 InputStream。顺便说一句,我已经能够解决问题(我发布了解决方案)
    【解决方案2】:

    我已经能够解决这个问题:我使用我的 java 程序中的一个循环为每个表创建了一个数据源,并为每个表创建了一个 JRCsvDataSource 参数。这样我所有的表格都打印了数据。在 JRDataSource 表达式中 我必须以这种方式转换对象 $P{DS}

    ((net.sf.jasperreports.engine.data.JRCsvDataSource)$P{DS})
    

    否则不会打印表格。单独的对象不起作用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2012-01-19
      • 1970-01-01
      • 2021-05-08
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多