2010-07-06 125 views
3

我想從servlet.Data下載csv文件來自Object[] obj=search.getSearch();如何使用servlet創建csv文件?

我有數據object[],我需要編寫成CSV和下載。

你能幫助我如何在servlet類中做什麼?

回答

1

下面是一個嘗試:

public void doGet(HttpServletRequest request, 
       HttpServletResponse response) 
    throws ServletException, IOException { 

    // Other stuff you know that I don't.. 

    Object[] data = search.getSearch(); 
    response.setContentType("text/csv"); 
    PrintWriter out = response.getWriter(); 
    for (Object d : data) { 
     out.println(d.field1 + "," + d.field2 + "," + d.field3 + ...); 
    } 
} 

如果你的領域有數據逗號這打破。我讓你想出如何做到這一點,因爲這是一個快速的Google Search

1

JavaCSV這將幫助您生成csv表示。

然後你就可以使用寫文件:

  • response.getWriter()打印的內容
  • response.setContentType("text/csv")
0

下面是從生產的servlet我已經運行了一些(節錄爲了簡潔和通用)代碼。使用下面的代碼交換特定的數據陣列應該是微不足道的。

public void doGet(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 

     res.setContentType("application/octet-stream"); 
     res.setHeader("Content-Disposition", "attachment; filename=\"TSR.csv\""); 
     try { 
      // Write the header line 
      OutputStream o = res.getOutputStream(); 
      String header = "ID,ControlNumber\n"; 
      o.write(header.getBytes()); 

      // Write the data lines 
      Vector records = getRecords(); // Custom to my app 
      Iterator i = records.iterator(); 
      while (i.hasNext()) { 
           // Custom data object; use your own 
       StandardReportDTO sr = (StandardReportDTO) i.next(); 
       StringBuffer line = new StringBuffer(); 
       line.append(sr.getID()); 
       line.append(","); 
       line.append(sr.getControlNumber()); 
       line.append("\n"); 
       o.write(line.toString().getBytes()); 
       o.flush(); 
      } 

     } catch (Exception e) { 
//   log.error(e); 
     } 
} 
11

Object[]怎麼能代表CSV數據?它是否包含一列有幾列或幾列有一列?我認爲Object[][]List<List<Object>>更有意義。

無論如何,創建CSV文件時,您必須遵守RFC4180 spec。它基本上很簡單,只有3條嚴格規則:

  1. 字段之間用逗號隔開。
  2. 如果某個字段中出現逗號,則該字段必須用雙引號包圍。
  3. 如果在一個字段中出現雙引號,那麼該字段必須用雙引號包圍,並且該字段內的雙引號必須用另一個雙引號轉義。

下面是一個啓動示例,它完全基於作爲源的List<List<T>>和作爲目標的OutputStream

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

這裏是你如何在一個Servlet使用它:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    List<List<Object>> csv = getItSomehow(); 
    response.setHeader("Content-Type", "text/csv"); 
    response.setHeader("Content-Disposition", "attachment;filename=\"file.csv\""); 
    writeCsv(csv, ';', response.getOutputStream()); 
} 

(注意,基於歐洲語言環境中使用,而不是逗號的CSV文件分號,隨意更改)

Content-Dispositionattachment會強制將另存爲對話。請注意,MSIE有這樣的錯誤行爲,它不會將filename作爲另存爲對話框中的默認文件名,但它會佔用pathinfo的最後部分。所以如果這個servlet被http://example.com/csv調用,那麼你會得到csv作爲默認文件名。而是附加到pathinfo,如下所示http://example.com/csv/file.csv。該servlet只能映射到/csv/*url-pattern而不是/csv

+0

可以寫成'public static void writeCsv(List <?extends List > csv,char separator,OutputStream output)'並將所有'T'改爲'?' – user102008 2011-08-31 03:59:33