Nap*_*ook 1 java excel apache-poi
我创建了一个包含受保护工作表的工作簿,因为我只需要极少数可编辑的列。虽然我想让用户能够对列进行排序和过滤。
谷歌搜索到目前为止还没有成功。任何形式的帮助将不胜感激。
如果它是XSSFSheet,则XSSFSheet.lockAutoFilter(false)和XSSFSheet.lockSort(false)将设置用于在受保护工作表中启用自动过滤和排序的属性。
当然,在保护纸张之前必须先设置自动过滤器本身。该设置lockAutoFilter(false)仅允许在受保护的工作表中使用自动过滤器。
为了使用排序,必须设置一个可供用户编辑的范围。这是因为在排序时,单元格值将发生更改,因为在排序时可能必须交换行以及该行中所有单元格的内容。
在ExcelGUI 中,这是通过Review tab->完成的Allow Users to Edit Ranges。apache 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)