Java导出Excel/xlsx实战(带插入图片及多Sheet页)

前言

在Web做大屏的项目中经常会使用Echart做数据可视化,在此需求下用户经常会有保存这些Echart信息及即时统计数据的需求,本文以 前端完成[截图]也就是将Echart的dom元素转换成base64图片编码为前提,发送给服务端,依赖于HUTOOL java工具包官网地址 完成对Excel插入图片,插入数值,编辑多Sheet页,修改Excel样式的操作。

先看一下最终效果截图
在这里插入图片描述

PS: Hutool也是基于Poi封装功能,对于开发者比Poi更加易用。文档中关键类名cn.hutool.poi.excel
Excel 写入器
此工具用于通过POI将数据写出到Excel,此对象可完成以下两个功能

  1. 编辑已存在的Excel,可写出原Excel文件,也可写出到其它地方(到文件或到流)
  2. 新建一个空的Excel工作簿,完成数据填充后写出(到文件或到流)

依赖引用

项目工程基于gradle构建,直接在dependencies.gradle文件中引用Hutool。引用前注意版本,低于截图中版本可能有部分功能还未支持。在这里插入图片描述

服务端定义RESTFUL接口

接收前端数据DTO定义

根据自身业务确定需要用到的数据

import io.swagger.annotations.ApiModelProperty;

import java.util.List;
import java.util.Map;
/**
 * @创建人 CSDN不会吉他更不会写代码
 * @创建时间 2022/04/15
 * @描述 导出xlsx 所需要的数据从前端传来
 */
public class ExportModel {
    @ApiModelProperty(value = "base64 图片")
    private String image;

    @ApiModelProperty(value = "查询的时间")
    private String month;

    @ApiModelProperty(value = "sheet页的name")
    private String name;

    @ApiModelProperty(value = "当月统计数据")
    private  Object data;
    
    public ExportModel() {
    }
    Getter  Setter...
}

接口定义

HttpServletResponse类是关键

import javax.servlet.http.HttpServletResponse;
import java.util.List;


public interface ExportXLSXService {

    /**
     * 导出 Excel
     * 创建人 CSDN不会吉他更不会写代码
     * @return file
     */
    Boolean export(HttpServletResponse response, List<ExportModel> exportModel);
}

接口实现

笔者平常写代码爱写注释 关键代码的功能都在注释中写出。xxx是项目中的数据脱敏,可以忽视。

/**
     * 导出 Excel
     * 创建人 CSDN不会吉他更不会写代码
     * @param exportModel
     * @return file
     */
    @Override
    public Boolean export(HttpServletResponse response, List<ExportModel> exportModel) {
        // 获取当前区间的月份
        List monthList = DateUtils.getExportTime(exportModel.get(0).getMonth());
        String time = monthList.get(0).toString().substring(0, 10) + "~" + monthList.get(1).toString().substring(0, 10);
        Boolean result;
        // 初始化Hutool中操作Excel的对象(基于Poi)
        ExcelWriter excelWriter = new ExcelWriter(true, "XXX");
        //设置标题字体
        Font titleFont = excelWriter.createFont();
        //设置字体
        titleFont.setFontName("黑体");
        //设置标题字体大小
        titleFont.setFontHeightInPoints((short) 11);
        CellStyle keyCellStyle = excelWriter.getOrCreateRowStyle(2);
        keyCellStyle.setFont(titleFont);
        // 设置边框
        keyCellStyle.setBorderBottom(BorderStyle.THIN);
        keyCellStyle.setBorderTop(BorderStyle.THIN);
        keyCellStyle.setBorderLeft(BorderStyle.THIN);
        keyCellStyle.setBorderRight(BorderStyle.THIN);
        keyCellStyle.setAlignment(HorizontalAlignment.LEFT);
        exportModel.forEach(model -> {
            // 第一次循环时改sheet名
            if (exportModel.indexOf(model) == 0) {
                excelWriter.renameSheet(0, model.getName());
            } else {
                // 设置sheet页名
                excelWriter.setSheet(model.getName());
            }
            switch (model.getName()) {
                // 第一个Sheet Overall Performance
                case "Overall Performance": {
                    excelWriter.merge(1, time, true);
                    excelWriter.merge(1, "Sheet页Title标题", true);
                    // 取业务数据插值
                    List<String> row1 = CollUtil.newArrayList("xxx", model.getMonth());
                    List<String> row2 = CollUtil.newArrayList("xxx", model.getData().toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2);
                    excelWriter.write(rows, true);
                    // 循环给标题cell单元格设置样式
                    for (int i = 0; i <= 1; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    // 第二个参数枚举值可以看看文档中能生成什么格式的图片,我使用JPEG格式,后几个int参数为写入图片相较于index(0,0)的位置
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 6, 4, 26);
                    break;
                }
                case "Recurrent Cases(Only)": {
                    List<RecurrentCaseCountModel> data = (List<RecurrentCaseCountModel>) model.getData();
                    List<List> list = recurrentCase(data);
                    excelWriter.merge(4, time);
                    excelWriter.merge(4, "xxx");
                    // 漫长的取值插值
                    List<String> row1 = CollUtil.newArrayList("Key Statistics for the month", "Cleaning (SLA: <20%)", "xxx (SLA: <5%)", "xxx(SLA: 0%)", "xxx(SLA: <10%)");
                    List<String> row2 = CollUtil.newArrayList("Total volume of CM cases per category", list.get(0).get(0).toString(), list.get(3).get(0).toString(), list.get(4).get(0).toString(), list.get(2).get(0).toString());
                    List<String> row3 = CollUtil.newArrayList("% recurrent", list.get(0).get(1).toString(), list.get(3).get(1).toString(), list.get(4).get(1).toString(), list.get(2).get(1).toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3);
                    excelWriter.write(rows, true);
                    // 循环给标题cell单元格设置样式
                    for (int i = 0; i <= 4; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 9, 5, 28);
                    break;
                }
                case "Summary Of All Handled In The Past 6 Months": {
                    List<HandledCaseCountModel> data = (List<HandledCaseCountModel>) model.getData();
                    List<List> list = handledCase(data);
                    // 合并单元格
                    excelWriter.merge(4, time);
                    excelWriter.merge(4, "Summary Of All Cases Handled In The Past 6 Months");
                    // 漫长的取值插值
                    List<String> row1 = CollUtil.newArrayList("Key Statistics for the month", "xxx", "xxx/xxx", "xxx", "xxx");
                    List<String> row2 = CollUtil.newArrayList("Total self-reported cases", list.get(0).get(0).toString(), list.get(3).get(0).toString(), list.get(4).get(0).toString(), list.get(2).get(0).toString());
                    List<String> row3 = CollUtil.newArrayList("Total xxx", list.get(0).get(1).toString(), list.get(3).get(1).toString(), list.get(4).get(1).toString(), list.get(2).get(1).toString());
                    List<String> row4 = CollUtil.newArrayList("% self-reported out of total", list.get(0).get(2).toString(), list.get(3).get(2).toString(), list.get(4).get(2).toString(), list.get(2).get(2).toString());
                    List<String> row5 = CollUtil.newArrayList("% change of self-reported cases from previous month", list.get(0).get(3).toString(), list.get(3).get(3).toString(), list.get(4).get(3).toString(), list.get(2).get(3).toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
                    excelWriter.write(rows, true);
                    // 循环给标题cell单元格设置样式
                    for (int i = 0; i <= 4; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 9, 5, 28);
                    break;
                }
                case "xxx": {
                    // float结果保留两位小数
                    DecimalFormat df = new DecimalFormat("#.##");
                    df.setRoundingMode(RoundingMode.HALF_UP.HALF_UP);
                    Map data = (Map) model.getData();
                    List list = dataFTE(data);
                    Map Cleaning = (Map) data.get("xxx");
                    Map Enforcement = (Map) data.get("xxx");
                    Map Infra = (Map) data.get("xxx");
                    Map Pests = (Map) data.get("xxx");
                    Map Triaging = (Map) data.get("xxx");
                    excelWriter.merge(6, time);
                    excelWriter.merge(6, "Monthly Full-Time Equivalent (FTE) Manpower");
                    // 漫长的取值插值
                    List<String> row1 = CollUtil.newArrayList("Key Statistics for the month (in FTE)", "xxx", "xxx", "xxx", "xxx", "Triaging", "Total");
                    List<String> row2 = CollUtil.newArrayList("Preventive maintenance (PM)", Cleaning.get("Preventive maintenance (PM)").toString(), Pests.get("Preventive maintenance (PM)").toString(), Infra.get("Preventive maintenance (PM)").toString(), Enforcement.get("Preventive maintenance (PM)").toString(), "", df.format(Double.valueOf(Cleaning.get("Preventive maintenance (PM)").toString()) + Double.valueOf(Pests.get("Preventive maintenance (PM)").toString()) + Double.valueOf(Infra.get("Preventive maintenance (PM)").toString()) + Double.valueOf(Enforcement.get("Preventive maintenance (PM)").toString())));
                    List<String> row3 = CollUtil.newArrayList("CM - xxx", Cleaning.get("CM - xxx").toString(), Pests.get("CM - xxx").toString(), Infra.get("CM - xxx").toString(), Enforcement.get("CM - xxx").toString(), "", df.format(Double.valueOf(Cleaning.get("CM - xxx").toString()) + Double.valueOf(Pests.get("CM - xxx").toString()) + Double.valueOf(Infra.get("CM - xxx").toString()) + Double.valueOf(Enforcement.get("CM - xxx").toString())));
                    List<String> row4 = CollUtil.newArrayList("CM - Self", Cleaning.get("CM - Self").toString(), Pests.get("CM - Self").toString(), Infra.get("CM - Self").toString(), Enforcement.get("CM - Self").toString(), "", df.format(Double.valueOf(Cleaning.get("CM - Self").toString()) + Double.valueOf(Pests.get("CM - Self").toString()) + Double.valueOf(Infra.get("CM - Self").toString()) + Double.valueOf(Enforcement.get("CM - Self").toString())));
                    List<String> row5 = CollUtil.newArrayList("Triaging", "", "", "", "", Triaging.get("Triaging").toString(), "");
                    List<String> row6 = CollUtil.newArrayList("Total", list.get(0).toString(), list.get(1).toString(), list.get(2).toString(), list.get(3).toString(), "", list.get(4).toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5, row6);
                    excelWriter.write(rows, true);
                    // 循环给标题cell单元格设置样式
                    for (int i = 0; i <= 6; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 10, 7, 28);
                    break;
                }
                case "Misrouted Cases (xxx Only)": {
                    List<MisRoutedCountModel> data = (List<MisRoutedCountModel>) model.getData();
                    List<List> list = misroutedCase(data);
                    excelWriter.merge(4, time);
                    excelWriter.merge(4, "Misrouted Cases (xxxOnly)");
                    List<String> row1 = CollUtil.newArrayList("Key Statistics for the month", "xxx", "xxx/xxx", "xxx", "xxx");
                    List<String> row2 = CollUtil.newArrayList("Total xxx", list.get(0).get(0).toString(), list.get(1).get(0).toString(), list.get(2).get(0).toString(), list.get(3).get(0).toString());
                    List<String> row3 = CollUtil.newArrayList("Total xxxMisrouted Cases", list.get(0).get(1).toString(), list.get(1).get(1).toString(), list.get(2).get(1).toString(), list.get(3).get(1).toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3);
                    excelWriter.write(rows, true);
                    for (int i = 0; i <= 4; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 10, 5, 28);
                    break;
                }
                case "Cases Which Exceeded The Case Resolution Time (xxxonly)": {
                    List<ExceededCaseCountModel> data = (List<ExceededCaseCountModel>) model.getData();
                    List<List> list = exceededData(data);
                    excelWriter.merge(4, time);
                    excelWriter.merge(4, "Cases Which Exceeded The Case Resolution Time (xxxonly)");
                    List<String> row1 = CollUtil.newArrayList("Key Statistics for the month", "xxx", "xxx/xxx", "xxx", "xxx");
                    List<String> row2 = CollUtil.newArrayList("Total volume of corrective maintenance (CM) cases per category", list.get(0).get(0).toString(), list.get(1).get(0).toString(), list.get(2).get(0).toString(), list.get(3).get(0).toString());
                    List<String> row3 = CollUtil.newArrayList("% failed time-based SLA*", list.get(0).get(1).toString(), list.get(1).get(1).toString(), list.get(2).get(1).toString(), list.get(3).get(1).toString());
                    List<String> row4 = CollUtil.newArrayList("% closed within 0.5 days/2 days before time-based SLA for cleaning/other services respectively**", list.get(0).get(2).toString(), list.get(1).get(2).toString(), list.get(2).get(2).toString(), list.get(3).get(2).toString());
                    List<String> row5 = CollUtil.newArrayList("Case resolution time for 90th percentile", list.get(0).get(3).toString(), list.get(1).get(3).toString(), list.get(2).get(3).toString(), list.get(3).get(3).toString());
                    List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
                    excelWriter.write(rows, true);
                    for (int i = 0; i <= 4; i++) {
                        excelWriter.setStyle(keyCellStyle, i, 2);
                    }
                    excelWriter.autoSizeColumnAll();
                    // 插入图片
                    byte[] bytes = XLSXUtil.base64ToByte(model.getImage());
                    excelWriter.writeImg(bytes, Workbook.PICTURE_TYPE_JPEG, 0, 0, 0, 0, 0, 10, 5, 28);
                    break;
                }
            }
        });
        // 定义单元格背景色
        StyleSet style = excelWriter.getStyleSet();
        CellStyle headCellStyle = style.getHeadCellStyle();
        //设置内容字体
        Font font = excelWriter.createFont();
        //设置字体
        font.setFontName("黑体");
        //加粗
        font.setBold(false);
        //设置标题字体大小
        font.setFontHeightInPoints((short) 11);
        headCellStyle.setFont(font);
        // 合并单元格居中对齐
        excelWriter.getHeadCellStyle().setAlignment(HorizontalAlignment.CENTER);
        excelWriter.setStyleSet(style);
        // 常规单元格水平中间对齐,垂直中间对齐
        CellStyle cellStyle = excelWriter.getCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.LEFT);
        // 根据单元格内容自动调整单元格宽度
        excelWriter.autoSizeColumnAll();
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            excelWriter.flush(outputStream, true);
            logger.info("文件流已开始传输");
            result = true;
        } catch (IOException e) {
            logger.error("导出Excel输出到响应流失败---" + e);
            throw new BusinessException(ErrorCode.UNEXPECTED_ERROR);
        } finally {
            excelWriter.close();
            IoUtil.close(outputStream);
        }
        logger.info("Excel导出结束");
        return result;
    }

注意在方法的结尾一定要执行
excelWriter.close();
IoUtil.close(outputStream);

做好工具类生命周期的正常回收,不然服务上线后会发生预期之外的错误。

Controller层实现

/**
     * Excel导出
     * 创建人 CSDN不会吉他更不会写代码
     */
    @ApiOperation(value = "Excel导出")
    @ApiResponses({
            @ApiResponse(code = 200, message = "导出成功", response = ExportModel.class),
            @ApiResponse(code = 400, message = "客户端异常", response = HttpError.class),
            @ApiResponse(code = 500, message = "服务器异常", response = HttpError.class)
    })
    @PostMapping("/excel/export")
    public ResponseEntity<List<ExportModel>> fileDownload(HttpServletResponse response, @RequestBody @Validated List<ExportModel> exportModel) {
        List<ExportModel> data = dashboardService.countOneMonthDataForExcel(exportModel);
        Boolean result = exportXLSXService.export(response , data);
        return new ResponseEntity<>(HttpStatus.OK);
    }

只需要控制好Boolean值通知前端是否可以去取接口中的二进制文件即可
二进制Excel文件的生成已经在方法Impl层通过flush方法输出到了接口的Response body

测试调用结果

用Swagger测试 发现接口调用成功时 在ResponseBody中可以拿到二进制文件
在这里插入图片描述

服务端接口层面至此完成

前端后续对接

/**
   * 导出excel
   * 创建人 CSDN不会吉他更不会写代码
   * @param data [{name:'', image: '', data: any}]
   * @returns
   */
  async exportExcel(data: any) {
    const caseServiceUrl = store.getters.configs.dashboardUrl;
    const url = stringFormat(`${caseServiceUrl}${dashboardUrl.EXPORT_EXCEL}`);
    return await this.getBlob(url, data);
  },

  getBlob(url: any, exportModel: any) {
    return new Promise((resolve: any, reject: any) => {
      const accessToken = jsonParseOrElse(sessionStorage.getItem('token'), {})['access_token'];
      const xhr = new XMLHttpRequest();
      xhr.open('POST', url, true);
      xhr.responseType = 'blob';
      xhr.timeout = 180 * 1000;
      xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
      xhr.send(new Blob([JSON.stringify(exportModel)], {type: 'application/json'}));
      xhr.onload = () => {
        if (xhr.status === 200) {
          resolve(xhr.response);
        } else {
          reject();
        }
      };
      xhr.ontimeout = () => {
        reject('timeout');
      };
      xhr.onabort = () => {
        reject('abort');
      };
      xhr.onerror = (err) => {
        reject(err);
      };
    });
  },

/**
   * 导出excel
   * 创建人 CSDN不会吉他更不会写代码
   * @param name: 导出Excel文件的文件名
   * @returns
   */
  saveAs(blob: any, name: any) {
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = name;
    link.click();
  }

结语

本文基于实战应用,成功生成带图片多Sheet页的Excel xlsx,满足用户需求,并且在后续的运维期间未出过严重问题。这也是第一次写博客,有不成熟的地方多多指正,欢迎评论交流。
基于此功能前置技术点是前端完成截图,能搜到很多实现方法,如各位哥有需求,咱再出一篇前端截图技术实现~
That’s all 欢迎关注在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 好的,这是一个关于Java操作Excel的问题,我可以回答。要在Java导出多个SheetExcel,你需要使用Apache POI这个Java库。以下是一个示例代码,可以在Java导出包含多个SheetExcel文件: ``` import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExportExample { public static void main(String[] args) { try (Workbook workbook = new XSSFWorkbook()) { // 创建Sheet1 Sheet sheet1 = workbook.createSheet("Sheet1"); // 创建Sheet2 Sheet sheet2 = workbook.createSheet("Sheet2"); // 写入Sheet1数据 Cell cell11 = sheet1.createRow(0).createCell(0); cell11.setCellValue("Sheet1-Row1-Cell1"); // 写入Sheet2数据 Cell cell21 = sheet2.createRow(0).createCell(0); cell21.setCellValue("Sheet2-Row1-Cell1"); // 导出Excel文件 try (FileOutputStream outputStream = new FileOutputStream("example.xlsx")) { workbook.write(outputStream); } System.out.println("Excel导出成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例代码,我们使用XSSFWorkbook创建了一个新的Excel文件。然后我们创建了两个Sheet,分别是"Sheet1"和"Sheet2"。接着我们在每个Sheet创建了一个单元格,并写入了一些数据。最后我们使用FileOutputStream将Excel文件写入磁盘。 希望这个示例能够帮助到你! ### 回答2: 在Java,我们可以使用Apache POI库来导出多个sheetExcel文件。下面是一个简单的示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelExporter { public static void main(String[] args) { try (Workbook workbook = new XSSFWorkbook()) { // 创建第一个sheet Sheet sheet1 = workbook.createSheet("Sheet1"); // 创建第一个sheet的第一行,并设置数据 Row row1 = sheet1.createRow(0); Cell cell1 = row1.createCell(0); cell1.setCellValue("Sheet1的第一行,第一列的数据"); // 创建第二个sheet Sheet sheet2 = workbook.createSheet("Sheet2"); // 创建第二个sheet的第一行,并设置数据 Row row2 = sheet2.createRow(0); Cell cell2 = row2.createCell(0); cell2.setCellValue("Sheet2的第一行,第一列的数据"); // 保存Excel文件 try (FileOutputStream outputStream = new FileOutputStream("多个sheetExcel文件.xlsx")) { workbook.write(outputStream); } System.out.println("Excel文件导出成功"); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码使用了Apache POI库的`XSSFWorkbook`类来创建一个新的Excel文件。我们使用`createSheet`方法来创建多个sheet,并使用`createRow`和`createCell`方法来创建行和单元格,并设置相应的数据。最后,使用`FileOutputStream`将Workbook对象写入到文件。 以上代码只是一个简单的示例,您可以根据自己的需求来设置更多的行和单元格,并可以为每个sheet设置不同的数据。希望对您有帮助! ### 回答3: 在Java,可以使用Apache POI库来导出Excel多个sheet。首先,你需要在你的项目包含Apache POI库的依赖。 接下来,你可以创建一个Workbook对象,该对象代表整个Excel文档。使用Workbook对象的createSheet方法可以创建一个新的sheet。你可以使用sheet的setName方法来设置sheet的名称。 然后,你可以使用Row和Cell对象来创建和填充sheet的行和单元格。使用Row对象的createCell方法可以创建一个新的单元格,然后使用Cell对象的setCellValue方法来设置单元格的值。 最后,将生成的数据写入到Excel文件。你可以使用Workbook对象的write方法将Workbook对象的数据写入到文件。 以下是一个简单的示例代码来导出多个sheetExcel文件: ```java import org.apache.poi.ss.usermodel.*; import java.io.FileOutputStream; import java.io.IOException; public class ExportExcelMultiSheet { public static void main(String[] args) { Workbook workbook = new XSSFWorkbook(); createSheet(workbook, "Sheet1"); createSheet(workbook, "Sheet2"); createSheet(workbook, "Sheet3"); try (FileOutputStream fileOut = new FileOutputStream("output.xlsx")) { workbook.write(fileOut); } catch (IOException e) { e.printStackTrace(); } System.out.println("Excel文件导出成功!"); } private static void createSheet(Workbook workbook, String sheetName) { Sheet sheet = workbook.createSheet(sheetName); Row headerRow = sheet.createRow(0); Cell headerCell = headerRow.createCell(0); headerCell.setCellValue(sheetName + " Header"); Row dataRow = sheet.createRow(1); Cell dataCell = dataRow.createCell(0); dataCell.setCellValue(sheetName + " Data"); } } ``` 上述代码创建了一个名为"output.xlsx"的Excel文件,其包含了三个sheet,分别为"Sheet1"、"Sheet2"和"Sheet3"。每个sheet都包含了一个标题行和一个数据行。 希望上述信息能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值