2011-12-28 36 views
11

Tôi đang cố gắng tạo tệp excel có một số xác thực, tôi đã đọc poi dev guides để triển khai. Trong quá trình thực hiện, tôi có ngoại lệ (String literals in formulas can't be bigger than 255 characters ASCII). POI liên kết tất cả các tùy chọn thả xuống thành chuỗi '0' bị xóa và kiểm tra độ dài của nó và cho tôi ngoại lệ. :(
Tôi đang sử dụng phiên bản mới nhất của POI 3.8 beta 5.
Và mã của tôi là:Giới hạn khi tạo danh sách thả xuống excel với 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(); 
    } 

Sau đó tôi đã thử với XSSFWorkBook với mã này:

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

Thật không may, không có thành công với kết quả như vậy là dấu phẩy delimenated chuỗi dài trong một tế bào:

enter image description here

Nhưng thủ công trong excel, tôi có thể tạo các ô thả xuống với danh sách quốc gia dài này.
Có cách nào tạo dropdown với chuỗi dài hay API không hỗ trợ?

+0

âm thanh như một lỗi/giới hạn trong triển khai POI, có thể bạn nên báo cáo lỗi này tại http://poi.apache.org/ – centic

Trả lời

26

Tôi đã hiểu, chính Excel cũng không cho phép nhập chuỗi phạm vi xác nhận hơn 255 ký tự, đây không phải là giới hạn POI. Và bây giờ tôi đang sử dụng Named Ranges and Named Cells và nó hoạt động đúng với tôi. Vì vậy, tôi đã phải đặt mã thông báo phạm vi xác nhận của tôi trong một trang tính khác (được ẩn) và tôi đã tham chiếu phạm vi ô mong muốn từ trang tính thực của tôi. Đây là mã làm việc của tôi:

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

Câu trả lời hay. Tôi đã phải sử dụng "ẩn $ A $ 1: $ A $" + countryName.length để có được các ràng buộc để làm việc. –

+0

Xin chào, tôi cũng đang đối mặt với cùng một vấn đề. Bạn có thể vui lòng cung cấp cho tôi tệp excel đầu ra bằng cách sử dụng mã này không? để tôi có thể hiểu rõ hơn cách nó sẽ hoạt động và thực hiện như thế. Cảm ơn. – Herin

+0

Hi Herin, tiếc là tôi đã làm việc với dự án đó từ lâu rồi và bây giờ tôi không có sản phẩm mẫu ... Nhưng ở đây, những gì tôi đang làm là: tạo một tệp excel với 2 trang tính: 1 là tờ thực tế mà người dùng sẽ thấy, cái kia bị ẩn được sử dụng để xác thực tờ thực tế. Và sau đó, tạo danh sách các ô trong vòng lặp cho trang tính ẩn, được sử dụng để xác thực trong danh sách thực tế. Vì vậy, nếu bạn đặt một mảng chuỗi 'countryName' ở đầu mã, nó sẽ tạo một tệp excel có một danh sách thả xuống với các chuỗi từ mảng chuỗi 'countryName'. –

2

Mã trên hoạt động tốt. Nhưng nếu tôi sử dụng lớp XSSF thay vì HSSF, nó thất bại nói ngoại lệ trong chủ đề

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

Để tạo danh sách thả xuống bằng giao diện XSSF tôi có những giải pháp tại

create dropdown list using apache poi XSSF interfaces

Các vấn đề liên quan