Spass mit Apache POI und DataValidation in Excel

Submitted 11 days ago | Updated 10 days ago

Seit vielen Jahren hat die folgende Funktion eine aufklappbare Drop-Down Liste in der als Parameter übergebenene Zelle generiert. Der Anwender klickt in die Zelle und bekommt eine scrollbare Liste zum Auswählen. Dateiformat war das alte XLS-Format.

private void createDateValidation(Cell cell) {
  CellRangeAddressList dateList = new CellRangeAddressList(cell.getRowIndex(), cell.getRowIndex(), cell.getColumnIndex(), cell.getColumnIndex());
  DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(new String[] {"One", "Two", "Three"});
  DataValidation dataValidation = new HSSFDataValidation(dateList, dvConstraint);
  dataValidation.setSuppressDropDownArrow(false); // << Old style: needs to be FALSE to show the drop down at cell click
  sheet.addValidationData(dataValidation);
}

Nun, neulich begab es sich, das uns mitgeteilt wurde, das die Firmenfirewall in Kürze für XLS-Dateien undurchlässig wird. Es bestand also Handlungsbedarf. Kann ja nicht so schwierig sein. Dachte ich. Das sieht man überall im Netz - und bis auf den Helper wäre ich da auch selbst drauf gekommen... Das Ergebnis war negativ! Die Zelle bleibt leer und es erscheint auch kein Drop-Down, wenn man hinein klickt. In Wahrheit wird die DropDown-Liste aus dem Programm heraus gefüllt und man konnte an der Dateigröße sehen, das die Werte drin stehen müssen. Was ist da los?

 

Keine Ahnung, was sich die Entwickler dabei gedacht haben, aber auf Apache-POI bin ich fündig geworden: dataValidation.setSuppressDropDownArrow(false); muss jetzt true werden.

private void createDateValidation(Cell cell) {
  CellRangeAddressList dateList = new CellRangeAddressList(cell.getRowIndex(), cell.getRowIndex(), cell.getColumnIndex(), cell.getColumnIndex());
  XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
  XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)dvHelper.createExplicitListConstraint(new String[] {"One", "Two", "Three"});
  XSSFDataValidation dataValidation = (XSSFDataValidation)dvHelper.createValidation(dvConstraint, dateList);   
  dataValidation.setSuppressDropDownArrow(true);  // << New style for XSSF/XLSX: needs to be TRUE to show the drop down at cell click
  sheet.addValidationData(dataValidation);
}

 

Voila. Es funktioniert wieder. 👍