2011-12-28 18 views
11

के साथ एक्सेल ड्रॉप डाउन सूची उत्पन्न करते समय सीमा कुछ मान्यताओं के साथ एक एक्सेल फ़ाइल उत्पन्न करने का प्रयास कर रहा हूं, मैंने इसे लागू करने के लिए poi dev guides पढ़ा है। कार्यान्वयन के दौरान, मुझे एक अपवाद मिला (String literals in formulas can't be bigger than 255 characters ASCII)। पीओआई सभी ड्रॉप डाउन विकल्पों को '0' डिलीमिनेटेड स्ट्रिंग में जोड़ता है और इसकी लंबाई जांचता है और मुझे अपवाद देता है। :(
मैं POI 3.8 बीटा 5.
के नवीनतम संस्करण का उपयोग कर रहा और मेरे कोड है: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(); 
    } 

है कि मैं इस कोड के साथ 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"); 

दुर्भाग्य से, नहीं इस तरह के परिणाम के साथ सफलता जो है अल्पविराम एक सेल में लंबी स्ट्रिंग delimenated:

enter image description here

लेकिन मैन्युअल रूप से एक्सेल में, मैं इस लंबी देश की सूची के साथ ड्रॉपडाउन सेल बना सकता हूं।
क्या लंबी तारों के साथ ड्रॉपडाउन उत्पन्न करने का कोई तरीका है, या एपीआई का समर्थन नहीं करता है?

+0

पर समाधान मिल गया में एक बग/सीमा की तरह लगता है पीओआई कार्यान्वयन, शायद आपको http://poi.apache.org/ – centic

उत्तर

26

मुझे समझ में आया, एक्सेल स्वयं 255 वर्णों से अधिक सत्यापन श्रेणी स्ट्रिंग दर्ज करने की अनुमति नहीं देता है, यह पीओआई सीमा नहीं थी। और अब मैं Named Ranges and 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(); 
+7

ग्रेट उत्तर पर बग के रूप में इसकी रिपोर्ट करनी चाहिए। मुझे काम करने के लिए बाधाओं को पाने के लिए "छुपा! $ ए $ 1: $ ए $" + देश नाम। लम्बाई का उपयोग करना पड़ा। –

+0

हैलो, मुझे भी एक ही समस्या का सामना करना पड़ रहा है। क्या आप कृपया मुझे इस कोड का उपयोग कर आउटपुट एक्सेल फ़ाइल प्रदान कर सकते हैं? ताकि मैं बेहतर ढंग से समझ सकूं कि यह कैसे काम करेगा और इसे निष्पादित करेगा। धन्यवाद। – Herin

+0

हाय हेरिन, दुर्भाग्य से मैंने बहुत समय पहले उस परियोजना पर काम किया था और मेरे पास अब नमूना आउटपुट नहीं है ... लेकिन यहां, मैं जो कर रहा हूं वह है: 2 शीट्स के साथ एक्सेल फ़ाइल बनाना: पहला वास्तविक शीट है जो उपयोगकर्ता देखें, दूसरा वास्तविक शीट को सत्यापित करने के लिए इस्तेमाल किया गया है। और फिर, छुपा शीट के लिए लूप में कोशिकाओं की एक सूची बनाना, जिसका उपयोग वास्तविक सूची में सत्यापन के लिए किया जाता है। तो, यदि आप कोड की शुरुआत में 'देश नाम' स्ट्रिंग सरणी डालते हैं, तो उसे एक्सेल फ़ाइल का उत्पादन करना चाहिए जिसमें 'देशनाम' स्ट्रिंग सरणी से तारों के साथ एक ड्रॉपडाउन सूची होनी चाहिए। –

2

ऊपर कोड ठीक काम करता है। लेकिन अगर मैं HSSF के बजाय XSSF कक्षाएं उपयोग करें, यह धागा में अपवाद कह विफल रहता है

"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 इंटरफेस का उपयोग कर लटकती सूची बनाने के लिए मैं

create dropdown list using apache poi XSSF interfaces