Я пытаюсь заблокировать весь лист, но некоторые столбцы должны быть разблокированы (я хочу добавить значения в некоторые столбцы). Я хочу скопировать некоторую строку, добавить новую строку и вставить значения из скопированной строки. Является ли это возможным?
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...
Вы должны использовать методы 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();
}
}
Итак, я могу добавлять новые строки, но я не могу копировать существующие строки во вновь созданные строки... Я даже не могу копировать значения из заблокированных столбцов... Но если это невозможно сделать, тогда ОК :) Спасибо за ваше отвечать:)