首页 > 解决方案 > 数据验证下拉列表 - 如何禁止空值?

问题描述

我在 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);

我的问题如下:

先感谢您。

标签: javaapache-poi

解决方案


使用Excel的数据验证列表是不可能禁止空单元格的。未选中忽略空白复选框的设置 仅可防止现有单元格从任何值更改为空值。但是选择一个单元格Excel然后按下Del会删除整个单元格,而不仅仅是清空单元格值。但是数据验证不适用于尚未存在的单元格。所以这是一个Excel问题,apache poi不能做任何事情,因为apache poi不能做Excel不能做的事情。

我们能做的最好的事情是使用 usingExcel的数据验证和使用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.


推荐阅读