Передача CSV DataSource из программы java в таблицы отчета - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть отчет из одной страницы, созданный с использованием адаптера данных CSV. В отчете у меня есть некоторые данные и 2 таблицы, где оба берут данные из файла CSV. В первый момент у меня возникла проблема с отображением таблицы: я поместил некоторые данные в myTables, но ничего не показывалось. Я смог решить эту проблему, используя и отображая REPORT_PARAMETER_MAP в разделе таблицы ParameterMap. Теперь у меня та же проблема, но вызов myReport из java программы. В этом последнем я создал источник данных, который отправляю в качестве параметра для отчета. В результате отображаются все данные, кроме двух таблиц. В 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;
}

Я что-то не так делаю? Кто-нибудь может мне помочь, пожалуйста?

Спасибо вам в аванс!

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вы повторно используете один и тот же источник данных для заполнения основного набора данных и таблиц:

JRCsvDataSource ds = new JRCsvDataSource(inp);
...
_parameters.put("DS", ds);

jasperPrint = JasperFillManager.fillReport(_jasperReport, _parameters, ds);

Это приводит к непредсказуемым результатам из-за нескольких потребителей для одного и того же источника данных.

Если у вас есть контроль над источником InputStream, например путь к файлу, который вы можете передать в качестве параметра и создать новый экземпляр JRCsvDataSource для каждой таблицы, которая в этом нуждается.

0 голосов
/ 12 февраля 2020

Мне удалось решить эту проблему: я создал источник данных для каждой таблицы, используя цикл из моей программы java и создав параметр JRCsvDataSource для каждой из них. Таким образом, все мои таблицы печатаются с данными. В выражении JRDataSource мне пришлось привести объект $ P {DS} таким образом:

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

, иначе таблицы не были напечатаны. Один объект не работает!

...