spring boot 中的多个 Excel 文件

Multiple Excel file in sprint boot

有没有办法通过 spring 引导创建 多个 excel 文件而不是多个工作 sheets ? 我一直在使用 apache poi 生成 excel.

@GetMapping("/export/excel")
    public void exportToExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/octet-stream");
        String headerKey = "Content-Disposition";
        String headervalue = "attachment; filename=Customer.xlsx";
        response.setHeader(headerKey, headervalue);
        List<cusEntity> data1= customerRepo.fetchEmailData();
        UserExcelExporter exp = new UserExcelExporter(data1);
        exp.export(response);
}

public class UserExcelExporter {
    private XSSFWorkbook workbook;
    private XSSFSheet sheet;
    private List<EmailDataEntity> listClients;

public UserExcelExporter(List<cusEntity> listClients) {
    this.listClients=listClients;
    workbook = new XSSFWorkbook();
}

private void createCell(Row row, int columnCount, Object value, CellStyle style) {
    sheet.autoSizeColumn(columnCount);
    Cell cell=row.createCell(columnCount);
    if(value instanceof Long) {
        cell.setCellValue((Long) value);
    }else if(value instanceof Integer) {
        cell.setCellValue((Integer) value);
    }else if(value instanceof Boolean) {
        cell.setCellValue((Boolean) value);
    }else {
        cell.setCellValue((String) value);
    }
    cell.setCellStyle(style);
}

private void writeHeaderLine(String iteration) {
        sheet = workbook.createSheet("Report");
        Row row = sheet.createRow(0);
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        createCell(row,0,"Trust & Agency Service",style);
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,6));
        font.setFontHeightInPoints((short)(10));
    }

private void writeDataLines() {
    int rowCount=1;
    CellStyle style=workbook.createCellStyle();
    XSSFFont font=workbook.createFont();
    font.setFontHeight(14);
    style.setFont(font);
    for(cusEntity client:listClients) {
        Row row=sheet.createRow(rowCount++);
        int columnCount=0;
        createCell(row, columnCount++, client.getname(), style);
    }
}

public void export(HttpServletResponse response,String iteration) throws IOException{
    writeHeaderLine(iteration);
    writeDataLines();
    ServletOutputStream outputStream=response.getOutputStream();
    workbook.write(outputStream);
    workbook.close();
    outputStream.close();
}

}

当我尝试重复 exp.export(response) 的代码时,它给了我 1 excel 并且对于下一个 excel 它说 The workbook already contains a sheet 命名为 'Report'。 我认为如果它创建了 2 excel 那么具有相同的 worksheet 名称应该不是问题。 但似乎它试图创建另一个 sheet 而不是另一个 excel 。 如果我错了请纠正我。

感谢团队。

我认为这里的重点是你在混淆概念。

excel文件实际上是工作簿,而这里的sheet只是excel文件中的选项卡。

因此,如果您想要一个新的 excel 文件,您必须创建一个新的工作簿。

并且每个工作簿可以包含多个 sheets(选项卡),但是每个工作簿都必须有一个唯一的名称(这就是为什么它不允许另一个 sheet 在同一个文件中使用相同的名称)

我的方法是改变输出流: 并从 HomeController

传递文件名
OutputStream outputStream = new FileOutputStream(String.format("C:\Users\kasis\ExcelFolder\%s.xlsx",fileName));