java springboot 怎么实现同时返回对象及Excel文件流
时间: 2024-01-23 15:02:24 浏览: 123
springboot实现Excel文件导入与导出功能
在Java Spring Boot中,你可以使用ResponseEntity类来同时返回对象和Excel文件流。以下是一个示例代码:
```java
@GetMapping("/export")
public ResponseEntity<?> export() {
// 构造Excel文件
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue(1);
dataRow.createCell(1).setCellValue("John Doe");
// 构造响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=data.xlsx");
// 构造对象
Map<String, String> responseMap = new HashMap<>();
responseMap.put("message", "Data exported successfully");
// 返回ResponseEntity
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new InputStreamResource(toInputStream(workbook)), responseMap);
}
private InputStream toInputStream(Workbook workbook) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
workbook.write(out);
byte[] bytes = out.toByteArray();
return new ByteArrayInputStream(bytes);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
out.close();
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
```
在这个示例中,我们首先构造Excel文件,并将其转换为字节数组,然后构造响应头,添加Excel文件下载的Content-Disposition头。接下来,我们构造一个包含消息的Map作为响应体的一部分。最后,我们使用ResponseEntity类将字节数组和Map一起返回。
值得注意的是,我们在调用ResponseEntity.ok()方法时,使用了一个可选的body参数,用来传递包含消息的Map对象。这个body参数可以接收任何类型的对象,因此我们可以使用List、Set等数据类型来传递更复杂的对象。
阅读全文