Подтвердить что ты не робот

Ограничение при создании выпадающего списка excel с помощью Apache POI

Я пытаюсь создать файл excel с некоторыми валидациями, я прочитал руководства poi dev для его реализации. Во время реализации я получил исключение (String literals in formulas can't be bigger than 255 characters ASCII). POI объединяет все раскрывающиеся опции в строку с разделителями "0" и проверяет ее длину и дает мне исключение.:(
Я использую последнюю версию POI 3.8 beta 5.
И мой код:

try {
    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("new sheet");
    HSSFRow row = sheet.createRow((short) 0);
    //CellRangeAddressList from org.apache.poi.ss.util package
    CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);
    DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(getCountries());
    DataValidation dataValidation = new HSSFDataValidation(addressList, dvConstraint);
    dataValidation.setSuppressDropDownArrow(false);
    sheet.addValidationData(dataValidation);
    FileOutputStream fileOut = new FileOutputStream("c:\\test.xls");
    wb.write(fileOut);
    fileOut.close();
    } catch (IOException e) {
       e.printStackTrace();
  }

После этого я пробовал с XSSFWorkBook с этим кодом:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("new sheet");
DataValidationHelper validationHelper = new XSSFDataValidationHelper(sheet);
DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(getCountries());
CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);
DataValidation dataValidation = validationHelper.createValidation(constraint, addressList);
dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
dataValidation.setSuppressDropDownArrow(true);
sheet.addValidationData(dataValidation);
FileOutputStream fileOut = new FileOutputStream("c:\\test.xlsx");

К сожалению, никакого успеха с таким результатом, который является запятой, обозначается длинной строкой в ​​одной ячейке:

enter image description here

Но вручную в excel я могу создавать выпадающие ячейки с этим длинным списком стран.
Есть ли способ генерировать выпадающее меню с длинными строками или API не поддерживает?

4b9b3361

Ответ 1

Я понял, что сам Excel не позволяет вводить строку диапазона проверки более 255 символов, это не ограничение POI. И теперь я использую Named Ranges и Named Cells, и он работает правильно для меня. Поэтому мне пришлось помещать маркеры диапазона проверки на другом листе (скрытые), и я ссылался на нужные диапазоны ячеек от моего реального листа. Вот мой рабочий код:

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet realSheet = workbook.createSheet("Sheet xls");
HSSFSheet hidden = workbook.createSheet("hidden");
for (int i = 0, length= countryName.length; i < length; i++) {
   String name = countryName[i];
   HSSFRow row = hidden.createRow(i);
   HSSFCell cell = row.createCell(0);
   cell.setCellValue(name);
 }
 Name namedCell = workbook.createName();
 namedCell.setNameName("hidden");
 namedCell.setRefersToFormula("hidden!$A$1:$A$" + countryName.length);
 DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
 CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);
 HSSFDataValidation validation = new HSSFDataValidation(addressList, constraint);
 workbook.setSheetHidden(1, true);
 realSheet.addValidationData(validation);
 FileOutputStream stream = new FileOutputStream("c:\\range.xls");
 workbook.write(stream);
 stream.close();

Ответ 2

Над кодом работает отлично. Но если я использую классы XSSF вместо HSSF, он не говорит об исключении в потоке

"main" java.lang.NoSuchMethodError: org.apache.poi.ss.formula.FormulaParser.parse(Ljava/lang/String;Lorg/apache/poi/‌​ss/formula/FormulaParsingWorkbook;II)[Lorg/apache/poi/ss/formula/ptg/Ptg; at org.apache.poi.xssf.usermodel.XSSFName.setRefersToFormula(XSSFName.java:195) at XLDropdown.main(XLDropdown.java:35)

Чтобы создать раскрывающийся список с использованием интерфейсов XSSF, я получил решение

создать раскрывающийся список с использованием apache poi XSSF-интерфейсов