如何使用servlet创建csv文件?

时间:2010-07-06 21:17:25

标签: java servlets csv

我想从servlet.Data来自Object[] obj=search.getSearch();

object[]下载csv文件

我有{{1}}的数据,我需要写入csv并下载。

你能帮我解决一下servlet类的问题吗?

4 个答案:

答案 0 :(得分:11)

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

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

  1. 字段以逗号分隔。
  2. 如果字段中出现逗号,则该字段必须用双引号括起来。
  3. 如果字段中出现双引号,则该字段必须用双引号括起来,并且该字段中的双引号必须通过另一个双引号进行转义。
  4. 这是一个启动示例,它基于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-Disposition attachment将强制另存为对话框。请注意,MSIE有一个错误行为,即它不会将filename作为另存为对话框中的默认文件名,但它取代了pathinfo的最后一部分。因此,如果这个servlet例如由http://example.com/csv调用,那么你将获得csv作为默认文件名。而是将其附加到pathinfo,如下面的http://example.com/csv/file.csv。 servlet只应映射到url-pattern /csv/*而不是/csv

答案 1 :(得分: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

答案 2 :(得分:1)

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

然后你可以使用:

编写文件
  • response.getWriter()打印内容
  • response.setContentType("text/csv")

答案 3 :(得分: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);
        }
}