Excel Corrput из-за создания выпадающего списка с библиотекой apache -poi - PullRequest
0 голосов
/ 06 марта 2020

Нужно описание

Мне нужно создать выпадающий список в Excel с Apache POI. Этот список должен содержать строки.

Код

XSSFSheet sheet = workbook.getSheet(fieldName.getTabName());
XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) helper.createExplicitListConstraint(myarray);
CellRangeAddressList addressList = new CellRangeAddressList(3, 10, 5, 5);
XSSFDataValidation validation = (XSSFDataValidation) helper.createValidation(dvConstraint, addressList);
validation.setEmptyCellAllowed(false);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);

Ошибка

Для некоторого контента он работает нормально. Но если массив myarray содержит некоторые значения, такие как STUDENT или HOUSE, DEF, я получаю сообщение об ошибке при открытии Excel:

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

Дополнительная информация

my array - List<WebElement>. Я получил этот список с:

Select select = new Select(By.xpath("myxpath"));
List<WebElement> opt = select.getOptions();
myarray = new String[opt.size()];
for(int i = 0; i < opt.size(); i++) 
    myarray[i] = opt.get(i).getText();

Но я думаю, что этот код не проблема, потому что я могу получить все параметры с соответствующим текстом. Когда я помещаю это содержимое в createExplicitListConstraint, происходит что-то странное.

Когда я печатаю содержимое myarray, все значения правильно отображаются в консоли.

1 Ответ

2 голосов
/ 06 марта 2020

Существует ограничение длины формулы для явных списков проверки данных. Максимальная длина - 255. Если формулы списков явной проверки данных превышают длину 255, то Excel завершается неудачно при открытии с ошибкой We found a problem with some content in .... Если вы нажмете Yes, Excel сообщит вам, что отремонтировал /xl/worksheet/sheet*.xml деталь. После этого список проверки данных не работает.

Пример для воспроизведения:

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

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

  int arrSize = 50;
  String[] myarray = new String[arrSize+1];

  for (int i = 0; i < arrSize; i++) {
   myarray[i] = "abcd";
  }

  myarray[arrSize] = "abcde"; // this works
  //myarray[arrSize] = "abcdef"; // this fails

  String arrayFormula = String.join(",", myarray);
System.out.println(arrayFormula.length()); // up to 255 works, bigger lengths fail

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

  Sheet sheet = workbook.createSheet();

  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  CellRangeAddressList addressList = new CellRangeAddressList(3, 10, 5, 5);
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(myarray);

  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  validation.setEmptyCellAllowed(false);
  if (workbook instanceof XSSFWorkbook) validation.setShowErrorBox(true);

  sheet.addValidationData(validation);

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

 }
}

Единственным решением будет использование элементов списка в ячейках отдельного листа и использование createFormulaListConstraint вместо createExplicitListConstraint тогда. Я показал это здесь: Apache Двойные значения POI в ComboBox .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...