创建和下载CSV文件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); } } 

而stream方法应该是这样的。

 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的回答中添加一些内容。 我最近不得不在我的一个项目中实现这个function,并且使用javascript是不可能的,因为我们必须支持IE 9. IE 9有什么问题? ( 使用jQuery和html导出为CSV ),请参阅链接中的第二个答案。

我需要一种简单的方法将数据库查询的ResultSet转换为表示CSV格式的相同数据的字符串。 为此我使用了http://opencsv.sourceforge.net/ ,它提供了一种简单的方法来获取ResultSet的String ot,其余的就像上面的答案一样。

项目soruce文件夹中的示例提供了很好的示例。