/** * Формирует отчет на основании его модели и указанных пользователем в контексте параметров. * * @param report модель формируемого отчета. * @param ctx данные необходимые для формирования данного отчета. * @return сформированный отчет. * @throws ReportProcessingException в случае каких-либо проблем. */ public HSSFWorkbook process(Report report, final ELContext ctx) throws ReportProcessingException { ExecutionContext ectx = null; try { report = new Report( null, report); // копируем модель отчета, т.к. в процессе формирования отчета она может // измениться. final HSSFWorkbook wb = makeWorkbook(report, ctx); final Map<Short, HSSFCellStyle> styles = applyStyles(report, wb); ectx = new ExecutionContext(report, ctx, wb, styles); ctx.getVariables().put(VAR_CONTEXT, ectx); final String user = report.getUser() != null ? (String) report.getUser().getValue(ctx) : null; final String password = report.getPassword() != null ? (String) report.getPassword().getValue(ctx) : null; if (user != null && password != null) { wb.writeProtectWorkbook(password, user); } for (final ReportEventListener listener : ectx.listeners) { listener.beforeReport(ectx); } for (final Sheet sheet : report.getSheets()) { processSheet(ectx, sheet); } boolean activeSheetSpecified = false; for (int i = 0, cnt = wb.getNumberOfSheets(); i < cnt; i++) { if (!wb.isSheetHidden(i) && !wb.isSheetVeryHidden(i)) { wb.setActiveSheet(i); wb.setSelectedTab(i); activeSheetSpecified = true; break; } } if (!activeSheetSpecified) { final HSSFSheet sheet = wb.createSheet(); final int index = wb.getSheetIndex(sheet); wb.setActiveSheet(index); wb.setSelectedTab(index); } for (final ReportEventListener listener : ectx.listeners) { listener.afterReport(ectx); } return wb; } catch (Exception e) { throw new ReportProcessingException(e.getMessage() + "\n" + ectx, e, ectx); } }
protected void processSheet(final ExecutionContext ectx, final Sheet sheet) throws Exception { ectx.sheet = sheet; for (final ReportEventListener listener : ectx.listeners) { listener.beforeSheet(ectx); } if (ectx.sheet.isRendered()) { ectx.wsheet = ectx.wb.createSheet((String) sheet.getTitle().getValue(ectx.elctx)); // ctx.wsheet.setRowSumsBelow(false); ectx.wsheet.setAlternativeExpression( false); // setAlternativeExpression делает то что должен делать метод setRowSumBelow() ... final int sheetIdx = ectx.wb.getSheetIndex(ectx.wsheet); ectx.wb.setSheetHidden(sheetIdx, sheet.isHidden()); ectx.wsheet.setZoom(sheet.getZoom(), 100); if (sheet.isProtected() && ectx.report.getPassword() != null && ectx.wb.isWriteProtected()) { ectx.wsheet.protectSheet((String) ectx.report.getPassword().getValue(ectx.elctx)); } for (final Section section : sheet.getSections()) { processSection(ectx, section); } final int[] widths = sheet.getColumnWidths(); for (int i = 0; i < widths.length; i++) { ectx.wsheet.setColumnWidth((short) i, widths[i]); } final boolean[] hidden = sheet.getColumnHidden(); for (int i = 0; i < hidden.length; i++) { ectx.wsheet.setColumnHidden(i, hidden[i]); } for (Iterator<TreeNode<ColumnGroup>> i = sheet.getColumnGroups().traverseChildNodes(); i.hasNext(); ) { final ColumnGroup group = i.next().getData(); ectx.wsheet.groupColumn(group.getFirstColumn(), (short) group.getLastColumn()); } ectx.wsheet.getHeader().setLeft(sheet.getHeader().getLeft()); ectx.wsheet.getHeader().setCenter(sheet.getHeader().getCenter()); ectx.wsheet.getHeader().setRight(sheet.getHeader().getRight()); ectx.wsheet.getFooter().setLeft(sheet.getFooter().getLeft()); ectx.wsheet.getFooter().setCenter(sheet.getFooter().getCenter()); ectx.wsheet.getFooter().setRight(sheet.getFooter().getRight()); processPrintSetup(ectx.wsheet, sheet.getPrintSetup()); } for (final ReportEventListener listener : ectx.listeners) { listener.afterSheet(ectx); } ectx.sheet = null; ectx.wsheet = null; }