Java 在浏览器中导出csv文件

Java 在浏览器中导出csv文件,java,export-to-csv,Java,Export To Csv,我正在尝试从浏览器导出csv文件。 因此,接下来是流程。当我在GUI上单击“导出”按钮时,它应该在后端创建csv文件,并在浏览器中向我显示它(下载时)。 但这并没有发生。 当我点击按钮时,它会从后端调用我的方法,它会创建csv文件并将其存储到文件夹中,但不会在浏览器中显示该文件 这是我的密码: public void export(HttpServletResponse response) throws IOException { try { // crea

我正在尝试从浏览器导出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(); 
    } 
}
public void导出(HttpServletResponse响应)引发IOException{
试一试{
//以文件作为参数创建FileWriter对象
FileWriter outputfile=新的FileWriter(“exported.csv”);
//创建CSVWriter对象filewriter对象作为参数
CSVWriter writer=新的CSVWriter(输出文件);
//创建包含字符串数组的列表
列表数据=新的ArrayList();
添加(新字符串[]{“名称”、“类”、“标记”});
add(新字符串[]{“Aman”、“10”、“620”});
添加(新字符串[]{“Suraj”、“10”、“630”});
writer.writeAll(数据);
//关闭写入程序连接
writer.close();
response.setContentType(“应用程序/ms excel”);//或者您可以使用text/csv
setHeader(“内容处置”、“附件;文件名=exported.csv”);
} 
捕获(IOE){
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' });
            });
    }
.service('ExportService',函数($http){
this.export=函数(){
返回$http.post('/data/export',{responseType:'application/octet stream'});
};
})
$scope.export=函数(){
ExportService.export()
.success(函数(数据、状态、标题、配置){
var blob=new blob([data],{type:'application/octet stream'});
saveAs(blob,'Exported-Exported.csv');
$.growl({message:'
已成功导出',title:'SUCCESS'},{type:'SUCCESS'}); }) .error(函数(数据、状态、标题、配置){ $.growl({消息:'
导出失败,标题:'ERROR'},{类型:'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);
    }
}
public void导出(HttpServletResponse)引发IOException{
try(CSVWriter writer=new CSVWriter(new OutputStreamWriter(response.getOutputStream(),StandardCharsets.utf8)){
response.setContentType(“text/csv”);
setHeader(“内容处置”、“附件;文件名=exported.csv”);
列表数据=新的ArrayList();
添加(新字符串[]{“名称”、“类”、“标记”});
add(新字符串[]{“Aman”、“10”、“620”});
添加(新字符串[]{“Suraj”、“10”、“630”});
writer.writeAll(数据);
}
}

顺便说一句:我将
try
块替换为
try with resources
块。这样,您可以确保
close()
写入程序的方法始终被调用,即使存在异常。此外,无需在此位置捕获异常,因为该方法的调用方无论如何都必须处理
IOException
s。

您正在将数据写入服务器上本地名为
exported.csv
的文件中。此文件不会发送到cli耳鼻喉科


您应该改为将文件内容写入
response.getOutputStream()中

是什么让你认为设置头属性足以让服务器进行完整的文件传输?顺便问一下:你在使用什么工具?Tomcat?这是我在internet上找到的头的例子。是的,我在使用Tomcat。首先,我建议你试着找出问题所在。通过访问您最喜爱的REST服务客户端的浏览器URL。我喜欢Postman,但这只是我个人的偏好。如果您能够使用Postman下载文件,那么您的问题在于角度代码。在这种情况下,请尝试提出一个新问题并相应地标记它。如果使用Postman下载文件不起作用,则应该有一些问题响应和服务器日志中的种类或错误。这是有价值的信息。请添加一些详细信息。@JochenReinhardt我忘记了一个js,因此它没有下载文件。但现在问题是文件是空的。我从后端发送的文件中没有数据。您是否应用了@stevecross?您的origi建议的修复程序nal服务器端实现可能会创建一个空文件。我尝试了此操作,但它仍然不会向客户端发送filde,并且在执行过程中也不会显示任何错误。我添加了角度部分,可能存在一些问题。您确定调用了
导出
方法吗?请向我们显示调用代码。您是否尝试下载该文件的手动“?例如使用curl.yes,我确定。我检查了调试器和它的调用方法。我忘记了一个js,因此它没有下载文件。但现在的问题是,该文件是空的。我从后端发送的文件中没有数据。我验证了我直接在servlet中发布的代码,它肯定可以工作。但是,因为您没有我不能提供调用
导出
方法的servlet的代码,我无法进一步帮助您。我已经尝试了,但没有帮助。我已经用角度部分更新了问题