2009-11-18 16 views
8

Tengo un problema al exportar mis datos a la hoja de Excel, esto se debe a algún código que otros desarrolladores de mi equipo crearon. Entonces, el principal problema es exportar los datos a Excel o .cvs usando la página JSP pero sin usar ningún código HTML. Cualquier sugerencia también me ayudaría a explorar en mi arena en desarrollo. Gracias por tus esfuerzos.Página JSP sin código HTML para exportar datos a la hoja de Excel

Respuesta

16

Mejor use un servlet para esto. El código de Java sin procesar no pertenece a un archivo JSP, simplemente es una receta para maintenance trouble.

Para empezar, cree una sencilla clase de utilidad de Java que tiene por ejemplo un List<List<T>> o una List<Data> (en la que Data representa una fila) que representa el contenido de CSV y un OutputStream como argumentos de métodos y escribir lógica que hace los datos de la copia de la tarea.

Una vez que funcione, cree una clase Servlet que tome algún identificador de archivo CSV como parámetro de solicitud o pathinfo (Recomiendo usar pathinfo como un determinado explorador web desarrollado por un equipo en Redmond fallaría en la detección de nombre de archivo/mimetipo), usa el identificador para obtener el List<List<T>> o List<Data> desde algún lugar y lo escribe en el OutputStream del HttpServletResponse a lo largo de un conjunto de encabezados de respuesta correctos.

Aquí está un ejemplo puntapié inicial básica:

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(); 
} 

He aquí un ejemplo de cómo se podría utilizar:

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 básicamente se puede hacer:

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

Mapa este servlet en algo como /csv/* e invocarlo como algo así como http://example.com/context/csv/filename.csv. Eso es básicamente todo. El nombre de archivo en pathinfo es importante porque un navegador web desarrollado por un equipo de Redmond ignora la parte filename del encabezado Content-Disposition y utiliza la última parte de la ruta de la URL en su lugar.

+1

Definitivamente un trabajo para un servlet. +1 – ChadNC

+0

Intenté una solución similar a esta, pero tuve problemas para obtener el archivo a través de https. ¿Por qué no puede pasar por https ?. –

+0

El problema está en otro lado. Haga su propia pregunta presionando el botón 'Ask Question' en la parte superior derecha y elabore el problema en detalle. – BalusC

Cuestiones relacionadas