Я пытаюсь создать 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");
}