Возникла проблема при открытии .xlsx с использованием MS-Excel, в котором APACHE POI XSSFDataValidationHelper используется для проверки чисел c и даты - PullRequest
0 голосов
/ 10 апреля 2020

Я использовал Apache POI 3.17, XSSFDataValidationHelper в java, чтобы добавить проверку для таких данных, как даты и числа c значений в файле .xlsx, но всякий раз, когда я открываю файл в MS-Excel, он показывает

«Мы обнаружили проблему с некоторым контентом в. Вы хотите, чтобы мы попытались восстановить файл столько, сколько мы можем? Если вы доверяете источнику этой книги, нажмите «Да».

Когда я проверил наличие этой ошибки, это происходит, когда файл частично поврежден или полностью поврежден.

Только эта проблема появляются в тех файлах .xlsx, где я использовал любые виды проверки данных, как я упоминал выше, но эта проблема не возникнет, если я открою этот файл .xlsx в среде linux.

PS: я закрываю workbook и 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);`

1 Ответ

1 голос
/ 10 апреля 2020

Вы не можете использовать Double.MIN_VALUE и Double.MAX_VALUE в Excel проверке данных. Excel имеет более строгие ограничения для числовых значений c. Вы не можете хранить 1.7976931348623157E308 в ячейке Excel, а также не можете хранить 4.9E-324. В ячейках Excel могут храниться только 15 значащих цифр. Таким образом, наименьшее число, которое вы можете сохранить, - -9.99999999999999E307, а самое большое число, которое вы можете сохранить, - 9.99999999999999E307. Поэтому вы должны использовать эти числа, чтобы ограничить диапазон возможных чисел.

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

Но я подозреваю, что цель состоит в том, чтобы использовать только цифры c. Это также может быть достигнуто с помощью пользовательского ограничения формулы, имеющего формулу

=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();

 }
}
...