java - 如果长度为 0,createTextLengthConstraint 不起作用?

标签 java apache-poi

我想在单元格为空时显示错误消息。

所以,我写道:

XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) helper.createTextLengthConstraint(OperatorType.GREATER_THAN, "0", "1000"); // 1000 for unlimited
CellRangeAddressList addressList = new CellRangeAddressList(3, 12, cellIndex, cellIndex);
XSSFDataValidation validation = (XSSFDataValidation) helper.createValidation(dvConstraint, addressList);
validation.createErrorBox("Error", "it is empty");
validation.setShowErrorBox(true);
sheet.addValidationData(validation);

但是,如果我将单元格留空,则不会显示错误消息。正常吗?

谢谢。

最佳答案

使用 Excel 的数据验证无法禁止空单元格。未选中的忽略空白复选框集仅防止现有单元格从任何值更改为空值。但是,在 Excel 中选择一个单元格,然后按 Del 会删除整个单元格,而不仅仅是清空单元格值。但数据验证不适用于尚不存在的单元格。因此,仅当用户在编辑栏或单元格编辑模式下删除单元格内容而不是通过按 Del 删除整个单元格时,才会出现错误消息。我认为这是 Excel 数据验证的不足。但这不是 apache poi 可以治愈的。数据验证在 Excel 的 GUI 中运行,并且 apache poi 不与 Excel 的 GUI 交互。

可以做的是使用自定义数据验证约束来防止当前单元格上方出现空单元格。例如,如果需要连续填充A列,则以下公式将检查:

=COUNTIF($A$1:$A1,"")=0

A1 开始,它检查上面是否有任何空 ("") 单元格。如果是这样,则 COUNTIF 不会产生 0。由于$A1中的行号不固定,因此第2行为$A2,第3行为$A3,依此类推。

因此,如果当前单元格上方有任何空单元格,则自定义数据验证约束中使用的公式会导致错误消息。

完整示例:

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 CreateExcelDataValidationPreventEmptyCells {

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

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

  Sheet sheet = workbook.createSheet();

  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  CellRangeAddressList addressList = new CellRangeAddressList(0, 10, 0, 0);
  DataValidationConstraint dvConstraint = dvHelper.createCustomConstraint("COUNTIF($A$1:$A1,\"\")=0");

  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  validation.setEmptyCellAllowed(false);
  validation.createPromptBox("Prompt", "Please let no cells empty above that cell.");
  validation.createErrorBox("Error", "There are empty cells above that cell. Please fill.");
  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("CreateExcelDataValidationPreventEmptyCells.xls");
  } else if (workbook instanceof XSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationPreventEmptyCells.xlsx");
  }
  workbook.write(out);
  workbook.close();
  out.close();

 }
}

关于java - 如果长度为 0,createTextLengthConstraint 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60492381/

相关文章:

java - 使用 Apache-POI 创建的 Excelsheet 没有标题

java - 使用 Apache POI 获取/修改一个或多个 Excel 工作表中的单元格值

java - 使用 Apache POI API 读取 "java.lang.ArrayIndexOutOfBoundsException"文件时获取 ".doc"

java - 在 AWS Lambda 上解析 Excel 文档

java - 如何在 Apache POI 中格式化 XWPFTable 中的文本

java - 从 HttpServletRequest 中提取上下文路径和其他 URL 信息

java - 如何使用Nio2读取大文件

java - 如何在 Spring-Boot 中注册启用 "async-supported"的 servlet?

java - @InjectMocks @Autowired 在一起问题

java - 在 Java 中执行计算给出了完全错误的答案