2014-01-27 273 views
8

我正在使用JAVA EXTJS應用程序,需要創建和下載CSV文件。創建和下載CSV文件Java(Servlet)

點擊一個按鈕我想要一個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(); 
    } 
} 

任何人都可以幫助我解決這個問題。

感謝

+0

你的代碼在哪裏? – Raptor

+1

這是你的答案[http://stackoverflow.com/questions/3190303/how-to-create-csv-file-using-servlet][1] [1]:HTTP://計算器.com/questions/3190303/how-to-create-csv-file-using-servlet –

回答

20

我得到了解決方案,我在下面發佈它。

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

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

謝謝

+0

這個例子中的'm​​odel.closeConnection()'是什麼?我沒有看到任何名爲'model'的對象。 – Moob

+0

這裏模型只是將調用closeConnection()函數關閉數據庫連接的對象的名稱。這只是爲了確保連接已關閉。根據您的設計,您可以將其放置在代碼中的任何位置。 – Gourav

+0

好的。想知道它應該包含在你的例子中嗎? OP沒有提到數據庫連接。它可能會混淆其他人,就像我這樣做。只是說';) – Moob

3

首先,你需要獲得HttpServletResponse對象,這樣就可以流的文件進去。

注意:這個例子是我寫爲我的項目之一,它works.Works關於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; 
    } 
} 

它的作用是什麼,從您的源文件中獲取一個InputStream和流寫入HttpServletResponse的的OutputStream中。這應該工作,因爲它對我來說非常合適。希望這可以幫助。對不起,我的英語不好。

+0

如果CSV文件被創建並存儲在服務器中,那麼上面的方法將工作。我很感謝你的回答和謝謝。它絕對有效。但我的需要有些不同。我得到了解決方案併發布。 – Gourav

0

我想添加一些答案由gaurav。我最近不得不在我的項目中實現這個功能,並且使用javascript是不可能的,因爲我們不得不支持IE 9。IE 9的問題是什麼? (Export to CSV using jQuery and html),請參閱鏈接中的第二個答案。

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

項目soruce文件夾中的例子給出了很好的例子。