需要一个不使用公式的apache POI createDateConstraint的工作示例

问题描述 投票:0回答:5

poi.apache.org网站给出了以下定义

public static DVConstraint createDateConstraint(int comparisonOperator,java.lang.String expr1,java.lang.String expr2,java.lang.String dateFormat)

我想要一个示例,其中expr1和expr2是格式化的日期值。

java excel apache-poi
5个回答
1
投票

我发现的关键是使用日期(年,月,日)功能。我还需要我的代码来处理除了标题之外的整个列,因此单元格范围是1到excel对于一个工作表的最后一行。我不确定为什么,但只是一个自己的日期似乎不起作用,因为公式自动转换为前面有一个'='符号,我认为混淆excel。

另外,错误风格和消息总是一个好主意,让人们知道他们做错了什么。

DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = dataValidationHelper.createDateConstraint(OperatorType.BETWEEN,
            "Date(1990, 1, 1)", "Date(9999, 12, 31)", "mm/dd/yyyy");
CellRangeAddressList addressList = new CellRangeAddressList(1, 1048575, 0, 0);
DataValidation validation = dataValidationHelper.createValidation(constraint, addressList);
validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
validation.createErrorBox("Invalid date", "Please Insert Valid Date");
validation.setSuppressDropDownArrow(dropDownArrow);
sheet.addValidationData(validation);

1
投票

此代码适用于我将单元格样式设置为日期并在其上添加日期验证:

Cell cel= rowx.createCell(i);
cel.setCellStyle(style);
 XSSFCreationHelper createHelper = 
 workbook.getCreationHelper();
 short dateFormat = 
 createHelper.createDataFormat().getFormat("MM/dd/yyyy");
 style.setDataFormat(dateFormat);

 DataValidationHelper dvHelper = 
 sheet.getDataValidationHelper();
 DataValidationConstraint dvConstraint = 
      dvHelper.createDateConstraint(

 org.apache.poi.ss.usermodel. 
 DataValidationConstraint.OperatorType.BETWEEN, 
            "Date(1900, 1, 1)", 
            "Date(9999, 12, 31)", 
            "MM/dd/yyyy");
 CellRangeAddressList addressList = new CellRangeAddressList(
            2, pendingRowCount, columnNumber, columnNumber);
 DataValidation validation = 
 dvHelper.createValidation(dvConstraint, addressList);
 if (validation instanceof XSSFDataValidation) {
   validation.setSuppressDropDownArrow(true);
   validation.setShowErrorBox(true);
} else {
  validation.setSuppressDropDownArrow(false);
}
sheet.addValidationData(validation);

0
投票

cunningly named TestDataValidation junit test中有一个与Apache POI一起提供的示例,它显示了使用createDateConstraint

DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = dataValidationHelper.createDateConstraint(OperatorType.EQUAL,
            "2014/10/25", null, null);
CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);
DataValidation validation = dataValidationHelper.createValidation(constraint, addressList);
sheet.addValidationData(validation);

这包括在约束上设置日期,该日期显示所需的格式


0
投票

即使问题是针对JAVA,一些像我这样的C#开发人员在Google搜索后也会访问此页面,因此,发布下面答案的C#版本。

private void AddDateTypeValidation(IWorkbook workbook, ISheet sheet, int[] regions)
    {
        int _startRow = 1, _endRow = Int16.MaxValue, // Start from first row & continue upto end of Excel.
            _startColumn = regions[0], _endColumn = regions[1]; // start column, end column

        XSSFDataValidation dataValidation;
        XSSFDataValidationConstraint dvConstraint;
        XSSFDataValidationHelper validationHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);

        XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
        dateCellStyle.SetDataFormat(HSSFDataFormat.GetBuiltinFormat("m/d/yy"));

        CellRangeAddressList _regions = new CellRangeAddressList(_startRow, _endRow, _startColumn, _endColumn);
        dvConstraint = (XSSFDataValidationConstraint)validationHelper.CreateDateConstraint(
                                                    OperatorType.BETWEEN, "Date(2000, 1, 1)", "Date(3000, 12, 31)", "m/d/yy");
        dataValidation = (XSSFDataValidation)validationHelper.CreateValidation(dvConstraint, _regions);

        dataValidation.ShowErrorBox = true;
        dataValidation.SuppressDropDownArrow = true;
        dataValidation.ErrorStyle = 0;
        dataValidation.CreateErrorBox("Invalid Input Provided", "Please enter a valid date in format 'm/d/yy'.");
        dataValidation.ShowErrorBox = true;
        dataValidation.CreatePromptBox("Date Validation", "Enter a Valid Date in format 'm/d/yy'.");
        dataValidation.ShowPromptBox = true;
        sheet.AddValidationData(dataValidation);
        sheet.SetDefaultColumnStyle(_startColumn, dateCellStyle);

        sheet.AddValidationData(dataValidation);
    }

-1
投票

我需要一个BETWEEN约束,我找不到任何有效的解决方案。最后我发现它相对简单:你应该使用第四个参数dateFormat中定义的格式提供expr1(from)和expr2(to):

dataValidationHelper.createDateConstraint(OperatorType.BETWEEN,
  "1900-01-01", "2100-10-10", "yyyy-MM-dd");
© www.soinside.com 2019 - 2024. All rights reserved.