Как создать CSV-файл с помощью сервлета? - PullRequest
3 голосов
/ 07 июля 2010

Я хочу скачать CSV-файл с servlet.Data приходит Object[] obj=search.getSearch();

У меня есть данные object[], мне нужно записать в CSV и загрузить.

Не могли бы вы помочьмне, как это сделать в классе сервлетов?

Ответы [ 4 ]

11 голосов
/ 07 июля 2010

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

Вот как вы можете использовать его в сервлете:

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 для файлов CSV, не стесняйтесь менять)

Content-Disposition из attachment приведет к Сохранить как диалог.Обратите внимание, что у MSIE неправильное поведение: он не принимает filename в качестве имени файла по умолчанию в диалоге Сохранить как , но вместо этого использует последнюю часть pathinfo.Так, если этот сервлет, например, вызывается http://example.com/csv,, тогда вы получите csv в качестве имени файла по умолчанию.Вместо этого добавьте его в pathinfo следующим образом http://example.com/csv/file.csv. Сервлет должен отображаться только на url-pattern из /csv/* вместо /csv.

1 голос
/ 07 июля 2010

Существует JavaCSV , который поможет вам сгенерировать представление csv.

Затем вы можете написать файл, используя:

  • response.getWriter() для печати содержимого
  • response.setContentType("text/csv")
1 голос
/ 07 июля 2010

Вот попытка:

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 .

0 голосов
/ 07 июля 2010

Вот некоторый (отредактированный для краткости и общности) код из рабочего сервлета, который я запускаю. Поменять местами конкретный массив данных с приведенным ниже кодом должно быть тривиально.

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);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...