una sistema simulador servidor programa datos cuenta con cliente banco bancario bancaria java struts2 inputstream apache-poi

sistema - JAVA: Exportar datos(de la base de datos) para sobresalir y enviarlo al lado del cliente



sistema bancario en php y mysql (2)

Bueno. Finalmente, he terminado con todos los obstáculos y he descubierto una manera de hacerlo.

Me di cuenta de que el problema al que me enfrentaba no era la creación del archivo Excel, el problema era enviarlo al lado del cliente, y eso también sin crear un archivo o archivo temporal en el servidor.

Así que aquí es cómo hacerlo (he arrancado detalles de mi código original para que pueda entenderlo fácilmente).

En el archivo de acción, primero debe crear un objeto HSSFWorkbook, poner datos en él y luego, sin guardarlo en el disco en el servidor, enviarlo al cliente usando inputstream.

Código de archivo de acción:

public String execute(){ setContentDisposition("attachment; filename=/"" + ename + ".xls/""); try{ HSSFWorkbook hwb=new HSSFWorkbook(); HSSFSheet sheet = hwb.createSheet("new sheet"); //////You can repeat this part using for or while to create multiple rows////// HSSFRow row = sheet.createRow(rowNum); row.createCell(0).setValue("col0"); row.createCell(1).setValue("col1"); row.createCell(2).setValue("col2"); row.createCell(3).setValue("col3"); . . . /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //////Now you are ready with the HSSFworkbook object to be sent to client////// /////////////////////////////////////////////////////////////////////////////// ByteArrayOutputStream baos = new ByteArrayOutputStream(); hwb.write(baos); excelStream = new ByteArrayInputStream(baos.toByteArray()); /////////////////////////////////////////////////////////////////////////////// ////Here HSSFWorkbook object is sent directly to client w/o saving on server/// /////////////////////////////////////////////////////////////////////////////// }catch(Exception e){ System.out.println(e.getMessage()); } return SUCCESS; }

Ahora, en el archivo struts-config solo escriba (tenga en cuenta que excelStream & contentDisposition se ha establecido en la acción en sí misma, también el tipo de resultado aquí es org.apache.struts2.dispatcher.StreamResult ):

<action name="actionName" class="actionClass"> <result type="stream"> <param name="contentType">"application/vnd.ms-excel"</param> <param name="inputName">excelStream</param> <param name="contentDisposition">contentDisposition</param> <param name="bufferSize">1024</param> </result> </action>

Eso es. Ahora cuando se ejecuta la acción, se le pedirá al usuario que guarde o abra el archivo.

:)

Como sugiere el título, necesito poner algunos datos (que obtuve de la base de datos) en una hoja de Excel, y luego enviarlos al lado del cliente para que el usuario pueda guardar, abrir o cancelar la acción.

He visto algunos artículos sobre esto, el más cercano es: ¿Cómo puedo hacer que el usuario descargue mi archivo? (Java, MVC, Excel, POI) . En referencia a los enlaces proporcionados por Stevens probé el siguiente código:

public String execute(){ setContentDisposition("attachment; filename=/"" + ename + "/""); try{ ServletContext servletContext = ServletActionContext.getServletContext(); String filePath = servletContext.getRealPath("/WEB-INF/template/excel/mytemplate.xls"); File file = new File(filePath); Workbook wb = WorkbookFactory.create(new FileInputStream(file)); Sheet sheet = wb.getSheetAt(0); ByteArrayOutputStream baos = new ByteArrayOutputStream(); wb.write(baos); InputStream excelStream; excelStream = new ByteArrayInputStream(baos.toByteArray()); }catch(Exception e){ System.out.println(e.getMessage()); } return SUCCESS; }

Aquí, primero, WorkbookFactory no está definido. En segundo lugar, no pude entender correctamente cómo funciona el código.

También encontré este enlace: http://www.roseindia.net/answers/viewqa/Java-Beginners/14930-How-to-export-data-from-database-to-excel-sheet-by-using-java- -in-standalone-project.html . Pero aquí el archivo de Excel se guarda en el servidor. Quiero que el archivo no se guarde en el lado del servidor, debe ir directamente al lado del cliente

(Si ayuda) Estoy usando: struts 2 framework, hibernate

Estoy abierto a usar otras cosas como POI API, jQuery o cualquier otra cosa buena.

No puedo usar displayTag por alguna razón.

Javascript sería mi último recurso (aunque he implementado con él) porque requiere cambiar algunas configuraciones de seguridad predeterminadas del navegador (si esto se puede evitar estoy abierto a Javascript también).

Por favor, avísenme cómo debería hacerlo ahora.

¡¡Gracias!!

EDITAR:

<result-types> <result-type name="jsp" class="org.apache.struts2.views.jsp"/> <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> </result-types> <action name="myActionName" class="package.myActionClass"> <result type="stream"> <param name="contentType">"application/vnd.ms-excel"</param> <param name="inputName">excelStream</param> <param name="contentDisposition">contentDisposition</param> <param name="bufferSize">1024</param> </result> </action>

El error al ejecutar la acción:

java.lang.reflect.InvocationTargetException java.lang.IncompatibleClassChangeError: Class org.apache.poi.hssf.usermodel.HSSFWorkbook does not implement the requested interface org.apache.poi.ss.usermodel.Workbook


Tienes dos copias diferentes de POI en tu classpath, una vieja y una nueva. Es por eso que obtiene la excepción java.lang.IncompatibleClassChangeError: Class org.apache.poi.hssf.usermodel.HSSFWorkbook no implementa la interfaz solicitada org.apache.poi.ss.usermodel.Workbook - compiló en contra de la nueva copia, pero en tiempo de ejecución está encontrando algunos frascos nuevos y viejos.

Esto está cubierto en las preguntas frecuentes de POI . Lo ideal sería que solo pudieras ver todos los frascos en tu configuración y borrar el viejo PDI. De lo contrario, la entrada de Preguntas frecuentes de POI tiene un código de muestra que puede usar para que la JVM imprima desde donde ha cargado las clases de POI. Eso le mostrará el nombre del archivo jar y puede eliminar el anterior.