Foros del Web » Programación para mayores de 30 ;) » Java »

Problema generando excel

Estas en el tema de Problema generando excel en el foro de Java en Foros del Web. Hola buenos día, en realidad no se exactamente si este tema vaya aquí, pues estoy tratando de una mezcla de Java/PHP En esta oportunidad tengo ...
  #1 (permalink)  
Antiguo 31/08/2011, 10:06
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Problema generando excel

Hola buenos día, en realidad no se exactamente si este tema vaya aquí, pues estoy tratando de una mezcla de Java/PHP
En esta oportunidad tengo un problema a la hora de generar un excel. El escenario es el siguiente:
Tenemos una página hecha en php/MySQL y todo estaba bien hasta que nos exigieron generar unos reportes en excel desde otra base de datos que está en SQL Server 2008. El punto es que a la final un compañero sugirió realizar todos los reportes de excel con la libreria POI de java, y utilizar la librería JavaBridge para crear un puente JAVA-PHP. Aunque sonó loco todo funcionó perfecto en nuestros equipos, generamos todos los reportes que nos exigieron, y todos contentos, hasta que llegó el momento de pasarlo a producción, donde han comenzado los dolores de cabeza, pues por alguna extraña razón cuando se genera el archivo pareciera no crearse en el formato xls y cuando abre el excel lo que se ve es pura información basura.

A continuación les coloco la función en Java que genera el excel

Código:
public byte[] generarExcel {
       
        java.io.ByteArrayOutputStream memoryStream = null;
        try {
            HSSFWorkbook wb = null;
            wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet();
            HSSFRow row = null;
            row = sheet.createRow(2);
            row.createCell(1).setCellValue("HOLA MUNDO");       
            memoryStream = new java.io.ByteArrayOutputStream(); 
            wb.write(memoryStream);
            memoryStream.close();
        
        } catch (Exception ex) {
            ex.printStackTrace();
            
        } finally {
            return memoryStream.toByteArray();
        }
      
    }
El código es bastante sencillo, esto se compila y el jar creado se coloca en la carpeta de librerías del tomcat.

Luego en el PHP llamamos a esa función de la siguiente manera

Código PHP:
<?php
     
require_once("../java/Java.inc");
     
header("Content-type: application/vnd.ms-excel");
     
header("Content-Disposition: attachment; filename=archivo.xls");
     
$reporte = new java("reportes.Compras");
     echo 
java_values($reporte->generarExcel());
?>
Este codigo es bastante sencillo también. Al llamar a esa página desde navegador aparecerá una ventana para guardar o abrir el archivo. Teniendo como resultado lo siguiente un excel con la palabra "HOLA MUNDO".

Ahora bien, cuando se hace eso mismo en el servidor, antes de abrir sale un mensaje que el formato no es el correcto y muestra la siguiente info algo como esto:

"Џࡱက; Root EntryWorkbook Ӑ̇Aဂ@ \p"
Administrador Ba==h\:#8X@"ڀ1Ȁ Arial1ȀArial1ȀArial1ȀArial"$"#
HOLA MUNDO
T
El punto es que sale sin formato, y ya hemos intentado muchas cosas y la verdad no damos con una solución.
Otro punto importante es que si en lugar de generar un jar implementamos el código JAVA directamente en el php, este sin funciona


Código PHP:
<?php
require_once("../java/Java.inc");

header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=downloaded.xls");

$workbook = new java("org.apache.poi.hssf.usermodel.HSSFWorkbook");
$sheet $workbook->createSheet("new sheet");
$row $sheet->createRow(2);
$cell $row->createCell(1)->setCellValue("HOLA MUNDO");

$memoryStream = new java("java.io.ByteArrayOutputStream");
$workbook->write($memoryStream);
$memoryStream->close();
echo 
java_values($memoryStream->toByteArray());
?>
En base a esto puedo pensar que deba ser algo relacionado con el jar, pero la verdad es que no doy con la solución.
Espero que alguien pueda colaborarme con esto. De antemano muchas gracias.
Si necesitan alguna información adicional con gusto se las facilito.

Saludos
  #2 (permalink)  
Antiguo 01/09/2011, 05:31
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Problema generando excel

Deberíais verificar que las versiones de los jars de POI y sus dependencias son las mismas en desarrollo y en producción. Ese tipo de errores pueden suceder cuando se utilizan versiones diferentes.
  #3 (permalink)  
Antiguo 01/09/2011, 07:12
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema generando excel

Cita:
Iniciado por Fuzzylog Ver Mensaje
Deberíais verificar que las versiones de los jars de POI y sus dependencias son las mismas en desarrollo y en producción. Ese tipo de errores pueden suceder cuando se utilizan versiones diferentes.
Hola! gracias por tu respuesta, ya me había encargado de verificar eso y está todo igual, sin embargo sobreescribi los jars, y la falla persiste.
Por otra parte me parece curioso que si el ByteArrayOutputStream que mando a mostrar y que es lo que se descarga desde el navegador, el archivo me sale mal, pero si en el servidor ese mismo ByteArrayOutputStream lo escribo en un FileOutputStream si lo genera bien. En pocas palabras, todas las pruebas que hago me funcionan tanto en desarrollo como en producción, pero lo único que no me funciona en producción es cuando hago el "echo java_values($memoryStream->toByteArray());"

Aquí está el codigo con el que me da problemas, este es usando un objeto que yo cree y es el que me está dando problemas

Código:
<?php
     require_once("../java/Java.inc");
     header("Content-type: application/vnd.ms-excel");
     header("Content-Disposition: attachment; filename=archivo.xls");
     $reporte = new java("reportes.Compras");
     $memoryStream = new java("java.io.ByteArrayOutputStream");
     $memoryStream = $reporte->obtenerPorDiaExcel3();
     salida = new java("java.io.FileOutputStream","e:\\archivo.xls"); // aquí se genera el archivo en un directorio del server y todo va bien
     $memoryStream->writeTo($salida);
     $memoryStream->close();
     echo $reporte->obtenerPorDiaExcel3()->toByteArray(); //y esto es lo que se manda a descargar pero sale con el formato mal.
?>
y este un ejemplo, implementado de otra forma, que hace lo mismo y si funciona.
Código:
<?php
require_once("../java/Java.inc");

header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=archivo.xls");

$workbook = new java("org.apache.poi.hssf.usermodel.HSSFWorkbook");
$sheet = $workbook->createSheet("new sheet");
$row = $sheet->createRow(2);
$cell = $row->createCell(1)->setCellValue("HOLA MUNDO");

$memoryStream = new java("java.io.ByteArrayOutputStream");
$workbook->write($memoryStream);

$salida = new java("java.io.FileOutputStream","e:\\archivo.xls"); 

$memoryStream->writeTo($salida); // esta línea crea el fichero en un directorio del server y funciona bien
$memoryStream->close();
echo java_values($memoryStream->toByteArray()); //esta línea es la que me genera el archivo para descargar y en este caso si funciona
?>
Si necesitas alguna otra información adicional con gusto te la puedo suministrar.

Gracias nuevamente, saludos
  #4 (permalink)  
Antiguo 01/09/2011, 08:33
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema generando excel

Listo, el problema en realidad era una tonteria. A la final probé creando nuevamente el archivo y copiando todo menos las etiquetas <?php ?> esto lo coloque a mano, y pues ahora si funciona.
Me imagino que el problema viene por un tema de codificación del archivo. :S
Ahora solo queda repetir ese proceso muchas veces

Etiquetas: excel, jar, mysql, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:55.