私はシート、かなり沼地の標準的なヘッダーとデータの列を生成します。
シートの「フィルター」機能をオンにして、ユーザーがデータを簡単にソートおよびフィルターできるようにします。
POIを使用してこれを実行できますか?
フィルター領域から最初と最後のセルを保存し、実行します。
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)
ヘッダーにフィルターを追加する最も簡単な方法:
sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, numColumns));
sheet.createFreezePane(0, 1);
NPOIでこれを行う方法を見つけました。
CT_AutoFilterをCT_Tableに追加します。
POIでもNPOIと同じように機能すると思います。
cttable.autoFilter = new CT_AutoFilter();
cttable.autoFilter.@ref = "A1:C5"; // value is data and includes header.
また、プログラムでフィルターを設定する場合は、以下を使用できます。
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'
sheet.setAutoFilter(CellRangeAddress.valueOf("B1:H1"));
を使用します
表形式データのヘッダーセルのみを指定する必要があります。ここでの例では、ヘッダーはセルB1で始まり、セルH1で終わります。
Excelはその下のデータを自動的に検出し、フィルターオプションに表示します。