我用Google搜索,但我无法找到解决问题的方法
我在这种情况下:我的客户可以通过指定字段和数据字段来创建自己的表单 然后,向用户显示创建的表单,用户可以填写所需的数据
所有数据都存储在存储库中(mong DB) 然后我的Web应用程序的另一部分我的客户可以在表中查看所有已保存的数据
到目前为止一切都那么好......一切都很好
现在我需要在Excel或PDF文件中导出表单的所有数据
我正在使用Jasper Report来创建报告
问题是我不知道如何在报告中设计表格,因为我不知道列名和计数
实际上我将这个bean作为我的mongo db“record”的表示
FormDataModel
@Document(collection = "e_form_data")
public class FormDataModel extends AbstractModel {
private static final long serialVersionUID = -1733975205300782871L;
private String dataInserimento;
@Field
@Indexed(name = "e_form_id_idx")
private String eFormId;
@Field
private Map<String, Object> eFormData;
//Getter, setter and contructors.. omitted for smaller text
}
AbstractModel是:
AbstractModel
public abstract class AbstractModel implements Serializable {
private static final long serialVersionUID = -3154415503243809601L;
@Id
protected String id;
@Field
protected String creatoDa;
@Field
protected String modificatoDa;
@Field
protected Date dataCreazione;
@Field
protected Date dataModifica;
//Getter, setter and contructors.. omitted for smaller text
}
在我的FormDataModel中,属性 eFormData 表示填充由其他用户创建的Web表单的用户创建的dinamyc数据
这基本上意味着我不知道如何创建这个表单以及它将包含哪些字段
我刚才,Map键是我表的列,而Map值是列值 如何在报告中迭代/使用此地图?有什么建议吗?
修改
正如Petter Friberg所建议的那样,我会更加精确 问题是以下问题;假设我使用JRBeanCollectionDataSource作为数据源,假设我使用此代码来填充和创建我的报告:
List<FormDataModel> datiForm = //recover data from mongo repository
reportData.setDatiForm(datiForm);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("nomeForm", reportData.getFormName());
parameters.put("codiceForm", reportData.getFormCode());
parameters.put("descrizioneForm", reportData.getFormDescription());
InputStream fis = //Get input stream for company logo
parameters.put("logo", fis);
InputStream ris = //Get the input stream of the compiled report (I don't want to recompile report at every HTTP request)
InputStream compiledReport = ris;
JasperPrint jasperPrint = JasperFillManager.fillReport(compiledReport, parameters, new JRBeanCollectionDataSource(datiForm, true)); JasperExportManager.exportReportToPdfFile(jasperPrint,"/home/angelo/Scrivania/report/report1.pdf");
因为yuo可以看到我从mongo存储库获取数据和其他一些信息,我使用JRBeanCollectionDataSource作为报表数据源 现在,我的Bean列表是使用 FormDataModel 对象构建的;我想在我的报告中构建的是一个表,其中列名是Map eFormData的键,列值是此映射的值 主要的问题是我不知道Map中包含什么,因为它是由另一个用户决定的,所以我正在寻找的是通过循环Map来在我的报告中构建表的方法;报告中的表格应如下所示:
<table>
<!-- This first row is built by taking the keys in the Map of one element of my datasource -->
<tr>
<th>Map Key 1</th>
<th>Map Key 2</th>
<th>Map Key 3</th>
</tr>
<!-- Form here, each row is built by cycling my datasource and for each element i'll take the Map values to build the several columns of the row -->
<tr>
<td>Map Value 1</td>
<td>Map Value 2</td>
<td>Map Value 3</td>
</tr>
</table>
现在我想我的jrxml中没有标准名称(例如col1,col2等...)因为如果我不知道表格中有多少列我应该使用未定义的名称col1, col2 ..... col10000希望在地图中不会出现超过10000个字段(非常常见的场景,但是当人们可以自由地做任何他们想做的事情时......可以做到) 什么是我的方案的最佳解决方案?我当时想要使用一个scriptlet,但我不确定如何使用它
我希望我能更明确地指出我被困的地方
而且:什么是动态碧玉?从未听说过他们