2017-07-14 2 views
0

Ich möchte eine ComboBox mit den folgenden entrys haben:Apache POI Doppel Werte in ComboBox

{ "0,5", "1", "1,5", "2", „2, 5" }

ich benutze Datenvalidierung:

DataValidation dataValidation = null; 
    DataValidationConstraint constraint = null; 
    DataValidationHelper validationHelper = null; 

    validationHelper = new XSSFDataValidationHelper(sheet); 
    CellRangeAddressList addressList = new CellRangeAddressList(row, row, col, col); 
    constraint = validationHelper.createExplicitListConstraint(list); 
    dataValidation = validationHelper.createValidation(constraint, addressList); 
    dataValidation.setSuppressDropDownArrow(true); 
    sheet.addValidationData(dataValidation); 

die Liste der folgenden Struktur ist:

list = new String [] { "0,5", "1", "1,5", "2", "2,5"}

Aber nach der Excel-Datei zu erzeugen, ist etwas anderes in der Dropdown-Liste.

0, 5, 1, 1, 5

Warum ist das so?

Wenn ich einen Punkt Notation (0,5, 1, 1,5) das nächste Problem ist, wenn ich von der ComboBox, Autoformat seiner auf ein Datum Excel wählen, zB 1,5 -> 01. Mai

Antwort

2

Aus Ihrer Beschreibung Es scheint, dass in Ihrem Excel das Dezimaltrennzeichen Komma von Ihren aktuellen Gebietsschemaeinstellungen ist. Dieses Komma in {"0,5", "1", "1,5", "2", "2,5"} steht in Konflikt mit dem Komma, das als Listenbegrenzer in der Listenbeschränkungsformel verwendet wird. Dies liegt daran, dass diese Listenbeschränkungsformel lautet.

Bei Verwendung {"0.5", "1", "1.5", "2", "2.5"} lautet die Listeneinschränkungsformel <formula1>"0.5,1,1.5,2,2.5"</formula1>. Aber jetzt steht der Punkt in dieser Formel in Konflikt mit Ihren Gebietsschemaeinstellungen, die ein Komma als Dezimaltrennzeichen und einen Punkt als Trennzeichen in Datumsliteralen haben.

Dies ist ein bekanntes Excel Problem. Aktuelle Excel Versionen lösen dies, indem sie eine andere Art zum Speichern der Listenbeschränkung verwenden: <x12ac:list>"0,5",1,"1,5",2,"2,5"</x12ac:list> anstelle von: <formula1>"0,5,1,1,5,2,2,5"</formula1>. Aber apache poi unterstützt dies nicht.

Als Workaround empfehle ich, ein verstecktes Blatt zu verwenden, um die Listenelemente zu speichern.

Beispiel:

import java.io.*; 

import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.xssf.usermodel.*; 

import org.apache.poi.ss.util.*; 

class CreateExcelDataValidationList { 

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

    Workbook workbook = new XSSFWorkbook(); 

    //create sheet for storing the list items: 
    Sheet sheet = workbook.createSheet("ListSheet"); 
    sheet.createRow(0).createCell(0).setCellValue("SourceList"); 
    int r = 1; 
    for (double d = 0.5; d < 3; d+=0.5) { 
    sheet.createRow(r++).createCell(0).setCellValue(d); 
    } 
    //unselect that sheet because we will hide it later 
    sheet.setSelected(false); 
    //create a named range for the list contraint 
    Name namedCell = workbook.createName(); 
    namedCell.setNameName("SourceList"); 
    String reference = "ListSheet!$A$2:$A$5"; 
    namedCell.setRefersToFormula(reference); 

    //create the visible sheet 
    sheet = workbook.createSheet("Sheet1"); 

    sheet.createRow(0).createCell(0).setCellValue("Take the ListItems from B1:"); 
    sheet.setActiveCell(new CellAddress("B1")); 

    sheet.autoSizeColumn(0); 

    //create the data validation 
    DataValidationHelper dvHelper = sheet.getDataValidationHelper(); 
    DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint("SourceList"); 
    CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 1, 1);    
    DataValidation validation = dvHelper.createValidation(dvConstraint, addressList); 

    sheet.addValidationData(validation); 

    //hide the ListSheet 
    workbook.setSheetHidden(0, true); 
    //set Sheet1 active 
    workbook.setActiveSheet(1); 

    workbook.write(new FileOutputStream("CreateExcelDataValidationList.xlsx")); 
    workbook.close(); 

} 
} 
+0

Danke, für mich gearbeitet :) – sHarivaRi