Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MS Excel打开.xlsx时遇到问题,其中APACHE POI XSSFDataValidationHelper用于数字和日期验证_Java_Excel_Spring Mvc_Apache Poi_Xssf - Fatal编程技术网

Java 使用MS Excel打开.xlsx时遇到问题,其中APACHE POI XSSFDataValidationHelper用于数字和日期验证

Java 使用MS Excel打开.xlsx时遇到问题,其中APACHE POI XSSFDataValidationHelper用于数字和日期验证,java,excel,spring-mvc,apache-poi,xssf,Java,Excel,Spring Mvc,Apache Poi,Xssf,我使用ApachePOI3.17,java中的XSSFDataValidationHelper为.xlsx文件中的日期和数值等数据添加验证,但每当我使用MS Excel打开文件时,它都会显示 我们发现中的某些内容有问题。是否希望我们尽可能多地恢复该文件?如果您信任此工作簿的源,请单击“是” 当我检查这个错误时,我得到,当文件部分损坏或完全损坏时会发生这种情况 这个问题只出现在我使用了上面提到的任何类型的数据验证的那些.xlsx文件上,但是如果我在linux环境中打开这个.xlsx文件,这个问题也

我使用ApachePOI3.17,java中的XSSFDataValidationHelper为.xlsx文件中的日期和数值等数据添加验证,但每当我使用MS Excel打开文件时,它都会显示

我们发现中的某些内容有问题。是否希望我们尽可能多地恢复该文件?如果您信任此工作簿的源,请单击“是”

当我检查这个错误时,我得到,当文件部分损坏或完全损坏时会发生这种情况

这个问题只出现在我使用了上面提到的任何类型的数据验证的那些.xlsx文件上,但是如果我在linux环境中打开这个.xlsx文件,这个问题也不会发生

注:我正在结束工作簿和FileOutputStream,我已经在工作簿下创建了至少一张工作表(显然)

PFB用于数据验证的代码段:-

`XSSFDataValidationHelper dataValidationHelper = new XSSFDataValidationHelper(sheet);

        XSSFDataValidationConstraint numberValidationConstraint =
                (XSSFDataValidationConstraint)
                        dataValidationHelper.createNumericConstraint(
                                XSSFDataValidationConstraint.ValidationType.DECIMAL,
                                XSSFDataValidationConstraint.OperatorType.BETWEEN,
                                String.valueOf(Double.MIN_VALUE),
                                String.valueOf(Double.MAX_VALUE)
                        );

        CellRangeAddressList addressList = new CellRangeAddressList(
                2, 2000, columnCounter, columnCounter);
        XSSFDataValidation numberValidation =(XSSFDataValidation)dataValidationHelper.createValidation(
                numberValidationConstraint, addressList);
        numberValidation.setSuppressDropDownArrow(false);
        numberValidation.setShowErrorBox(true);
        numberValidation.createErrorBox("Invalid data","Only numbers are allowed");
        sheet.addValidationData(numberValidation);`

您不能在
Excel
数据验证中使用
Double.MIN\u值
Double.MAX\u值
<代码>Excel对数值单元格值有更严格的限制。不能将
1.7976931348623157E308
存储在
Excel
单元格中,也不能存储
4.9E-324
。在
Excel
单元格中,只能存储15位有效数字。因此,您可以存储的最小数字是
-9.9999999999 e307
,而您可以存储的最大数字是
9.9999999999 e307
。所以你必须用这些数字来限制可能的数字范围

DataValidationConstraint numberValidationConstraint = dataValidationHelper.createNumericConstraint(
 DataValidationConstraint.ValidationType.DECIMAL,
 DataValidationConstraint.OperatorType.BETWEEN,
 //String.valueOf(Double.MIN_VALUE),
 //String.valueOf(Double.MAX_VALUE)
 "-9.99999999999999E307",
 "9.99999999999999E307"
);
但我怀疑目标是只允许数值。这也可以通过使用具有公式的自定义公式约束来实现

=ISNUMBER(OFFSET($A$1,ROW()-1,COLUMN()-1))
完整示例:

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

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

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

  Sheet sheet = workbook.createSheet();

  int columnCounter = 0;
  int fromRow = 2;
  int toRow = 2000;

  DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();

/*
  DataValidationConstraint numberValidationConstraint = dataValidationHelper.createNumericConstraint(
   DataValidationConstraint.ValidationType.DECIMAL,
   DataValidationConstraint.OperatorType.BETWEEN,
   //String.valueOf(Double.MIN_VALUE),
   //String.valueOf(Double.MAX_VALUE)
   "-9.99999999999999E307",
   "9.99999999999999E307"
  );
*/

  DataValidationConstraint numberValidationConstraint = dataValidationHelper.createCustomConstraint(
   "ISNUMBER(OFFSET($A$1,ROW()-1,COLUMN()-1))"
  );

  CellRangeAddressList addressList = new CellRangeAddressList(fromRow, toRow, columnCounter, columnCounter);
  DataValidation numberValidation = dataValidationHelper.createValidation(numberValidationConstraint, addressList);
  numberValidation.setShowErrorBox(true);
  numberValidation.createErrorBox("Invalid data","Only numbers are allowed");
  sheet.addValidationData(numberValidation);

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

 }
}

感谢您指出excel单元格可以支持的数值范围,并且在不使用DataValidationConstraint numberValidationConstraint=dataValidationHelper.createCustomConstraint(“ISNUMBER(偏移量($a$1,行()-1,列()-1))的情况下,它可以从-9.999999999e307到9.999999999e307的范围正常工作。” ); 由于它也显示了不必要的有效数字验证错误框,再次感谢您的帮助。