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
的使用需要所有模式的完整jarooxml-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
的使用需要所有模式的完整jarooxml-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不起作用。它在受保护的工作表中保持灰色。