我想在单元格为空时显示错误消息。
所以,我写道:
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/