Группа присутствует, если строки или столбцы имеют уровни структуры, превышающие 0. И группа свернута, если все элементы группы (строки или столбцы) скрыты.
Для строк можно определить уровень структуры и скрытый статус строк. Текущий apache poi 4.1.2
обеспечивает это методами Row.getOutlineLevel и Row.getZeroHeight . Если строка имеет уровень структуры, превышающий 0, то она принадлежит группе, имеющей этот уровень структуры. Группа начинается с наименьшей предыдущей строки с уровнем структуры, который не ниже уровня структуры этой строки. Группа заканчивается в самой большой последующей строке, имеющей уровень структуры, который не ниже уровня структуры этой строки. И если все последовательные строки между начальной строкой группы и конечной строкой группы скрыты, то вся группа скрыта и свернута.
Таким образом, мы могли бы l oop по всем строкам на листе и иметь методы, которые могут собирать информацию о группе строк из строки. В следующем коде это методы
int findStartOfRowOutlineGroup(Row row)
и
int findEndOfRowOutlineGroup(Row row)
и
boolean getIsWholeRowGroupHidden(Sheet sheet, int startOfRowOutlineGroup, int endOfRowOutlineGroup)
Для столбцов можно определить уровень структуры и скрытый статус столбцов с листа. Текущий apache poi 4.1.2
обеспечивает это методами Sheet.getColumnOutlineLevel и Sheet.isColumnHidden . Если столбец имеет уровень структуры, превышающий 0, то он принадлежит группе, имеющей этот уровень структуры. Группа начинается с самого маленького предыдущего столбца с уровнем структуры, который не ниже уровня структуры этого столбца. Группа заканчивается в самом последующем столбце с уровнем структуры, который не ниже уровня структуры этого столбца. И если все последовательные столбцы между начальным столбцом группы и конечным столбцом группы скрыты, то вся группа скрыта и свернута.
Таким образом, мы могли бы l oop по всем столбцам таблицы и иметь методы, которые могут собрать col-group-информацию с листа. В следующем коде это методы
int findStartOfColOutlineGroup(Sheet sheet, int col)
и
int findEndOfColOutlineGroup(Sheet sheet, int col)
и
boolean getIsWholeColGroupHidden(Sheet sheet, int startOfColOutlineGroup, int endOfColOutlineGroup)
Полный пример:
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
public class ExcelColumnGroupsRowGroups {
static String getRowGroupInfos(Row row) {
int outlineLevel = row.getOutlineLevel();
String result = "Row "+(row.getRowNum()+1)+" belongs to no group.";
if (outlineLevel > 0) {
int startOfRowOutlineGroup = findStartOfRowOutlineGroup(row); //0-based
int endOfRowOutlineGroup = findEndOfRowOutlineGroup(row); //0-based
boolean isRowHidden = row.getZeroHeight();
boolean isWholeGroupHidden = getIsWholeRowGroupHidden(row.getSheet(), startOfRowOutlineGroup, endOfRowOutlineGroup);
result = "Row "+(row.getRowNum()+1)+" belongs to group having outline level:"+outlineLevel+". "
+"Group starts at row "+(startOfRowOutlineGroup+1)+" and ends at row "+(endOfRowOutlineGroup+1)+". "
+"Row "+(row.getRowNum()+1)+" is "+((isRowHidden)?"hidden":"not hidden")+". "
+"Whole group is "+((isWholeGroupHidden)?"hidden":"not hidden")+". ";
}
return result;
}
static int findStartOfRowOutlineGroup(Row row) { //0-based
int outlineLevel = row.getOutlineLevel();
int r = row.getRowNum();
if (outlineLevel > 0) {
while (r >= 0) {
row = row.getSheet().getRow(r);
if (row == null) break;
int prevOutlineLevel = row.getOutlineLevel();
if (prevOutlineLevel < outlineLevel) break;
r--;
}
}
return r+1;
}
static int findEndOfRowOutlineGroup(Row row) { //0-based
int outlineLevel = row.getOutlineLevel();
int r = row.getRowNum();
if (outlineLevel > 0) {
while (r <= row.getSheet().getLastRowNum()) {
row = row.getSheet().getRow(r);
if (row == null) break;
int prevOutlineLevel = row.getOutlineLevel();
if (prevOutlineLevel < outlineLevel) break;
r++;
}
}
return r-1;
}
static boolean getIsWholeRowGroupHidden(Sheet sheet, int startOfRowOutlineGroup, int endOfRowOutlineGroup) {
boolean result = true;
Row row;
for (int r = startOfRowOutlineGroup; r <= endOfRowOutlineGroup; r++) {
row = sheet.getRow(r);
if (row == null) {
result = false;
break;
} else if (!row.getZeroHeight()) {
result = false;
break;
}
}
return result;
}
static String getColGroupInfos(Sheet sheet, int c) {
int outlineLevel = sheet.getColumnOutlineLevel(c);
String result = "Col "+(c+1)+" belongs to no group.";
if (outlineLevel > 0) {
int startOfColOutlineGroup = findStartOfColOutlineGroup(sheet, c); //0-based
int endOfColOutlineGroup = findEndOfColOutlineGroup(sheet, c); //0-based
boolean isColHidden = sheet.isColumnHidden(c);
boolean isWholeGroupHidden = getIsWholeColGroupHidden(sheet, startOfColOutlineGroup, endOfColOutlineGroup);
result = "Col "+(c+1)+" belongs to group having outline level:"+outlineLevel+". "
+"Group starts at col "+(startOfColOutlineGroup+1)+" and ends at col "+(endOfColOutlineGroup+1)+". "
+"Col "+(c+1)+" is "+((isColHidden)?"hidden":"not hidden")+". "
+"Whole group is "+((isWholeGroupHidden)?"hidden":"not hidden")+". ";
}
return result;
}
static int findStartOfColOutlineGroup(Sheet sheet, int col) { //0-based
int outlineLevel = sheet.getColumnOutlineLevel(col);
int c = col;
if (outlineLevel > 0) {
while (c >= 0) {
int prevOutlineLevel = sheet.getColumnOutlineLevel(c);
if (prevOutlineLevel < outlineLevel) break;
c--;
}
}
return c+1;
}
static int findEndOfColOutlineGroup(Sheet sheet, int col) { //0-based
int outlineLevel = sheet.getColumnOutlineLevel(col);
int c = col;
if (outlineLevel > 0) {
while (c <= sheet.getWorkbook().getSpreadsheetVersion().getLastColumnIndex()) {
int prevOutlineLevel = sheet.getColumnOutlineLevel(c);
if (prevOutlineLevel < outlineLevel) break;
c++;
}
}
return c-1;
}
static boolean getIsWholeColGroupHidden(Sheet sheet, int startOfColOutlineGroup, int endOfColOutlineGroup) {
boolean result = true;
for (int c = startOfColOutlineGroup; c <= endOfColOutlineGroup; c++) {
if (!sheet.isColumnHidden(c)) {
result = false;
break;
}
}
return result;
}
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelSheetGroupedColsAndRows.xlsx"));
//Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelSheetGroupedColsAndRows.xls"));
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
String rowGroupInfos = getRowGroupInfos(row);
System.out.println(rowGroupInfos);
}
for (int c = 0; c <= workbook.getSpreadsheetVersion().getLastColumnIndex(); c++) {
if (sheet.getColumnOutlineLevel(c) > 0) {
String colGroupInfos = getColGroupInfos(sheet, c);
System.out.println(colGroupInfos);
}
}
workbook.close();
}
}