poi modificar insertar generar formato exportar desde descargar datos dar crear celdas archivo java excel jsp tomcat export

modificar - insertar datos en excel desde java



JSP genera hojas de cálculo de Excel(XLS) para descargar (6)

Es probable que necesite una biblioteca para manipular archivos de Excel, como JExcelAPI ("jxl") o POI . Estoy más familiarizado con jxl y ciertamente puedo escribir archivos. Puede generarlos y almacenarlos sirviéndoles una URL, pero yo no lo haría. Los archivos generados son un dolor. Añaden complicaciones en la forma de concurrencia, procesos de limpieza, etc.

Si puede generar el archivo sobre la marcha y transmitirlo al cliente a través de los mecanismos de servlet estándar.

Si se genera mucho, puede veces o la generación es costosa, entonces puede almacenar en caché el resultado de alguna manera, pero estaría más inclinado a mantenerlo en la memoria que como un archivo. Sin duda, evitaría, si puedes, vincular directamente al archivo generado por URL. Si va a través de un servlet, le permitirá cambiar su implemntation más adelante. Es el mismo concepto de encapsulación que en OO dsign.

Tengo esta aplicación que estoy desarrollando en JSP y deseo exportar algunos datos de la base de datos en XLS (formato MS Excel).

¿Es posible bajo Tomcat simplemente escribir un archivo como si fuera una aplicación Java normal, y luego generar un enlace a este archivo? ¿O necesito usar una API específica para eso?

¿Tendré problemas de permiso al hacer esto?


Si bien puede utilizar una biblioteca completa como JExcelAPI , Excel también leerá las tablas CSV y HTML sin formato, siempre que configure el Tipo MIME de respuesta en algo como "application / vnd.ms-excel".

Dependiendo de qué tan compleja debe ser la hoja de cálculo, CSV o HTML pueden hacer el trabajo por usted sin una biblioteca de terceros.


tal vez deberías considerar el uso de alguna herramienta de informes con la opción de exportar archivos al formato XLS. mi sugerencia es JasperReports


No utilice tablas HTML sencillas con un tipo de contenido application/vnd.ms-excel . Básicamente estás engañando a Excel con un tipo de contenido incorrecto que causaría fallas y / o advertencias en las últimas versiones de Excel. También destruirá la fuente HTML original cuando la edite y la guarde en Excel. Simplemente no hagas eso.

CSV, a su vez, es un formato estándar que disfruta del soporte predeterminado de Excel sin ningún problema y que, de hecho, es fácil de generar y de memoria eficiente. Aunque hay bibliotecas, también puedes escribir fácilmente una en menos de 20 líneas (gracioso para los que no se pueden resistir). Solo tiene que adherirse a la especificación RFC 4180 que básicamente contiene solo 3 reglas:

  1. Los campos están separados por una coma.
  2. Si se produce una coma dentro de un campo, el campo debe estar rodeado por comillas dobles.
  3. Si se produce una comilla doble dentro de un campo, el campo debe estar rodeado por comillas dobles y la comilla doble dentro del campo debe ser escapada por otra comilla doble.

Aquí hay un ejemplo de inicio:

public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); for (List<T> row : csv) { for (Iterator<T> iter = row.iterator(); iter.hasNext();) { String field = String.valueOf(iter.next()).replace("/"", "/"/""); if (field.indexOf(separator) > -1 || field.indexOf(''"'') > -1) { field = ''"'' + field + ''"''; } writer.append(field); if (iter.hasNext()) { writer.append(separator); } } writer.newLine(); } writer.flush(); }

Aquí hay un ejemplo de cómo puedes usarlo:

public static void main(String[] args) throws IOException { List<List<String>> csv = new ArrayList<List<String>>(); csv.add(Arrays.asList("field1", "field2", "field3")); csv.add(Arrays.asList("field1,", "field2", "fie/"ld3")); csv.add(Arrays.asList("/"field1/"", ",field2,", ",/",/",/"")); writeCsv(csv, '','', System.out); }

Y dentro de un Servlet (sí, Servlet, ¡no use JSP para esto!) Básicamente puede hacer:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getPathInfo().substring(1); List<List<Object>> csv = someDAO().findCsvContentFor(filename); response.setHeader("content-type", "text/csv"); response.setHeader("content-disposition", "attachment;filename=/"" + filename + "/""); writeCsv(csv, '';'', response.getOutputStream()); }

Asigne este servlet a algo como /csv/* y utilícelo como http://example.com/context/csv/filename.csv . Eso es todo.

Tenga en cuenta que agregué la posibilidad de especificar el carácter separador por separado, porque puede depender de la configuración regional utilizada, ya sea que Excel acepte una coma o punto y coma ; como separador de campo CSV. Tenga en cuenta que también agregué el nombre de archivo al URL pathinfo, porque un navegador web determinado desarrollado por un equipo en Redmond de lo contrario no guardará la descarga con el nombre de archivo adecuado.


POI o JExcel son buenas API. Personalmente me gusta un mejor PDI, además de que POI se actualiza constantemente. Además, hay más recursos en línea sobre POI que JExcel en caso de que tenga alguna pregunta. Sin embargo, cualquiera de los dos hace un gran trabajo.


try { String absoluteDiskPath = test.xls"; File f = new File(absoluteDiskPath); response.setContentType("application/xlsx"); response.setHeader("Content-Disposition", "attachment; filename=" + absoluteDiskPath); String name = f.getName().substring(f.getName().lastIndexOf("/") + 1, f.getName().length()); InputStream in = new FileInputStream(f); out.clear(); //clear outputStream prevent illegalStateException write binary data to outputStream ServletOutputStream outs = response.getOutputStream(); int bit = 256; int i = 0; try { while ((bit) >= 0) { bit = in.read(); outs.write(bit); } outs.flush(); outs.close(); in.close(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if(outs != null) outs.close(); if(in != null) in.close(); }catch (Exception ioe2) { ioe2.printStackTrace(); } } } catch (Exception ex) { ex.printStackTrace(); }