2009-11-18 9 views
8

Mam problem z eksportowaniem moich danych do arkusza Excela, jest to spowodowane kodem, który napisali inni twórcy w moim zespole. Tak więc głównym problemem jest eksport danych do Excela lub .cvs przy użyciu strony JSP, ale bez użycia kodu HTML. Każda sugestia również pomoże mi odkryć na mojej rozwijającej się arenie. Dziękuję za Twój wysiłek.Strona JSP bez kodu HTML do eksportowania danych do arkusza Excela

Odpowiedz

16

Lepiej użyj do tego celu serwletu. Surowy kod Java nie należy do pliku JSP, to po prostu przepis na maintenance trouble.

Na początek tworzenia prostych Java klasy narzędzie, które przyjmuje na przykład List<List<T>> lub List<Data> (gdzie Data oznacza jeden wiersz), co odpowiada zawartości CSV i jest OutputStream jako argumenty sposobu i zapisu logiki, który wykonuje zadanie kopiowania danych.

Gdy już to zrobisz, utwórz klasę Servlet, która pobiera jakiś identyfikator pliku CSV jako parametr żądania lub pathinfo (zalecam używanie pathinfo, ponieważ pewien webbrowser opracowany przez zespół w Redmond mógłby nie wykryć nazwy pliku/typu mimetowego w przeciwnym razie), używa identyfikatora, aby uzyskać od niego List<List<T>> lub List<Data> i zapisuje go do OutputStream z HttpServletResponse wzdłuż zestawu poprawnych nagłówków odpowiedzi.

Oto prosty przykład kickoff:

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

Oto przykład, jak można go używać:

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

A wewnątrz serwletu można w zasadzie zrobić:

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 ten serwlet na czymś takim jak /csv/* i wywołaj go jako coś takiego jak http://example.com/context/csv/filename.csv. To w zasadzie wszystko. Nazwa pliku w pathinfo jest ważna, ponieważ pewien webbrowser opracowany przez zespół w Redmond ignoruje część filename nagłówka Content-Disposition i używa zamiast niej ostatniej części ścieżki adresu URL.

+1

definately zadanie dla serwletu. +1 – ChadNC

+0

Próbowałem rozwiązania podobnego do tego, ale miałem problemy z pobieraniem pliku przez https. Dlaczego może się nie powieść przez https ?. –

+0

Problem leży gdzie indziej. Zadaj własne pytanie, naciskając przycisk "Zadaj pytanie" po prawej stronie i szczegółowo opracuj problem. – BalusC