使用 Apache POI 在受保护的工作表中启用过滤和排序

Nap*_*ook 1 java excel apache-poi

我创建了一个包含受保护工作表的工作簿,因为我只需要极少数可编辑的列。虽然我想让用户能够对列进行排序和过滤。

谷歌搜索到目前为止还没有成功。任何形式的帮助将不胜感激。

在此输入图像描述

Axe*_*ter 5

如果它是XSSFSheet,则XSSFSheet.lockAutoFilter(false)XSSFSheet.lockSort(false)将设置用于在受保护工作表中启用自动过滤和排序的属性。

当然,在保护纸张之前必须先设置自动过滤器本身。该设置lockAutoFilter(false)仅允许在受保护的工作表中使用自动过滤器。

为了使用排序,必须设置一个可供用户编辑的范围。这是因为在排序时,单元格值将发生更改,因为在排序时可能必须交换行以及该行中所有单元格的内容。

ExcelGUI 中,这是通过Review tab->完成的Allow Users to Edit Rangesapache poi我们必须将CTProtectedRange添加到CTWorksheet中。

请注意,需要使用faq-N10025中提到的CTProtectedRange所有模式的完整 jar 。ooxml-schemas-1.3.jar

完整示例:

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

 }

}
Run Code Online (Sandbox Code Playgroud)