我正在开发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();
}
}
任何人都可以帮助我。
由于
答案 0 :(得分:26)
我得到了解决方案,我将在下面发布。
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());
}
}
此处我们不需要将文件保存/存储在服务器中。
由于
答案 1 :(得分:4)
首先,您需要获取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的输出流。这应该工作,因为它对我来说非常合适。希望这可以帮助。对不起,我的英语不好。
答案 2 :(得分:0)
我想通过gaurav为答案添加一些内容。我最近不得不在我的项目中实现这个功能,并且使用javascript是不可能的,因为我们必须支持IE 9. IE 9有什么问题? (Export to CSV using jQuery and html),请参阅链接中的第二个答案。
我需要一种简单的方法将数据库查询的ResultSet转换为表示CSV格式的相同数据的字符串。为此,我使用http://opencsv.sourceforge.net/提供了一种简单的方法来获取ResultSet的String ot,其余的就像上面的答案一样。
项目soruce文件夹中的示例提供了很好的示例。