# Preguntas M Frecuentes (FAQ)

or qula lectura de una hoja de cculo simple lleva tanto tiempo?

Probablemente hayas habilitado el registro (logging). Dicho registro es una herramienta il para la bqueda de errores (debug). Tenerlo habilitado reducirel rendimiento en un factor de al menos 100. El registro es il para comprender por quPOI no puede leer alg fichero o para el propio desarrollo de POI. Los errores importantes se lanzan como excepciones, lo cual significa que probablemente no necesites el registro (log).

ues el "eventmodel" (modelo de evento) de HSSF?

El paquete "eventmodel" de HSSF es un nuevo API para la lectura m eficiente de ficheros XML. Requiere mayor conocimiento por parte del usuario, pero reduce el consumo de memoria a una dima parte. Estbasado en el modelo de eventos AWT en combinaci con SAX. Si necesita acceso de so-lectura a un fichero XML determinado, esta es la mejor manera de hacerlo.

or quno puedo leer el documento que creutilizando Star Office 5.1?

Star Office 5.1 escribe algunos registros utilizando el viejo estdar BIFF. Esto provoca algunos problemas con POI que so soporta BIFF8.

or qurecibo una excepci cada vez que intento leer mi hoja de cculo?

Es posible que su hoja de cculo contenga alguna caractertica que no est soportada actualmente por HSSF. Por ejemplo - hojas de cculo que contengan celdas con formato RTF (rich text) no est soportadas actualmente.

oporta HSSF hojas de cculo protegidas?

Al proteger una hoja de cculo, ta se cifra. No tocaremos el cifrado, porque no tenemos el suficiente conocimiento legal y no estamos seguros de las implicaciones que conllevar el intentar implementar esto. Si desea intentarlo, es libre de hacerlo y de adirlo como un mulo enchufable (plugin). Sin embargo, no lo guardaremos aqu

o se sabe si un campo contiene una fecha con HSSF?

Excel almacena las fechas como neros. Asla ica manera para determinar si una celda estrealmente almacenada como una fecha consiste en mirar su formato. Hay un modo de ayuda (helper) en HSSFDateUtil (desde la distribuci 1.7.0-dev) que lo comprueba. Gracias a Jason Hoffman por proporcionar la soluci.

    case HSSFCell.CELL_TYPE_NUMERIC:
                      double d = cell.getNumericCellValue();
                      // test if a date!
                                 if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // format in form of M/D/YY
                        cal.setTime(HSSFDateUtil.getJavaDate(d));
                        cellText =
                          (String.valueOf(cal.get(Calendar.YEAR))).substring(2);
                        cellText = cal.get(Calendar.MONTH)+1 + "/" +
                                   cal.get(Calendar.DAY_OF_MONTH) + "/" +
                                   cellText;
                      }

Estoy intentando ver un fichero XLS enviado como flujo (stream) desde un servlet y tengo complicaciones. u es el problema?

El problema normalmente se manifiesta como un mont de caracteres basura en la pantalla. El problema persiste incluso aunque hayas configurado el tipo mime correcto.

La respuesta breve es: no dependas de IE para mostrar un fichero binario. Escribe un documento adjunto como es debido si lo envs a trav de un servlet. Toda versi de IE tiene diferentes fallos (bugs) en este sentido.

El problema en la mayor de las versiones de IE reside en que no utiliza el tipo mime de la respuesta HTTP para determinar el tipo de fichero; en su lugar utiliza la extensi del fichero en la petici. Aspodr adir un .xls a su cadena de petici. Por ejemplo: http://yourserver.com/myServelet.xls?param1=xx. Esto se consigue filmente a trav del mapeo de URL en cualquier contenedor servlet. A veces una petici como http://yourserver.com/myServelet?param1=xx&dummy=file.xls tambi funciona.

Para garantizar la correcta apertura del fichero en Excel desde IE, escribe tu fichero a un fichero temporal bajo su raiz web desde tu servlet. Env entonces una respuesta http al navegador para que haga una redirecci en el lado del cliente a tu fichero temporal. (Si haces una redirecci en el lado del servidor utilizando RequestDispatcher, tendr que adir .xls a la petici como se ha mendionado m arriba)

Date cuenta de que cuando pides un documento que se abre con un manejador externo, IE a veces realiza dos peticiones al servidor web. Asque si tu proceso generador es pesado, tiene sentido escribir a un fichero temporal, para que peticiones mtiples utilicen el fichero estico.

Nada de esto pertenece a Excel. El mismo problema ocurre cuando intentas general cualquier fichero binario dinicamente a un cliente IE. Por ejemplo, si generas ficheros pdf utilizando FOP, te encontrar con los mismos problemas.

Quiero dar formato a una celda (Data format of a cell) de una hoja excel como ###,###,###.#### o ###,###,###.0000. s posible hacer esto con POI?

HSSF no soporta todav formatos de datos personalizados, sin embargo, deber ser una facilidad razonablemente sencilla de adir y aceptaremos gustosos contribuciones en este ea.

Estos son los formatos incluidos que soporta:

http://jakarta.apache.org/poi/javadocs/javasrc/org/apache/poi/hssf/usermodel/HSSFDataFormat_java.html#HSSFDataFormat

o ado un borde alrededor de una celda unida (merged)?

Ade celdas vacs alrededor de donde las celdas hubieran estado normalmente y configura los bordes individualmente para cada celda. Probablemente mejoraremos HSSF en el futuro para facilitar este proceso.

Intentescribir valores en celdas ascomo cambiar el nombre de la hoja Excel en mi lengua nativa, pero no pude hacerlo. :(

Por defecto HSSF utiliza valores de celdas y nombres de hoja en unicode comprimido, asi que para soportar la localizaci debers utilizar Unicode. Para hacerlo debers configurarlo manualmente:

                    //
                    // para el nombre de la hoja
                    //
                    HSSFWorkbook wb = new HSSFWorkbook();
                    HSSFSheet s = wb.createSheet();
                    wb.setSheetName( 0, "SomeUnicodeName", HSSFWorkbook.ENCODING_UTF_16 );

                    //
                    // para el valor de la celda
                    //
                    HSSFRow r = s.createRow( 0 );
                    HSSFCell c = r.createCell( (short)0 );
                    c.setCellType( HSSFCell.CELL_TYPE_STRING );
                    c.setEncoding( HSSFCell.ENCODING_UTF_16 );
                    c.setCellValue( "\u0422\u0435\u0441\u0442\u043E\u0432\u0430\u044F" );

Asegate de que haces la llamada a setEncoding() antes de llamar a setCellValue(), si no, lo que le pases no serinterpretado correctamente.