我正在尝试下载服务器生成的电子表格。
我的应用程序在前端使用 Angular,在后端使用 Java。
下面是后端接收请求生成并返回文件的方法:
@RequestMapping(value = "download", method = RequestMethod.GET, produces = "application/xls")
public ResponseEntity<InputStreamResource> download() throws IOException {
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet worksheet = workbook.createSheet("POI Worksheet");
HSSFRow row1 = worksheet.createRow((short) 0);
HSSFCell cellA1 = row1.createCell((short) 0);
cellA1.setCellValue("Hello!");
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillForegroundColor(HSSFColor.GOLD.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellA1.setCellStyle(cellStyle);
workbook.write(fileOut);
fileOut.close();
byte[] file = fileOut.toByteArray();
return ResponseEntity
.ok()
.contentLength(file.length)
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(new InputStreamResource(new ByteArrayInputStream(file)));
}
在前端,当用户点击下载按钮时,会执行以下函数:
$scope.exportFile = function() {
$http.get('http://127.0.0.1:8000/api/excel/download')
.success(function (data, status, headers, config) {
var anchor = angular.element('<a/>');
anchor.attr({
href: 'data:application/octet-stream;charset=utf-8,' + encodeURI(data),
target: '_blank',
download: 'spreadsheet.xls'
})[0].click();
})
.error(function (data, status, headers, config) {
// handle error
});
};
返回的电子表格包含不可读的字符。
如果我直接访问http://127.0.0.1:8000/api/excel/download,则下载的电子表格没有 .xls 扩展名(根本没有扩展名)。如果我重命名文件并添加 .xls 扩展名,然后打开它,我可以看到文件内容。所以我认为问题在于 Angular 对后端的调用,而不是在 Java 上生成文件。
有没有人经历过这种情况或有一些例子可以分享?我究竟做错了什么?