Раскрывающийся список подтверждения данных - Как запретить пустое значение? - PullRequest
1 голос
/ 29 февраля 2020

Я создал раскрывающийся список в Excel с XSSFDataValidation.

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("test sheet");

XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) helper.createExplicitListConstraint(new String[] { "Checked", "Unchecked" });
CellRangeAddressList addressList = new CellRangeAddressList(0, 10, 0, 0);
XSSFDataValidation validation = (XSSFDataValidation)helper.createValidation(dvConstraint, addressList);
validation.setShowErrorBox(true);

sheet.addValidationData(validation);

У меня следующие вопросы:

  • Можно ли запретить пустое значение? Я имею в виду, заставить пользователя поместить значение в ячейку. Я попытался validation.setEmptyCellAllowed(false);, но все еще можно поставить пустое значение.
  • Есть другой способ определить значение по умолчанию, чем cell.setCellValue("Unchecked");?

Заранее спасибо.

1 Ответ

2 голосов
/ 29 февраля 2020

Используя списки проверки данных Excel, невозможно запретить пустые ячейки. Установленный флажок Игнорировать пустой снят, только предотвращает изменение существующей ячейки с любого значения на пустое значение. Но выбор ячейки в Excel и последующее нажатие Del удаляет всю ячейку, а не только очищает значение ячейки. Но проверка данных не работает на ячейках, которых еще нет. Так что это проблема Excel, и apache poi не может ничего с этим поделать, поскольку apache poi не может сделать то, что не может Excel.

Лучшее, что мы можем сделать, используя проверку данных Excel и использование apache poi говорит пользователям как можно чаще и чаще о том, что они должны делать. Для этого мы можем показать входное сообщение, когда ячейка выбрана в дополнение к сообщению об ошибке.

Пример:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;

class CreateExcelDataValidationList {

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

  //Workbook workbook = new HSSFWorkbook();
  Workbook workbook = new XSSFWorkbook();

  Sheet sheet = workbook.createSheet();

  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(new String[]{"Checked", "Unchecked"}) ;
  int lastRow = workbook.getSpreadsheetVersion().getLastRowIndex();
  CellRangeAddressList addressList = new CellRangeAddressList(0, 10, 0, 0);

  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  validation.setEmptyCellAllowed(false);
  validation.createPromptBox("Prompt", "Please select Cecked or Unchecked from dropdown list.");
  validation.createErrorBox("Error", "Please select Cecked or Unchecked from dropdown list.");
  if (workbook instanceof XSSFWorkbook) validation.setShowErrorBox(true);
  if (workbook instanceof XSSFWorkbook) validation.setShowPromptBox(true);
  sheet.addValidationData(validation);

  FileOutputStream out = null;
  if (workbook instanceof HSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationList.xls");
  } else if (workbook instanceof XSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationList.xlsx");
  }
  workbook.write(out);
  workbook.close();
  out.close();

 }
}

И нет, другого способа определить значение по умолчанию, кроме cell.setCellValue("Unchecked");. Это связано с тем, что в списках проверки данных Excel нет даже значения по умолчанию. При использовании списков проверки данных Excel существует только список допустимых значений. Затем этот список проверяется на предмет реальных значений ячеек. И реальные значения ячеек будут установлены с помощью Cell.setCellValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...