/** Пересчитывает максимальное количество колонок в областе. */ 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); } }
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++; } }
/** * Добавляет новую строку в данную область. При этом пересчитываются координаты тех регионов * которых затрагивает вставка новой строки в данной области. * * @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++; } } }
/** * Удаляет целую строки из данной области. При этом пересчитываются координаты тех регионов * которых затрагивает удаление данной области. * * @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]); }
/** * Собирает информацию о некоторой области из указанного листа шаблона 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; }