JasperReport Как инициализировать JRDataSource с карты - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь создать PDF-файл с простой таблицей. Я вычислил все данные таблицы впереди в Map<String, List<String>>, где ключи - это столбцы таблицы, а соответствующий список - это значения, которые будут заполнять ячейки каждого столбца. Я следовал этому примеру , но мне кажется, что я не могу правильно инициализировать JRDataSource, необходимый для печати отчета, так как не могу понять, что он ожидает получить. Кажется, что есть несколько классов, которые реализуют интерфейс как JRMapArrayDataSource или JRMapCollectionDataSource, но ожидают массив или коллекцию. Я уже пытался преобразовать свою карту в одну из них, но это не сработает, потому что тогда он не может знать, что происходит с каждым столбцом. Следует моему коду Любая подсказка о том, как структурировать это, была бы очень признательна.

public void buildReport(Map<String, List<String>> tableData) throws Exception {
    drb = new DynamicReportBuilder();

    List<AbstractColumn> columns = new ArrayList<>();

    tableData.keySet().forEach(key-> {
        AbstractColumn column = ColumnBuilder.getNew()
            .setColumnProperty(key, String.class.getName()).setTitle(key.toUpperCase()).setWidth(85).build();

        columns.add(column);
    });

    columns.forEach(column -> drb.addColumn(column));

    DynamicReport dynamicReport = drb.build();

    JasperReport jasperReport = DynamicJasperHelper.generateJasperReport(dynamicReport,
            new ClassicLayoutManager(),
            params);

    //JRDataSource dataSource = new JRBeanCollectionDataSource(SortUtils.sortCollection(Arrays.asList(tableData.values()), dynamicReport.getColumns()));
    JRDataSource dataSource = new JRMapArrayDataSource(tableData); // this is wrong since it expects java.lang.Object

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);

    exportReport(jasperPrint, System.getProperty("user.dir")+ urlJasper + "reports/medical-report.pdf");

}

1 Ответ

1 голос
/ 21 января 2020

Я исправил проблему для этого случая, реструктурировав данные в набор строк. Поэтому вместо Map<String, List<String>> мне пришлось преобразовать его в List<Map<String, String>>, где каждая карта в списке относится к строке в таблице, а карта имеет имя столбца в качестве ключа и значение столбца для строки в качестве значения. Затем я использовал

JRDataSource dataSource = new JRBeanCollectionDataSource(tableData);

для создания JRDataSource.

...