从 Spring 返回 Excel 可下载文件

Posted

技术标签:

【中文标题】从 Spring 返回 Excel 可下载文件【英文标题】:Return Excel downloadable file from Spring 【发布时间】: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 视图类,但有更简单的方法吗?

【问题讨论】:

【参考方案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 规范中的接口进行交互。

【讨论】:

啊,然后返回什么? 啊,你有没有机会写到流代码? 所以我试过了——但没有下载,而是发生了控制台注销——这来自我的客户端的成功功能 还有一个问题——有没有办法动态改变缓冲区数组——因为如果文件很大,这个方法就行不通了?

以上是关于从 Spring 返回 Excel 可下载文件的主要内容,如果未能解决你的问题,请参考以下文章

MVC;将可下载文件返回到视图

如何在golang中检查URL是不是可下载?

使用javascript生成Excel表格(内含实例demo),可下载xlsx.core.min.jsexcel.js包

使用 R 进行网页抓取:看不到可下载的链接

从 JavaScript 创建一个可下载的附件?

使用 R 从网页中抓取可下载文件的链接地址?