首页 > 解决方案 > 在浏览器中导出 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' });
            });
    }

有谁知道可能是什么问题?

标签: javaexport-to-csv

解决方案


您永远不会将文件发送给客户端。您甚至不必先将数据写入服务器上的文件。只需使用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 。


推荐阅读