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));
@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));