我试图锁定整个工作表,但有些列应该被解锁(我想在某些列中添加值)。我想复制一些行,添加新行并粘贴复制行中的值。有可能吗?
public ByteArrayResource getQuestionnaireTemplate(List<QuestionnaireTemplateDto> questionnaireTemplateInitialData) throws IOException {
XSSFWorkbook workbook = excelExportService.createExcelWorkBook();
String frameworkName = questionnaireTemplateInitialData.stream().map(QuestionnaireTemplateDto::getFramework).findFirst().orElse("Framework Name");
XSSFSheet sheet = workbook.createSheet(frameworkName);
// sheet.lockInsertColumns(true);
// sheet.lockInsertRows(false);
sheet.enableLocking();
// sheet.lo
// CellStyle unlockedCellStyle = workbook.createCellStyle();
// unlockedCellStyle.setLocked(false);
CTSheetProtection sheetProtection = sheet.getCTWorksheet().getSheetProtection();
sheetProtection.setSelectLockedCells(false);
sheetProtection.setSelectUnlockedCells(false);
sheetProtection.setFormatCells(false);
sheetProtection.setFormatColumns(false);
sheetProtection.setFormatRows(false);
sheetProtection.setInsertColumns(false);
sheetProtection.setInsertRows(false);
sheetProtection.setInsertHyperlinks(false);
sheetProtection.setDeleteColumns(false);
sheetProtection.setDeleteRows(false);
sheetProtection.setSort(false);
sheetProtection.setAutoFilter(false);
sheetProtection.setPivotTables(false);
sheetProtection.setObjects(false);
sheetProtection.setScenarios(false);
然后对于某些行,我可以将某些单元格设置为可编辑(它可以工作):
private void addFieldRow(XSSFSheet sheet, XSSFCellStyle fieldRowStyle, QuestionnaireTemplateDto questionnaireTemplateDto) {
XSSFRow row = excelExportService.createRow(sheet,
sheet.getLastRowNum() + 1,
Arrays.asList(questionnaireTemplateDto.getFrameworkFieldId().toString(), questionnaireTemplateDto.getFramework(), questionnaireTemplateDto.getFieldName(), questionnaireTemplateDto.getYear().toString()),
fieldRowStyle);
CellStyle unlockedStyle = sheet.getWorkbook().createCellStyle();
unlockedStyle.setLocked(false);
XSSFCell cell = row.createCell(4);
cell.setCellStyle(unlockedStyle);
}
我生成的工作表完美除了一个小细节-我不能插入新行和复制其他行到它。。。
我想我试过了所有的解决方案。。。
1条答案
按热度按时间jmp7cifd1#
您应该使用xssfsheet方法而不是低级方法
CTSheetProtection
指定板材保护的方法。在当前apache poi 4.1.2
有所有的可能性也可以使用XSSFSheet.lock...
-方法。但你想要的并不是完全可能的。片状保护主要保护细胞不发生变化。因此,如果您允许删除行并且该行包含受保护的单元格,则删除该行与单元格保护相矛盾。将一行复制到另一行也是如此。如果另一行包含受保护的单元格,则复制也与单元格保护相矛盾。
下面的完整示例创建了一个工作簿,其中包含一个工作表,其中除列以外的所有单元格都受到保护
A
,C
以及E
. 工作表保护允许格式化行、插入行和删除行。但是删除行与该行中所有单元格(列中的单元格除外)的单元格保护相矛盾A
,C
以及E
. 所以删除行是允许的,但不可能。因此,生成的表只允许更改列中的单元格
A
,C
以及E
,格式化行(行高)和插入行。