Подтвердить что ты не робот

Настройка фильтра на заголовках листа Excel через POI

Я создаю лист, довольно стандартные заголовки и столбцы данных.

Я хочу включить функцию "Фильтр" для листа, чтобы пользователь мог легко сортировать и фильтровать данные.

Могу ли я так использовать POI?

4b9b3361

Ответ 1

Сохраните первую и последнюю ячейки из области фильтра и выполните:

sheet.setAutoFilter(new CellRangeAddress(firstCell.getRow(), lastCell.getRow(), firstCell.getCol(), lastCell.getCol()));

Например, из приведенного ниже листа.

>x         (x, y)
  0123456  
0|--hhh--|   h = header
1|--+++--|   + = values
2|--+++--|   - = empty fields
3|--+++--|
4|-------|

первая ячейка будет заголовком над первой ячейкой + (2,1). Последней будет последняя ячейка + (5,3)

Ответ 2

Если вы также хотите программно установить фильтр, вы можете использовать следующее:

void setAutoFilter(final XSSFSheet sheet, final int column, final String value) {
    sheet.setAutoFilter(CellRangeAddress.valueOf("A1:Z1"));

    final CTAutoFilter sheetFilter = sheet.getCTWorksheet().getAutoFilter();
    final CTFilterColumn filterColumn = sheetFilter.addNewFilterColumn();
    filterColumn.setColId(column);
    final CTFilter filter = filterColumn.addNewFilters().insertNewFilter(0);
    filter.setVal(value);

    // We have to apply the filter ourselves by hiding the rows: 
    for (final Row row : sheet) {
        for (final Cell c : row) {
            if (c.getColumnIndex() == column && !c.getStringCellValue().equals(value)) {
                final XSSFRow r1 = (XSSFRow) c.getRow();
                if (r1.getRowNum() != 0) { // skip header
                    r1.getCTRow().setHidden(true);
                }
            }
        }
    }
}

Соответствующие зависимости Gradle:

    // https://mvnrepository.com/artifact/org.apache.poi/poi
compile group: 'org.apache.poi', name: 'poi', version: '3.9'

// https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.9'

// https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas
compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '3.9'

// https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas
compile group: 'org.apache.poi', name: 'ooxml-schemas', version: '1.3'

Ответ 3

Я понял, как это сделать с NPOI.
Вы добавляете CT_AutoFilter в CT_Table.

Я предполагаю, что он работает одинаково для POI как NPOI.

    cttable.autoFilter = new CT_AutoFilter();
    [email protected] = "A1:C5";   // value is data and includes header.