如何使用servlet创建csv文件?

我想从servlet.Data下载csv文件servlet.Data来自Object[] obj=search.getSearch();

我有数据object[] ,我需要写入csv并下载。

你能帮帮我怎么做servlet课吗?

Object[]如何表示CSV数据? 它是包含一行有多列还是多行有一列? 我想象Object[][]List>更有意义。

无论如何,在创建CSV文件时,您必须遵守RFC4180规范 。 它基本上很简单,只有3个严格的规则:

  1. 字段用逗号分隔。
  2. 如果字段中出现逗号,则该字段必须用双引号括起来。
  3. 如果字段中出现双引号,则该字段必须用双引号括起来,并且字段中的双引号必须由另一个双引号转义。

这是一个启动示例,它基于List>作为源, OutputStream作为目标。

 public static  void writeCsv (List> csv, char separator, OutputStream output) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); for (List row : csv) { for (Iterator 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> csv = getItSomehow(); response.setHeader("Content-Type", "text/csv"); response.setHeader("Content-Disposition", "attachment;filename=\"file.csv\""); writeCsv(csv, ';', response.getOutputStream()); } 

(请注意,基于欧洲的语言环境对CSV文件使用分号而不是逗号,请随意更改)

Content-Disposition attachment将强制另存为对话框。 请注意,MSIE有一个错误行为,它不会将filename作为默认文件名保存为另存为对话框,但它取代了pathinfo的最后一部分。 因此,如果这个servlet例如由http://example.com/csv调用,那么你将获得csv作为默认文件名。 而是将其附加到pathinfo,如http://example.com/csv/file.csv 。 servlet只应映射到/csv/*url-pattern而不是/csv

这是一个尝试:

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

如果您的字段包含数据逗号,则会损坏。 我告诉你如何做到这一点,因为这是一个快速的谷歌搜索 。

JavaCSV可以帮助您生成csv表示。

然后你可以使用以下方法编写文件:

  • response.getWriter()来打印内容
  • response.setContentType("text/csv")

以下是我运行的生产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); } }