贾斯珀报告缺少第一排
我正在使用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; } });
- Jasper报告在netbeans中运行良好,但在部署为jar应用程序时会出现exception
- 如何在导出中组合多个jasper报告时重新计算页码?
- JasperReports中的java.util.ConcurrentModificationException
- NoClassDefFoundError:org / apache / commons / logging / LogFactory
- 关闭子框架(Java + iReport)时如何防止父框架关闭?
- 如何从Web应用程序打印到收据打印机?
- 如何获得复杂JavaBean的价值
- 如何将任意对象作为参数传递给jasper报告?
- JasperReports:获取JRRuntimeException:创建SAX解析器时出错