如何使用servlet创建csv文件?

Ros*_*ose 4 java csv servlets

我想下载csv文件从object[]来自object[]

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

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

Bal*_*usC 11

怎么能Object[]代表CSV数据?它是包含一行有多列还是多行有一列?我想象Object[][]List<List<Object>>更有意义.

无论如何,在创建CSV文件时,您必须遵守RFC4180规范.它基本上很简单,只有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();
}
Run Code Online (Sandbox Code Playgroud)

以下是如何在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());
}
Run Code Online (Sandbox Code Playgroud)

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

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