/**
  * Формирует отчет на основании его модели и указанных пользователем в контексте параметров.
  *
  * @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);
   }
 }
  /** {@inheritDoc} */
  @Override
  public void generate(
      IProgressMonitor monitor,
      HSSFWorkbook workbook,
      int sheetNo,
      boolean useLogicalNameAsSheetName,
      Map<String, Integer> sheetNameMap,
      Map<String, ObjectModel> sheetObjectMap,
      ERDiagram diagram,
      Map<String, LoopDefinition> loopDefinitionMap) {
    this.clear();

    List<ERTable> nodeSet = null;

    if (diagram.getCurrentCategory() != null) {
      nodeSet = diagram.getCurrentCategory().getTableContents();
    } else {
      nodeSet = diagram.getDiagramContents().getContents().getTableSet().getList();
    }

    for (ERTable table : nodeSet) {
      String name = null;
      if (useLogicalNameAsSheetName) {
        name = table.getLogicalName();
      } else {
        name = table.getPhysicalName();
      }

      HSSFSheet newSheet = createNewSheet(workbook, sheetNo, name, sheetNameMap);

      sheetObjectMap.put(workbook.getSheetName(workbook.getSheetIndex(newSheet)), table);

      this.setTableData(workbook, newSheet, table);

      monitor.worked(1);
    }
  }