2011-12-28 111 views
11

我試圖用一些驗證生成excel文件,我已閱讀poi dev guides來實現它。在實施過程中,我遇到了一個例外(String literals in formulas can't be bigger than 255 characters ASCII)。 POI將所有下拉選項連接到'0'分隔字符串並檢查其長度並給予例外。 :(
我使用的是最新版本的POI 3.8測試版5.
我的代碼是:使用Apache POI生成excel下拉列表時的限制

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

但在Excel中手動,我可以創建這個長的國家名單下拉單元格。
有沒有什麼辦法用長字符串生成下拉菜單,或者API不支持?

+0

聽起來像一個bug /限制在POI實現,也許你應該寧願在http://poi.apache.org/ – centic 2011-12-28 13:26:47

回答

26

我明白了,Excel本身不允許輸入超過255個字符的驗證範圍字符串,這不是POI限制。現在我正在使用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

上報告這個bug。很好的答案。我不得不使用「隱藏!$ A $ 1:$ A $」+ countryName.length來獲取約束條件。 – 2012-08-22 12:59:07

+0

你好,我也面臨同樣的問題。你能用這個代碼給我提供輸出excel文件嗎?以便我可以更好地瞭解它將如何工作並執行相同的操作。 謝謝。 – Herin 2016-04-14 09:09:52

+0

嗨赫林,不幸的是我很久以前在這個項目上工作,我現在沒有樣本輸出......但是在這裏,我在做的是:創建一個帶有兩張紙的Excel文件:1st是實際的紙張,用戶將看,另一個隱藏用於驗證實際工作表。然後,在隱藏工作表的循環中創建一個單元列表,用於實際列表中的驗證。 因此,如果您在代碼的開頭放置'countryName'字符串數組,它應該生成一個excel文件,其中包含來自'countryName'字符串數組的字符串的下拉列表。 – 2016-04-14 15:59:31

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