예제 #1
0
 /** Пересчитывает максимальное количество колонок в областе. */
 protected void recalculateColumnsCount() {
   int count = 0;
   for (Row row : rows) {
     int ci = row.getCells().size();
     while (ci > 0 && row.getCells().get(ci - 1) == null) {
       ci--;
     }
     count = Math.max(count, ci);
   }
   this.columnsCount = count;
 }
  private void renderRow(
      XhtmlNode table, Row r, int indent, List<Boolean> indents, String imagePath)
      throws IOException {
    XhtmlNode tr = table.addTag("tr");
    String color = "white";
    if (r.getColor() != null) color = r.getColor();
    tr.setAttribute(
        "style", "border: 0px; padding:0px; vertical-align: top; background-color: " + color + ";");
    boolean first = true;
    for (Cell t : r.getCells()) {
      renderCell(
          tr,
          t,
          "td",
          first ? r.getIcon() : null,
          first ? r.getHint() : null,
          first ? indents : null,
          !r.getSubRows().isEmpty(),
          first ? r.getAnchor() : null,
          color,
          imagePath);
      first = false;
    }
    table.addText("\r\n");

    for (int i = 0; i < r.getSubRows().size(); i++) {
      Row c = r.getSubRows().get(i);
      List<Boolean> ind = new ArrayList<Boolean>();
      ind.addAll(indents);
      if (i == r.getSubRows().size() - 1) ind.add(true);
      else ind.add(false);
      renderRow(table, c, indent + 1, ind, imagePath);
    }
  }
예제 #3
0
 private void check(Row r, String string, int size, String path) throws FHIRException {
   check(
       r.getCells().size() == size,
       "All rows must have the same number of columns ("
           + Integer.toString(size)
           + ") as the titles but row "
           + path
           + " doesn't ("
           + r.getCells().get(0).text()
           + ")");
   int i = 0;
   for (Row c : r.getSubRows()) {
     check(c, "rows", size, path + "." + Integer.toString(i));
     i++;
   }
 }
예제 #4
0
 /**
  * Добавляет новую строку в данную область. При этом пересчитываются координаты тех регионов
  * которых затрагивает вставка новой строки в данной области.
  *
  * @param rownum индекс строки которая будет вставлена в область.
  * @param cells массив ячеек которые будут вставлены в добавленную строку области.
  */
 public void addRow(final int rownum, final Cell[] cells) {
   if (rownum < 0 || rownum > rows.size())
     throw new IndexOutOfBoundsException("row number is out of bounds");
   // добавим строку ...
   final Row row = new Row();
   row.getCells().addAll(Arrays.asList(cells));
   rows.add(rownum, row);
   recalculateColumnsCount();
   // пересчитаем характеристики всех регионов области ...
   for (Region region : regions) {
     if (region.firstRow >= rownum) {
       region.shiftRows(1);
     } else if (region.lastRow >= rownum) {
       region.lastRow++;
     }
   }
 }
예제 #5
0
 /**
  * Удаляет целую строки из данной области. При этом пересчитываются координаты тех регионов
  * которых затрагивает удаление данной области.
  *
  * @param rownum индекс удаляемой строки.
  * @return массив всех ячеек из заданной строки. Если в удаляемой строке в какой-то ячейке не было
  *     ничего указано то соответствующий элемент массива будет равен <code>null</code>.
  */
 public Cell[] removeRow(final int rownum) {
   if (rownum < 0 || rownum >= rows.size()) throw new IndexOutOfBoundsException("Invalid range");
   // пересчитаем характеристики всех регионов области ...
   for (Iterator<Region> it = regions.iterator(); it.hasNext(); ) {
     final Region region = it.next();
     if (region.firstRow > rownum) {
       region.shiftRows(-1);
     } else if (region.lastRow >= rownum) {
       if (region.lastRow > region.firstRow) {
         region.lastRow--;
       } else {
         it.remove();
       }
     }
   }
   // удалим строку ...
   final Row r = rows.remove(rownum);
   recalculateColumnsCount();
   return r.getCells().toArray(new Cell[columnsCount]);
 }
예제 #6
0
  /**
   * Собирает информацию о некоторой области из указанного листа шаблона excel.
   *
   * @param sheet шаблон листа отчета в котором находятся данные для данной области.
   * @param top номер верхней строки (начиная с 0) относящейся к указанной области.
   * @param height количество строк в области. Должно быть как минимум 1.
   * @param palette реестр всех стилей используемых в данном отчете.
   */
  public Area(final HSSFSheet sheet, final int top, final int height, final StylePalette palette) {
    if (sheet == null || top < 0 || height < 1)
      throw new IllegalArgumentException("Illegal area arguments");
    rows = new ArrayList<Row>();
    regions = new ArrayList<Region>();

    final int bottom = top + height - 1;
    int lastColumn = 0;
    for (int i = top; i <= bottom; i++) {
      final Row rm = new Row();
      rows.add(rm);
      final HSSFRow row = sheet.getRow(i);
      if (row == null) {
        rm.setHeight(sheet.getDefaultRowHeight());
        continue;
      }
      rm.setHeight(row.getHeight());
      rm.setHidden(row.getZeroHeight());
      lastColumn = Math.max(lastColumn, row.getLastCellNum());
      for (int j = 0; j <= row.getLastCellNum(); j++) {
        final HSSFCell cell = row.getCell(j);
        if (cell == null) {
          rm.getCells().add(null);
        } else {
          rm.getCells().add(new Cell(cell, palette));
        }
      }
    }
    this.columnsCount = lastColumn + 1;

    final int regcount = sheet.getNumMergedRegions();
    for (int i = 0; i < regcount; i++) {
      final CellRangeAddress src = sheet.getMergedRegion(i);
      if (src.getFirstRow() >= top && src.getLastRow() <= bottom) {
        final Region dst =
            new Region(
                this,
                src.getFirstColumn(),
                src.getFirstRow() - top,
                src.getLastColumn(),
                src.getLastRow() - top);
        regions.add(dst);
      } else if (src.getFirstRow() < top && src.getLastRow() >= top)
        throw new IllegalArgumentException(
            "Illegal region {top:"
                + top
                + ", height:"
                + height
                + "} bounds: conflict with region {top:"
                + src.getFirstRow()
                + ", bottom:"
                + src.getLastRow()
                + "}");
      if (src.getFirstRow() >= top && src.getFirstRow() <= bottom && src.getLastRow() > bottom)
        throw new IllegalArgumentException(
            "Illegal region {top:"
                + top
                + ", height:"
                + height
                + "} bounds: conflict with region {top:"
                + src.getFirstRow()
                + ", bottom:"
                + src.getLastRow()
                + "}");
    }

    this.hidden = false;
  }