如何在Spring Boot API接口中将查询得到的List<Map<String, Object>>数据转换为CSV格式并返回给客户端?
时间: 2024-12-12 07:32:26 浏览: 17
在Spring Boot API接口中,将查询结果转换为CSV格式并返回给客户端通常需要几个步骤:
1. **查询数据**:首先,你需要从数据库或其他数据源获取到`List<Map<String, Object>>`的数据。
```java
@GetMapping("/data")
public ResponseEntity<ByteArrayResource> fetchData(@RequestParam(name = "query", required = false) String query) {
// 查询数据并装入List<Map<String, Object>>
List<Map<String, Object>> dataList = repository.findBySomeCondition(query);
}
```
2. **创建CSV文件**:然后,你可以利用Apache Commons CSV库或者其他CSV处理库,如`com.opencsv`等,将Map列表转换成CSV字符串。
```java
import org.apache.commons.csv.CSVFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.stream.Collectors;
@GetMapping("/csv")
public ResponseEntity<ByteArrayResource> toCsv(@RequestParam("data") List<Map<String, Object>> dataList) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CSVPrinter printer = new CSVPrinter(outputStream, CSVFormat.DEFAULT.withHeader(dataList.get(0).keySet()));
for (Map<String, Object> row : dataList) {
printer.printRecord(row.values());
}
printer.flush();
byte[] csvData = outputStream.toByteArray();
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.contentLength(csvData.length)
.body(new ByteArrayResource(csvData));
}
```
3. **错误处理**:别忘了添加适当的错误处理,比如当数据为空或者转换失败时。
4. **响应头设置**:为了让浏览器直接下载,可以考虑设置Content-Disposition响应头。
```java
response.setHeader("Content-Disposition", "attachment; filename=yourfile.csv");
```
阅读全文