簡體   English   中英

如何使用 servlet 創建 CSV 文件?

[英]How to create a CSV file using servlet?

我想從servlet下載 CSV 文件。 我在對象數組( object[] )中有數據,我需要將其寫入 CSV 並下載。

你能幫我在 servlet 類中如何做到這一點嗎?

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

以下是在 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 文件使用分號而不是逗號,可以隨意更改)

attachmentContent-Disposition將強制執行另存為對話框。 請注意,MSIE 的錯誤行為是它不將filename作為“另存為”對話框中的默認文件名,而是采用路徑信息的最后一部分。 因此,如果此 servlet 例如由http://example.com/csv調用,那么您將獲得csv作為默認文件名。 而是將其附加到 pathinfo ,如下所示http://example.com/csv/file.csv servlet 應該只映射到/csv/*而不是/csvurl-pattern上。

這是一個嘗試:

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 搜索

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM