2009-11-18 59 views
8

我在將數據導出到Excel表單時遇到問題,這是因爲我的團隊中的其他開發人員所做的一些代碼。所以主要的問題是使用JSP頁面將數據導出到Excel或.cvs,但不使用任何HTML代碼。 任何建議也可以幫助我探索在我的發展舞臺上。感謝您的努力。沒有用於將數據導出到Excel的HTML代碼的JSP頁面

回答

16

爲此更好地使用Servlet。原始Java代碼不屬於JSP文件,這僅僅是maintenance trouble的配方。

首先,創建一個簡單的Java工具類這需要例如List<List<T>>List<Data>(其中Data表示一行)表示CSV內容和OutputStream方法參數和寫入邏輯它執行數據複製任務。

一旦你得到這個工作,創建一個Servlet類,它將一些CSV文件標識符作爲請求參數或pathinfo(我建議使用pathinfo作爲由雷德蒙德團隊開發的某個webbrowser,否則將檢測到filename/mimetype失敗)使用標識符從某處獲取List<List<T>>List<Data>,並沿着一組正確的響應標頭將其寫入HttpServletResponseOutputStream

這裏有一個基本的開球例如:

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

這裏有一個例子,你如何使用它:

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

和一個servlet中,你基本上可以做到:

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

地圖這個servlet在/csv/*之類的東西上,並且像那樣調用它。這基本上都是。 pathinfo中的文件名非常重要,因爲Redmond團隊開發的某個Web瀏覽器會忽略Content-Disposition標頭的filename部分,而是使用URL的最後一個路徑部分。

+1

絕對是一個servlet的工作。 +1 – ChadNC 2009-11-27 16:33:18

+0

我試過類似這樣的解決方案,但我通過https獲取文件時遇到了問題。 它爲什麼會通過https失敗? – 2009-12-23 10:49:59

+0

問題在於別的地方。通過按右上方的「Ask Question」按鈕詢問您自己的問題,並詳細說明問題。 – BalusC 2009-12-23 12:23:36