簡體   English   中英

在 Java servlet 中創建和下載 CSV 文件

[英]Create and download CSV file in a Java servlet

我正在開發 Java ExtJS 應用程序,我需要在其中創建和下載 CSV 文件。

  • 單擊按鈕時,我希望將 CSV 文件下載到客戶端的機器上。
  • 在按鈕偵聽器上,我使用 AJAX 調用 servlet。 在那里我正在創建一個 CSV 文件。

我不希望將 CSV 文件保存在服務器中。 我希望文件應該使用下載選項動態創建。 我希望將文件的內容創建為字符串,然后將內容作為文件提供,它將在瀏覽器中以下載模式打開(這是我用其他語言實現的,但不確定如何在 Java 中實現它)。

這是我僅用於創建 CSV 文件的代碼,但如果我只能將文件下載為 CSV,我真的不想創建或保存 CSV 文件。

public String createCSV() {
    try {
        String filename = "c:\\test.csv";
        FileWriter fw = new FileWriter(filename);
        fw.append("XXXX");
        fw.append(',');
        fw.append("YYYY");
        fw.append(',');
        fw.append("ZZZZ");
        fw.append(',');
        fw.append("AAAA");
        fw.append(',');
        fw.append("BBBB");
        fw.append('\n');

        CSVResult.close();

        return "Csv file Successfully created";
    } catch(Exception e) {
        return e.toString();
    }
}

誰可以幫我這個事。

謝謝

我得到了解決方案,並將其發布在下面。

public void doGet(HttpServletRequest request, HttpServletResponse response)
{
    response.setContentType("text/csv");
    response.setHeader("Content-Disposition", "attachment; filename=\"userDirectory.csv\"");
    try
    {
        OutputStream outputStream = response.getOutputStream();
        String outputResult = "xxxx, yyyy, zzzz, aaaa, bbbb, ccccc, dddd, eeee, ffff, gggg\n";
        outputStream.write(outputResult.getBytes());
        outputStream.flush();
        outputStream.close();
    }
    catch(Exception e)
    {
        System.out.println(e.toString());
    }
}

這里我們不需要在服務器中保存/存儲文件。

謝謝

首先,您需要獲取 HttpServletResponse 對象,以便您可以將文件流式傳輸到其中。

注意:這個例子是我為我的一個項目寫的,它在 Java 7 上有效。

假設你有 HttpServletResponse 你可以做這樣的事情來流式傳輸文件。 這樣文件將被保存到客戶的機器中。

public void downloadFile(HttpServletResponse response){ 

        String sourceFile = "c:\\source.csv";
        try {
            FileInputStream inputStream = new FileInputStream(sourceFile);
            String disposition = "attachment; fileName=outputfile.csv";
            response.setContentType("text/csv");
            response.setHeader("Content-Disposition", disposition);
            response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream())));

        } catch (IOException e) {
            logger.error("Error occurred while downloading file {}",e);
        }
}

而流方法應該是這樣的。

private long stream(InputStream input, OutputStream output) throws IOException {

    try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) {
        ByteBuffer buffer = ByteBuffer.allocate(10240);
        long size = 0;

        while (inputChannel.read(buffer) != -1) {
            buffer.flip();
            size += outputChannel.write(buffer);
            buffer.clear();
        }
        return size;
    }
}

它的作用是從源文件中獲取輸入流並將該流寫入 HttpServletResponse 的輸出流。 這應該有效,因為它對我來說非常有效。 希望這可以幫助。 對不起,我的英語不好。

我想在 gaurav 的答案中添加一些內容。 我最近不得不在我的一個項目中實現這個功能,使用 javascript 是不可能的,因為我們必須支持 IE 9。IE 9 有什么問題? 使用 jQuery 和 html 導出到 CSV ),請參閱鏈接中的第二個答案。

我需要一種簡單的方法將數據庫查詢的 ResultSet 轉換為以 CSV 格式表示相同數據的字符串。 為此,我使用了http://opencsv.sourceforge.net/ ,它提供了一種簡單的方法來獲取 ResultSet 的 String ot,其余的就像上面的答案一樣。

項目源文件夾中的示例給出了很好的示例。

暫無
暫無

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

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