[英]Create and download CSV file in a Java servlet
我正在開發 Java ExtJS 應用程序,我需要在其中創建和下載 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.