从 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 可下载文件的主要内容,如果未能解决你的问题,请参考以下文章
使用javascript生成Excel表格(内含实例demo),可下载xlsx.core.min.jsexcel.js包