2014-01-27 238 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文件夹中的例子给出了很好的例子。