Включить фильтрацию и сортировку на защищенном листе с помощью Apache POI - PullRequest
0 голосов
/ 03 мая 2018

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

Поиски Google пока не дали мне результатов. Любая помощь будет оценена.

enter image description here

1 Ответ

0 голосов
/ 05 мая 2018

Если это 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();

 }

}
...