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