2011-12-28 13 views
11

Próbuję wygenerować plik excela z pewnymi sprawdzeniami, przeczytałem poi dev guides, aby go wdrożyć. Podczas wdrażania otrzymałem wyjątek (String literals in formulas can't be bigger than 255 characters ASCII). POI łączy wszystkie rozwijane opcje w łańcuch deliminated '0' i sprawdza jego długość i daje mi wyjątek. :(
Używam najnowszej wersji 3.8 beta POI 5.
A mój kod jest:Ograniczenia podczas generowania rozwijanej listy programu Excel za pomocą Apache POI

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

Potem próbowałem z XSSFWorkBook z tym kodem:

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"); 

Niestety, nie sukces z takim wyniku, który jest przecinek delimenated długi ciąg w jednej komórce:

enter image description here

Ale ręcznie w programie Excel, mogę utworzyć rozwijane komórki z tej długiej listy krajów.
Czy istnieje sposób generowania rozwijania z długimi ciągami lub API nie obsługuje?

+0

brzmi jak bug/ograniczenie w implementacja POI, może powinieneś raczej zgłosić to jako błąd na http://poi.apache.org/ – centic

Odpowiedz

26

Rozumiałem, sam Excel nie pozwala na wprowadzenie łańcucha wartości sprawdzania więcej niż 255 znaków, to nie było ograniczenie POI. A teraz używam Named Ranges and Named Cells i działa to poprawnie dla mnie. Musiałem więc umieścić moje żetony zakresu walidacji w innym arkuszu (ukrytym) i odniosłem się do pożądanych zakresów komórek z mojego prawdziwego arkusza. Oto mój działający kod:

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

Świetna odpowiedź. Musiałem użyć opcji "ukryte! $ A 1: $ A $" + countryName.length, aby ograniczenia działały. –

+0

Witam, mam również ten sam problem. Czy możesz podać mi wyjściowy plik Excela, używając tego kodu? aby lepiej zrozumieć, jak to będzie działać i wykonać to samo. Dzięki. – Herin

+0

Cześć Herin, niestety pracowałem nad tym projektem dawno temu i nie mam teraz przykładowego wyjścia ... Ale tutaj, co robię, to: tworzenie pliku Excela z 2 arkuszami: 1. to rzeczywisty arkusz, który użytkownik będzie zobacz, drugi jest ukryty używany do sprawdzania autentyczności arkusza. A następnie, tworząc listę komórek w pętli dla ukrytego arkusza, który jest używany do sprawdzania poprawności na rzeczywistej liście. Tak więc, jeśli umieścisz tablicę "countryName" na początku kodu, powinna ona wytworzyć plik Excela, który ma listę rozwijaną z ciągami z tablicy "countryName". –

2

Powyższy kod działa prawidłowo. Ale jeśli mogę użyć klas XSSF zamiast HSSF, to nie mówią wyjątek w wątku

"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) 

Aby stworzyć rozwijaną listę z wykorzystaniem interfejsów XSSF mam rozwiązanie na

create dropdown list using apache poi XSSF interfaces

Powiązane problemy