web-dev-qa-db-fra.com

Définition du filtre sur les en-têtes d'une feuille Excel via un point d'intérêt

Je génère une feuille, de jolis en-têtes standard et des colonnes de données.

Je souhaite activer la fonction "Filtrer" de la feuille afin que l'utilisateur puisse facilement trier et filtrer les données. 

Puis-je si cela en utilisant POI?

24
Anders Johansen

Enregistrez la première et la dernière cellule de la zone de filtre et exécutez: 

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

Par exemple, à partir de la feuille ci-dessous.

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

la première cellule sera l'en-tête au-dessus de la première + (2,1) cellule. La dernière sera la dernière cellule + (5,3)

47
Victor

J'ai compris comment faire cela avec NPOI.
Vous ajoutez un CT_AutoFilter à la CT_Table.

Je suppose que cela fonctionne de la même manière pour les POI que pour NPOI.

    cttable.autoFilter = new CT_AutoFilter();
    cttable.autoFilter.@ref = "A1:C5";   // value is data and includes header.
0
Mark Holden

Si vous souhaitez également définir un filtre par programme, vous pouvez utiliser les éléments suivants:

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);
                }
            }
        }
    }
}

Dépendances pertinentes de 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'
0
Dennie

le moyen le plus simple d’ajouter un filtre sur l’en-tête:

sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, numColumns));
sheet.createFreezePane(0, 1);
0
Tiago Medici

Utilisez sheet.setAutoFilter(CellRangeAddress.valueOf("B1:H1")); 

Nous devons spécifier uniquement les cellules d'en-tête des données tabulaires. Ici, dans mon exemple, l'en-tête commence à la cellule B1 et se termine à la cellule H1 .
Excel trouvera automatiquement les données en dessous et les affichera dans les options de filtrage.

0
Syam Kumar S