【问题标题】:Return Excel downloadable file from Spring从 Spring 返回 Excel 可下载文件
【发布时间】:2013-09-10 00:36:45
【问题描述】:

所以我有一个 Spring 控制器,我想创建一个 Excel 文件并将其返回,以便浏览器下载它。

我正在使用 JEXcelApi。

这是我的控制器代码

@RequestMapping(value="/excel/cols/{colString}/rows/{rowString}/", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> exportExcel(HttpServletResponse response,
    @PathVariable List<String> colString,
    @PathVariable List<String> rowString) throws JSONException, IOException, WriteException {
    WritableWorkbook workbook = Workbook.createWorkbook(new File("exported.xls"));
    WritableSheet sheet = workbook.createSheet("Exported",0);
    String[] cols = colString.get(0).split(",");
    String[] rows = rowString.get(0).split(","); 
    for(int i = 0; i < cols.length;i++){
        Label label = new Label(i,0, cols[i]);
        sheet.addCell(label);
    }
    int excelCol = 0;
    int excelRow = 1;
    for(int i = 0; i < rows.length;i++){
        Label label = new Label(excelCol,excelRow, rows[i]);
        sheet.addCell(label);
        excelCol++;
        if((i+1) % cols.length == 0){
            excelCol = 0;
            excelRow++;
        }
    }
    workbook.write();
    workbook.close();
    return null;
}

我该怎么做?我怀疑我可以设置一些内容标题。我知道一种方法是使用 Spring 的 Abstract Excel 视图类,但有更简单的方法吗?

【问题讨论】:

    标签: java spring excel spring-mvc


    【解决方案1】:

    您需要设置Content-Disposition 标头。

    response.setHeader("Content-disposition","attachment; filename=" + yourFileName);
    

    并将您的字节直接写入响应OutputStream

    File xls = new File("exported.xls"); // or whatever your file is
    FileInputStream in = new FileInputStream(xls);
    OutputStream out = response.getOutputStream();
    
    byte[] buffer= new byte[8192]; // use bigger if you want
    int length = 0;
    
    while ((length = in.read(buffer)) > 0){
         out.write(buffer, 0, length);
    }
    in.close();
    out.close();
    

    上面的比较老了。你现在可以用FileSystemResource 构造一个ResponseEntity。然后ResourceHttpMessageConverter 将为您复制字节,正如我上面建议的那样。 Spring MVC 让您更简单,而不是让您与 Servlet 规范中的接口进行交互。

    【讨论】:

    • 啊,然后返回什么?
    • 啊,你有没有机会写到流代码?
    • 所以我试过了——但没有下载,而是发生了控制台注销——这来自我的客户端的成功功能
    • 还有一个问题——有没有办法动态改变缓冲区数组——因为如果文件很大,这个方法就行不通了?
    猜你喜欢
    • 2015-07-29
    • 2012-12-18
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多