XSSFSheet Apache POI - можно ли заблокировать все, кроме разрешения обновления и вставки строк?

Я пытаюсь заблокировать весь лист, но некоторые столбцы должны быть разблокированы (я хочу добавить значения в некоторые столбцы). Я хочу скопировать некоторую строку, добавить новую строку и вставить значения из скопированной строки. Является ли это возможным?

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

Мой сгенерированный лист работает отлично, за исключением одной маленькой детали - я не могу вставить новую строку и скопировать в нее другую строку...

Я думаю, что перепробовал все решения из Stack Overflow...

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 387
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать методы XSSFSheet вместо низкоуровневых CTSheetProtection методов для указания защиты листа. В текущем apache poi 4.1.2 есть все возможности, которые также можно использовать с помощью XSSFSheet.lock...-методов.

Но то, что вы хотите, не совсем возможно. Листовая защита в основном защищает клетки от изменения. Таким образом, если вы разрешаете удаление строк, а строка содержит защищенные ячейки, то удаление строки противоречит защите ячеек. То же самое для копирования строки в другую. Если эта другая строка содержит защищенные ячейки, то копирование также противоречит защите ячеек.

В следующем полном примере создается рабочая книга с одним листом, в котором все ячейки защищены, кроме столбцов A, C и E. Защита листа позволяет форматировать строки, вставлять строки и удалять строки. Но удаление строк противоречит защите всех ячеек в этой строке, кроме ячеек в столбцах A, C и E. Таким образом, удаление строк разрешено, но невозможно.

Таким образом, полученный лист позволяет изменять только ячейки в столбцах A, C и E, форматировать строки (высоту строки) и вставлять строки.

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

public class CreateExcelXSSFProtectedSheet {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();
  CellStyle notLocked = workbook.createCellStyle();
  notLocked.setLocked(false);

  Sheet sheet = workbook.createSheet();

  sheet.setDefaultColumnStyle(0, notLocked); // column A is not locked
  sheet.setDefaultColumnStyle(2, notLocked); // column C is not locked
  sheet.setDefaultColumnStyle(4, notLocked); // column E is not locked

  ((XSSFSheet)sheet).lockFormatRows(false); // formatting rows is allowed
  ((XSSFSheet)sheet).lockInsertRows(false); // inserting rows is allowed
  ((XSSFSheet)sheet).lockDeleteRows(false); // deleting rows is allowed but may contradict cell protection

  sheet.protectSheet("");

  FileOutputStream out = new FileOutputStream("CreateExcelXSSFProtectedSheet.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

 }

}

Итак, я могу добавлять новые строки, но я не могу копировать существующие строки во вновь созданные строки... Я даже не могу копировать значения из заблокированных столбцов... Но если это невозможно сделать, тогда ОК :) Спасибо за ваше отвечать:)

Matley 11.12.2020 12:04

Другие вопросы по теме