如何使用Spring Boot控制器下载带有内容的CSV文件?

4

我在下载CSV文件时遇到了问题。 我在Spring Boot中创建了一个GET API,并希望通过该API下载文件。以下是我的代码。

@GetMapping(value = "/citydetails/download")
public ResponseEntity<Object> getCityDetails() throws IOException {
    System.out.println("Starting the rest call.");
    FileWriter filewriter = null;
    service = new LocalityService();
    try {
        List<CityDetails> details = service.getCityDetailsList();
        if (details.isEmpty()) {
            System.out.println("List is empty.");
        }
        StringBuilder fileContent = new StringBuilder("STATE,DISTRICT,CITY,VILLAGE,PIN\n");
        for (CityDetails data : details)
            fileContent.append(data.getStatename()).append(data.getDistrict()).append(data.getCity())
                    .append(data.getVillage()).append(data.getPindode());

        XSSFWorkbook workbook = service.saveFileContents(details);
        String filename = "C:\\Users\\" + System.getProperty("user.name") + "\\Downloads\\cityDetails.csv";
        FileOutputStream out = new FileOutputStream(filename);
        File file = new File("cityDetails.csv");
        workbook.write(out);
        out = new FileOutputStream(file);


        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("text/csv"))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + "cityDetails.csv" + "\"")
                .body(file);
    } catch (Exception ex) {
        System.out.println("Failed to execute rest" + ex.getStackTrace() + "Locale: " + ex.getLocalizedMessage());
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), "false");
        return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
    } finally {
        if (filewriter != null)
            filewriter.close();
    }
}

异常: enter image description here

我使用了 XSSFWorkbook 将内容保存为 csv。现在我想要通过 Rest Api 下载包含数据的 csv 文件。我尝试了多种方法,但下载的文件都是空的。使用上述代码将会在 Windows 机器的下载文件夹中保存 csv 文件,但我希望这个 Api 在每台系统上都能正常工作,所以我想要直接下载包含内容的 csv 文件而不是保存到特定位置。我遇到了问题,请问如何解决?


有什么问题吗?你不知道如何返回响应吗? - PatrickChen
我想通过这个API下载CSV文件,我尝试了几种方法但都失败了。 - Ravi Kumar
更好的做法是列出代码或异常信息,有很多种方法可以通过API下载文件,请查看此链接:https://dev59.com/xlsV5IYBdhLWcg3w4iFA - PatrickChen
我已经尝试过了,但文件是空的,没有任何内容。 - Ravi Kumar
请确保媒体类型正确,我发布了一些旧的代码示例,您可以尝试。 - PatrickChen
3个回答

3
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet=wkb.createSheet("sheet1");
HSSFRow row1=sheet.createRow(0);
HSSFCell cell=row1.createCell(0);
cell.setCellValue("table_demo");
sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));

//input Excel date
HSSFRow row2=sheet.createRow(1);    
row2.createCell(0).setCellValue("name");
row2.createCell(1).setCellValue("class");    
row2.createCell(2).setCellValue("score_1");
row2.createCell(3).setCellValue("score_2");    
HSSFRow row3=sheet.createRow(2);
row3.createCell(0).setCellValue("Jeams");
row3.createCell(1).setCellValue("High 3");
row3.createCell(2).setCellValue(87);    
row3.createCell(3).setCellValue(78);    

//output Excel file
OutputStream output=response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=details.xls");
response.setContentType("application/msexcel");        
wkb.write(output);
output.close();

这段代码可以获取一个简单的Excel文件


1
//image
@GetMapping(value = "/image")
public @ResponseBody byte[] getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}


//normal file
@GetMapping(
  value = "/get-file",
  produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
public @ResponseBody byte[] getFile() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/data.txt");
    return IOUtils.toByteArray(in);
}


0
要以csv格式获取输出或响应,我们必须使用open csv依赖项或apachepoicsv依赖项。 当我们使用HSSF(可怕的电子表格格式)时,它用于读写MS-Excel文件的xls格式。
XSSF(XML电子表格格式)- 用于MS-Excel的xlsx文件格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接