java - 在浏览器中导出 csv 文件
问题描述
我正在尝试从浏览器导出 csv 文件。所以接下来是流程。当我在 GUI 上单击按钮导出时,它应该在后端创建 csv 文件并在浏览器中显示给我(如下载的那样)。但这并没有发生。当我单击按钮时,它会从后端调用我的方法,它会创建 csv 文件并将其存储到文件夹中,但它不会在浏览器中显示该文件。
这是我的代码:
public void export(HttpServletResponse response) throws IOException {
try {
// create FileWriter object with file as parameter
FileWriter outputfile = new FileWriter("exported.csv");
// create CSVWriter object filewriter object as parameter
CSVWriter writer = new CSVWriter(outputfile);
// create a List which contains String array
List<String[]> data = new ArrayList<String[]>();
data.add(new String[] { "Name", "Class", "Marks" });
data.add(new String[] { "Aman", "10", "620" });
data.add(new String[] { "Suraj", "10", "630" });
writer.writeAll(data);
// closing writer connection
writer.close();
response.setContentType("application/ms-excel"); // or you can use text/csv
response.setHeader("Content-Disposition", "attachment; filename=exported.csv");
}
catch (IOException e) {
e.printStackTrace();
}
}
编辑:
角部分:
.service('ExportService', function($http) {
this.export = function() {
return $http.post('/data/export', { responseType: 'application/octet-stream' });
};
})
$scope.export = function() {
ExportService.export()
.success(function(data, status, headers, config) {
var blob = new Blob([data], { type: 'application/octet-stream' });
saveAs(blob, 'Exported - exported.csv');
$.growl({ message: '<br>successfully exported', title: '<b>SUCCESS</b>' }, { type: 'success' });
})
.error(function(data, status, headers, config) {
$.growl({ message: '<br>Exporting failed', title: '<b>ERROR</b>' }, { type: 'danger' });
});
}
有谁知道可能是什么问题?
解决方案
您永远不会将文件发送给客户端。您甚至不必先将数据写入服务器上的文件。只需使用OutputStreamWriter
:
public void export(HttpServletResponse response) throws IOException {
try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8)) {
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=exported.csv");
List<String[]> data = new ArrayList<String[]>();
data.add(new String[] { "Name", "Class", "Marks" });
data.add(new String[] { "Aman", "10", "620" });
data.add(new String[] { "Suraj", "10", "630" });
writer.writeAll(data);
}
}
顺便说一句:我用try
块替换了try-with-resources
块。这样,您可以确保close()
始终调用 writer 的方法,即使出现异常也是如此。此外,没有必要在这个地方捕获异常,因为方法的调用者IOException
无论如何都必须处理 s 。
推荐阅读
- javascript - 无法让我的 if 语句在“app.post”函数中工作
- arrays - 为什么我不能从文本文件中连接重建和数字数组 c char 的内容?
- python - 使用 lxml python 解析时输出错误
- haskell - 堆栈:检测到随机依赖循环
- qt - 无法引用 listview qml 的突出显示 id
- javascript - 我的替换方法在格式化数字时搞砸了(在数字中添加逗号)
- python - python从for循环中提取值到另一个for循环中
- sql - 在 SQL(特别是 SQLITE3)中,当视图中的列数取决于数据时,如何将存储为窄表的数据转换为宽格式视图
- python - 使用 ctypes 将数组从 python 传递到 C,然后在 Python 中使用该数组
- ios - 如何从 SwiftUI 中的工作表视图转到另一个页面?