2011-12-28 48 views
11

Estoy tratando de generar un archivo de Excel con algunas validaciones, he leído el poi dev guides para implementarlo. Durante la implementación, recibí una excepción (String literals in formulas can't be bigger than 255 characters ASCII). POI concatena todas las opciones desplegables en cadena '0' delimitada y verifica su longitud y me da una excepción. :(
Estoy usando la última versión del POI 3.8 beta 5.
Y mi código es:Limitación al generar lista desplegable de Excel con 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(); 
    } 

Después de que he tratado con XSSFWorkBook con este código:

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

Desafortunadamente, no hay éxito con ese resultado, que es una coma delimenated cadena larga en una celda:

enter image description here

Pero manualmente en excel, puedo crear celdas desplegables con esta larga lista de países.
¿Hay alguna forma de generar el menú desplegable con cadenas largas, o la API no es compatible?

+0

suena como un insecto/limitación de la implementación de POI, tal vez debería informar esto como un error en http://poi.apache.org/ – centic

Respuesta

26

Lo entendí, el propio Excel no permite la introducción de cadenas de rango de validación de más de 255 caracteres, esto no era una limitación de POI. Y ahora estoy usando Named Ranges and Named Cells y está funcionando correctamente para mí. Así que tuve que poner mis tokens de rango de validación en otra hoja (hecho oculto) y me referí a los rangos de celdas deseadas de mi hoja de verdad. Aquí está mi código de trabajo:

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

Gran respuesta. Tuve que usar "hidden! $ A $ 1: $ A $" + countryName.length para que las restricciones funcionaran. –

+0

Hola, también estoy enfrentando el mismo problema. ¿Puede por favor proporcionarme el archivo Excel de salida usando este código? para que pueda comprender mejor cómo funcionará y ejecutar el mismo. Gracias. – Herin

+0

Hola Herin, desafortunadamente trabajé en ese proyecto hace mucho tiempo y ahora no tengo resultados de muestra ... Pero aquí, lo que estoy haciendo es: crear un archivo de Excel con 2 hojas: la 1ra es la hoja actual que el usuario ver, el otro está oculto utilizado para validar la hoja real. Y luego, crear una lista de celdas en el ciclo de hoja oculta, que se usa para la validación en la lista real. Por lo tanto, si coloca una matriz de cadenas 'countryName' al principio del código, debe generar un archivo de Excel que tenga una lista desplegable con las cadenas de la matriz de cadenas 'countryName'. –

2

El código anterior funciona bien. Pero si uso clases XSSF en lugar de HSSF, se produce un error diciendo Excepción en hilo

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

Para crear la lista desplegable utilizando interfaces XSSF me dio la solución a

create dropdown list using apache poi XSSF interfaces

Cuestiones relacionadas