Если это XSSFSheet
, то XSSFSheet.lockAutoFilter (false) и XSSFSheet.lockSort (false) установит свойства для включения автоматической фильтрации и сортировки в защищенном листы.
Конечно, сам фильтр должен быть установлен перед защитой листа. Настройка lockAutoFilter(false)
позволяет только использовать автофильтр в защищенных листах.
И для использования сортировки должен быть установлен диапазон, который разрешен для редактирования пользователями. Это связано с тем, что при сортировке значения ячеек будут изменены, поскольку при сортировке содержимое строк и, следовательно, всех ячеек в этих строках, вероятно, должно быть заменено.
В Excel
GUI это делается через Review tab
-> Allow Users to Edit Ranges
. в apache poi
мы должны добавить CTProtectedRange к CTWorksheet .
Обратите внимание, что для использования CTProtectedRange
требуется полный jar всех схем ooxml-schemas-1.3.jar
, как указано в faq-N10025 .
Полный пример:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTProtectedRange;
import java.util.Arrays;
public class CreateExcelXSSFProtectedSheetAllowFilteringAndSorting {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
Row row;
Cell cell;
row = sheet.createRow(0);
for (int c = 0 ; c < 4; c++) {
cell = row.createCell(c);
cell.setCellValue("Field " + (c+1));
}
for (int r = 1; r < 10; r++) {
row = sheet.createRow(r);
for (int c = 0 ; c < 4; c++) {
cell = row.createCell(c);
cell.setCellValue("Data R" + (r+1) + "C" + (c+1));
}
}
sheet.setAutoFilter(CellRangeAddress.valueOf("A1:D10"));
((XSSFSheet)sheet).lockAutoFilter(false);
CTProtectedRange protectedRange = ((XSSFSheet)sheet).getCTWorksheet()
.addNewProtectedRanges()
.addNewProtectedRange();
protectedRange.setName("enableSorting");
protectedRange.setSqref(Arrays.asList(new String[]{"A1:D10"}));
((XSSFSheet)sheet).lockSort(false);
sheet.protectSheet("");
for (int c = 0 ; c < 4; c++) {
sheet.autoSizeColumn(c);
}
FileOutputStream out = new FileOutputStream("CreateExcelXSSFProtectedSheetAllowFilteringAndSorting.xlsx");
workbook.write(out);
out.close();
workbook.close();
}
}