NO TITLE

�Por qu� la lectura de una hoja de c�lculo simple lleva tanto tiempo?

Probablemente hayas habilitado el registro (logging). Dicho registro es una herramienta �til para la b�squeda de errores (debug). Tenerlo habilitado reducir� el rendimiento en un factor de al menos 100. El registro es �til para comprender por qu� POI no puede leer alg�n 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).

�Qu� es el "eventmodel" (modelo de evento) de HSSF?

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

�Por qu� no puedo leer el documento que cre� utilizando Star Office 5.1?

Star Office 5.1 escribe algunos registros utilizando el viejo est�ndar BIFF. Esto provoca algunos problemas con POI que s�lo soporta BIFF8.

�Por qu� recibo una excepci�n cada vez que intento leer mi hoja de c�lculo?

Es posible que su hoja de c�lculo contenga alguna caracter�stica que no est� soportada actualmente por HSSF. Por ejemplo - hojas de c�lculo que contengan celdas con formato RTF (rich text) no est�n soportadas actualmente.

�Soporta HSSF hojas de c�lculo protegidas?

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

�C�mo se sabe si un campo contiene una fecha con HSSF?

Excel almacena las fechas como n�meros. As� la �nica manera para determinar si una celda est� realmente almacenada como una fecha consiste en mirar su formato. Hay un m�todo de ayuda (helper) en HSSFDateUtil (desde la distribuci�n 1.7.0-dev) que lo comprueba. Gracias a Jason Hoffman por proporcionar la soluci�n.


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. �Cu�l es el problema?

El problema normalmente se manifiesta como un mont�n 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 env�as a trav�s de un servlet. Toda versi�n de IE tiene diferentes fallos (bugs) en este sentido.

El problema en la mayor�a 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�n del fichero en la petici�n. As� podr�a a�adir un .xls a su cadena de petici�n. Por ejemplo: http://yourserver.com/myServelet.xls?param1=xx. Esto se consigue f�cilmente a trav�s del mapeo de URL en cualquier contenedor servlet. A veces una petici�n como http://yourserver.com/myServelet?param1=xx&dummy=file.xls tambi�n 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�a entonces una respuesta http al navegador para que haga una redirecci�n en el lado del cliente a tu fichero temporal. (Si haces una redirecci�n en el lado del servidor utilizando RequestDispatcher, tendr�s que a�adir .xls a la petici�n como se ha mendionado m�s 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. As� que si tu proceso generador es pesado, tiene sentido escribir a un fichero temporal, para que peticiones m�ltiples utilicen el fichero est�tico.

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

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

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

Estos son los formatos incluidos que soporta:

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

�C�mo a�ado un borde alrededor de una celda unida (merged)?

A�ade celdas vac�as 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.

Intent� escribir valores en celdas as� como 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�n deber�as utilizar Unicode. Para hacerlo deber�as 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" );

            

Aseg�rate de que haces la llamada a setEncoding() antes de llamar a setCellValue(), si no, lo que le pases no ser� interpretado correctamente.

Ant LogoCocoon LogoKrysalis LogoKrysalis Centipede Logo