贾斯珀报告缺少第一排

我正在使用JasperReports生成报告,并假设将其导出为多种格式。 但目前我只使用excel报告。

这是我的控制器代码。

InputStream in = reportTemplate.getTemplate(reportInquery.getTemplateFile()); JasperPrint print = JasperFillManager.fillReport(in, null, new JRResultSetDataSource(reportDao.getReportData(reportInquery))); resp = HttpConfig.setHeaders(reportInquery, resp); Exporter exporter = reportOption.getRenderOptions(reportInquery.getFormat(), resp.getOutputStream(), print); exporter.exportReport(); 

在我的配置工厂中,excel报告在调用getRenderOptions方法后配置如下。

  public Exporter exporterOptions(OutputStream outputStream, JasperPrint print) { JRXlsExporter exporter = new JRXlsExporter(); exporter.setExporterInput(new SimpleExporterInput(print)); OutputStreamExporterOutput outputStreamExporterOutput = new SimpleOutputStreamExporterOutput(outputStream); exporter.setExporterOutput(outputStreamExporterOutput); SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration(); configuration.setOnePagePerSheet(true); configuration.setDetectCellType(true); configuration.setMaxRowsPerSheet(100); configuration.setRemoveEmptySpaceBetweenColumns(true); configuration.setRemoveEmptySpaceBetweenRows(true); exporter.setConfiguration(configuration); return exporter; } 

为了创建JRResultSetDataSource我在上面的getReportData方法中使用了oracle JRResultSetDataSource

 public RowSet getReportData(ReportInqueryDTO reportInquery) { try { String query = getQueryById(reportInquery.getTemplateId()); Map params = new HashMap(); params.put("fromDate", reportInquery.getFromDate()); params.put("toDate", reportInquery.getToDate()); params.put("appName", this.applicationName); RowSet rowSet = namedParameterJdbcTemplate.query(query, params, new ResultSetExtractor() { @Override public RowSet extractData(ResultSet resultSet) throws SQLException, DataAccessException { OracleCachedRowSet rs = new OracleCachedRowSet(); rs.populate(resultSet); return rs; } }); rowSet.beforeFirst(); return rowSet; } catch (Exception exception) { log.error("getReportData failed."); } return null; } 

我的问题是,excel总是带有缺少的第一条记录,其中指向了resultSet的光标。 (例如:这里rowSet.beforeFirst()意味着在第一个索引之前。我错过了这个场景中的第一条记录。)

我几天都遇到这个问题了。 我想知道这是否是一个碧玉问题我该怎么解决它。 如果无法解决,我想知道如何在第一条记录之前动态添加缓存行集?

我有几个jrxml文件,其中一个在下面添加。每个文件都遵循相同的格式。

                                                                                                                                                   

提前致谢。

请发布您的jrxml文件。

问题可能不在您的代码中。

在Jasper中,数据源中的记录指针会被接收它的每个元素递增(例如,如果您在报表中有一个表,并且您将表的数据源设置为报表的数据源,那么跳过第一条记录。如果是这种情况,你必须将报告中的数据源作为参数传递给表格。

更新:

1.从服务器发送数据源作为参数,并使用不同的报告填充报告(可以为空)。

2.在与bean集合相同类型的报告中删除一个新参数,我们将其命名为“DS1”。

3.设置TableDatasource以使用$ P {DS1}参数。

请参阅我对如何在表组件的帮助下显示JRBeanCollectionDataSource数据的响应? 举个例子。

正如Laura在本回答中提到的,数据源中的记录指针会被接收它的每个元素递增。 由于我传递了结果集,我认为将结果集再次作为参数传递没有意义。 最后,我决定在结果集的开头添加一个空记录。

在上面问题的getReportData方法中,您可以按照以下方法执行此操作。

  RowSet rowSet = namedParameterJdbcTemplate.query(query, params, new ResultSetExtractor() { @Override public RowSet extractData(ResultSet resultSet) throws SQLException, DataAccessException { OracleCachedRowSet rs = new OracleCachedRowSet(); rs.populate(resultSet); // Have to add a empty row, because jasper is not displaying // the first row of report. rs.setReadOnly(false); rs.beforeFirst(); rs.moveToInsertRow(); int numCol = rs.getMetaData().getColumnCount(); for (int i = 1; i < numCol + 1; i++) { // Add null inserted row to each column rs.updateNull(i); } rs.insertRow(); rs.beforeFirst(); return rs; } });