Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache POI在受保护的工作表中启用筛选和排序_Java_Excel_Apache Poi - Fatal编程技术网

Java 使用Apache POI在受保护的工作表中启用筛选和排序

Java 使用Apache POI在受保护的工作表中启用筛选和排序,java,excel,apache-poi,Java,Excel,Apache Poi,我创建了一个带有受保护工作表的工作簿,因为我只需要极少数列作为可编辑列。尽管我想让用户能够对列进行排序和筛选 到目前为止,谷歌搜索让我失望。任何形式的帮助都将不胜感激 如果它是XSSFSheet,则和将设置在受保护的工作表中启用自动筛选和排序的属性 当然,在保护纸张之前,必须设置自动过滤器本身。设置lockAutoFilter(false)仅在受保护的工作表中启用使用自动筛选 对于使用排序,必须设置一个允许用户编辑的范围。这是因为在排序时,单元格值将发生更改,因为排序时可能必须交换行的内容以及该

我创建了一个带有受保护工作表的工作簿,因为我只需要极少数列作为可编辑列。尽管我想让用户能够对列进行排序和筛选

到目前为止,谷歌搜索让我失望。任何形式的帮助都将不胜感激


如果它是
XSSFSheet
,则和将设置在受保护的工作表中启用自动筛选和排序的属性

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

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

Excel
GUI中,这是通过
Review选项卡
->
实现的,允许用户编辑范围
。在ApachePOI中,我们必须向

注意,
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();

 }

}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.*;
导入org.apache.poi.ss.util.CellRangeAddress;
导入org.openxmlformats.schemas.spreadsheetml.x2006.main.CTProtectedRange;
导入java.util.array;
公共类CreateExcelXSSFProtectedSheetAllowFilteringAndSorting{
公共静态void main(字符串[]args)引发异常{
工作簿=新的XSSF工作簿();
工作表=工作簿.createSheet();
行行;
细胞;
行=工作表。创建行(0);
对于(int c=0;c<4;c++){
cell=row.createCell(c);
cell.setCellValue(“字段”+(c+1));
}
对于(int r=1;r<10;r++){
行=表。创建行(r);
对于(int c=0;c<4;c++){
cell=row.createCell(c);
setCellValue(“数据R”+(R+1)+“C”+(C+1));
}
}
sheet.setAutoFilter(CellRangeAddress.valueOf(“A1:D10”);
((XSSFSheet)页).lockAutoFilter(假);
CTProtectedRange protectedRange=((XSSFSheet)sheet).getctsheet()
.addNewProtectedRanges()
.addNewProtectedRange();
protectedRange.setName(“启用排序”);
protectedRange.setSqref(Arrays.asList(新字符串[]{“A1:D10”}));
((XSSFSheet)表)。锁排序(假);
第页。第页(“”);
对于(int c=0;c<4;c++){
表1.autoSizeColumn(c);
}
FileOutputStream out=新的FileOutputStream(“CreateExcelXSSFProtectedSheetAllowFilteringAndSorting.xlsx”);
练习册。写(出);
out.close();
workbook.close();
}
}

如果是
XSSFSheet
,则和将设置在受保护的工作表中启用自动筛选和排序的属性

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

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

Excel
GUI中,这是通过
Review选项卡
->
实现的,允许用户编辑范围
。在ApachePOI中,我们必须向

注意,
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();

 }

}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.*;
导入org.apache.poi.ss.util.CellRangeAddress;
导入org.openxmlformats.schemas.spreadsheetml.x2006.main.CTProtectedRange;
导入java.util.array;
公共类CreateExcelXSSFProtectedSheetAllowFilteringAndSorting{
公共静态void main(字符串[]args)引发异常{
工作簿=新的XSSF工作簿();
工作表=工作簿.createSheet();
行行;
细胞;
行=工作表。创建行(0);
对于(int c=0;c<4;c++){
cell=row.createCell(c);
cell.setCellValue(“字段”+(c+1));
}
对于(int r=1;r<10;r++){
行=表。创建行(r);
对于(int c=0;c<4;c++){
cell=row.createCell(c);
setCellValue(“数据R”+(R+1)+“C”+(C+1));
}
}
sheet.setAutoFilter(CellRangeAddress.valueOf(“A1:D10”);
((XSSFSheet)页).lockAutoFilter(假);
CTProtectedRange protectedRange=((XSSFSheet)sheet).getctsheet()
.addNewProtectedRanges()
.addNewProtectedRange();
protectedRange.setName(“启用排序”);
protectedRange.setSqref(Arrays.asList(新字符串[]{“A1:D10”}));
((XSSFSheet)表)。锁排序(假);
第页。第页(“”);
对于(int c=0;c<4;c++){
表1.autoSizeColumn(c);
}
FileOutputStream out=新的FileOutputStream(“CreateExcelXSSFProtectedSheetAllowFilteringAndSorting.xlsx”);
练习册。写(出);
out.close();
workbook.close();
}
}

取决于这是否是
XSSFSheet
。如果是
XSSFSheet
,则为and.Hi Axel。这是一张XSSF表。虽然,lockAutoFilter和lockSort不起作用。它在受保护的工作表中保持灰色。这取决于这是否是
XSSFSheet
。如果是
XSSFSheet
,则为and.Hi Axel。这是一张XSSF表。虽然,lockAutoFilter和lockSort不起作用。它在受保护的工作表中保持灰色。