viernes, 29 de octubre de 2010

[Java] Excepciones: Unable to construct record instance



Sentí la necesidad de publicar ésta excepción porque no encontré ayuda de utilidad en internet, apenas en inglés, tampoco en español; inclusive, al buscar el error, los primeros links de los resultados sólo llevan a foros, donde otro usuario pide ayuda respecto al mismo problema, sin una respuesta puntual o certero.


Al trabajar reportes en Java con plantillas de archivos Excel (MS Office, Open Office, Libre Office, etc) ubicadas en memoria no volátil (entiéndase, un disco de almacenamiento); se corre el riesgo de que el archivo esté corrupto; o se corrompa en el proceso de creación.

El error -aparentemente sin sentido- que apareció fue:
ex.getMessage(): Unable to construct record instance.
(Mensaje: No se puede construir instancia de registro)

ex.getCause(): org.apache.poi.hssf.record.RecordFormatException: HSSF does not currently support encrypted workbooks.
(HSSF no es compatible con "libros" cifrados)

ex.getClass(): class org.apache.poi.hssf.record.RecordFormatException.
(Clase: RecordFormatException)
Y la línea de código que lanzó la excepción fue:
Workbook wb = new HSSFWorkbook(inp);
Como son reportes sobre plantillas de excel, ya se tiene un patrón de programación, librerías para interactuar con excel ya agregadas, y varía básicamente la agrupación, manipulación, lectura y muestra de los datos.

Y si bajo ese patrón que siempre ha funcionado, algo empieza a fallar, no es problema del código ni del JDK ni del IDE de Java ni del programador;  es problema externo. Ahora... cómo identificarlo?


Aquí una captura de pantalla:
El entorno de programación es Oracle JDeveloper.
La imagen muestra la línea de código (seleccionada) dónde se produce el error;
Y en la parte inferior, muestra el mensaje, la causa, y la clase de la excepción.
La solución fue sencillísima (para mi caso).
Copié la hoja del libro excel (de la plantilla) en un nuevo archivo. (Lo considero sencillo, porque en el peor de los casos, tendría que volver a crear la plantilla, diseño y distribución de filas, etc)

La causa del error: El PC se quedó encendido, con la plantilla abierta; a pesar de haber guardado los cambios, al ser apagada "a la fuerza" se semi-malogró el archivo;
Al reiniciar, se podía visualizar desde Office (gracias a la recuperación de archivos que no se cerraron correctamente, del mismo Office), pero ya no podía accederse a él desde java, lanzando dicha excepción.

Fuente:
Imágenes en tumblr.

Recibe en tu correo electrónico las últimas actualizaciones de este blog:
Ingrese su e-mail:
  (y no olvide confirmar su suscripción)
También me encuentras en facebook.
También en twitter.
 También en tumblr.

1 comentario:

  1. Mi problema fue parecido, lo que ocurrió es que al sincronizar y subir los cambios de mi plantilla XLS al repositorio de Subversión este proceso corrompió el fichero y ya no lo podía utilizar. Solución: borrar el fichero desde el repositorio, crear un nuevo fichero XLS, copiar la plantilla a este y luego subirlo otra vez al SVN.

    Conclusión: siempre hay que subir al SVN un nuevo fichero XLS.

    Douglas

    ResponderEliminar