服务器测评网
我们一直在努力

java怎么导出excel?多 sheet、带样式、大数据量怎么处理?

在Java开发中,Excel文件导出是一项非常常见的需求,无论是数据报表生成、业务数据备份还是用户信息导出,都离不开这一功能,Java生态中有多种技术方案可以实现Excel导出,开发者可以根据项目需求、性能要求以及数据量大小选择合适的方式,本文将详细介绍几种主流的Excel导出方法,包括Apache POI、EasyExcel以及基于模板的导出方案,帮助开发者快速掌握实现技巧。

java怎么导出excel?多 sheet、带样式、大数据量怎么处理?

使用Apache POI实现Excel导出

Apache POI是Java领域操作Office文档最成熟的库之一,支持对Excel文件的读写操作,通过POI,开发者可以创建复杂的Excel表格,包括设置单元格样式、合并单元格、添加图片等功能,但需要注意在处理大数据量时可能会存在内存占用高的问题。

基础实现步骤

首先需要在项目中引入POI依赖,对于Maven项目,可在pom.xml中添加:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

实现导出时,核心流程包括创建工作簿(Workbook)、创建工作表(Sheet)、创建行(Row)和单元格(Cell),然后填充数据并输出到输出流,导出一个简单的用户信息表格:

public void exportExcel(HttpServletResponse response) throws IOException {
    // 创建工作簿(.xls用HSSFWorkbook,.xlsx用XSSFWorkbook)
    Workbook workbook = new XSSFWorkbook();
    Sheet sheet = workbook.createSheet("用户信息");
    // 创建表头
    Row headerRow = sheet.createRow(0);
    headerRow.createCell(0).setCellValue("ID");
    headerRow.createCell(1).setCellValue("姓名");
    headerRow.createCell(2).setCellValue("年龄");
    // 填充数据
    Row dataRow = sheet.createRow(1);
    dataRow.createCell(0).setCellValue(1);
    dataRow.createCell(1).setCellValue("张三");
    dataRow.createCell(2).setCellValue(25);
    // 设置响应头
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment; filename=user.xlsx");
    // 输出到输出流
    workbook.write(response.getOutputStream());
    workbook.close();
}

优化与注意事项

  • 版本选择:POI支持.xls(HSSFWorkbook)和.xlsx(XSSFWorkbook)两种格式,.xlsx格式兼容性更好,推荐优先使用。
  • 样式设置:可通过CellStyle设置字体、颜色、边框等,
    Font font = workbook.createFont();
    font.setBold(true);
    CellStyle style = workbook.createCellStyle();
    style.setFont(font);
    headerRow.getCell(0).setCellStyle(style);
  • 大数据量处理:对于超过6万行数据,建议使用SXSSFWorkbook(流式API),避免内存溢出。

使用EasyExcel简化导出流程

EasyExcel是阿里巴巴开源的Excel处理框架,基于POI优化,解决了大数据量内存占用高的问题,同时提供了更简洁的API,适合快速开发。

核心优势与依赖引入

EasyExcel的主要优势包括:低内存占用(采用SAX模式解析)、读写性能高、API简洁,Maven依赖如下:

java怎么导出excel?多 sheet、带样式、大数据量怎么处理?

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

简单实现示例

EasyExcel通过实体类映射Excel列,使用注解配置列名和样式,首先定义实体类:

@Data
public class User {
    @ExcelProperty("ID")
    private Integer id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

导出时只需调用ExcelWriter

public void exportWithEasyExcel(HttpServletResponse response) throws IOException {
    List<User> dataList = Arrays.asList(
        new User(1, "张三", 25),
        new User(2, "李四", 30)
    );
    String fileName = "user.xlsx";
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));
    EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息").doWrite(dataList);
}

高级功能

  • 复杂表头:通过@ExcelPropertyindexconverter属性自定义表头层级。
  • 样式定制:实现CellWriteHandler接口,在单元格写入时设置样式。
  • 模板导出:预先设计Excel模板,通过EasyExcel.write(templatePath).fill(dataList)填充数据。

基于模板的导出方案

在实际业务中,Excel报表往往需要固定的格式(如公司Logo、合并单元格、计算公式等),此时基于模板导出更为高效,无论是POI还是EasyExcel,都支持模板文件填充。

EasyExcel模板导出示例

  1. 准备模板文件:使用Excel设计模板,需填充的数据用占位,如{name}

  2. 填充数据

    java怎么导出excel?多 sheet、带样式、大数据量怎么处理?

    public void exportByTemplate(HttpServletResponse response) throws IOException {
     String templatePath = "template/user_template.xlsx";
     Map<String, Object> data = new HashMap<>();
     data.put("name", "张三");
     data.put("age", 25);
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
     response.setHeader("Content-disposition", "attachment;filename=user.xlsx");
     EasyExcel.write(response.getOutputStream()).withTemplate(templatePath).sheet().doFill(data);
    }

POI模板导出

POI需先读取模板文件,再修改指定单元格:

Workbook workbook = new XSSFWorkbook(new FileInputStream("template.xlsx"));
Sheet sheet = workbook.getSheet(0);
Row row = sheet.getRow(1);
Cell cell = row.getCell(0);
cell.setCellValue("新数据");
workbook.write(response.getOutputStream());

性能对比与场景选择

方案 内存占用 性能 学习成本 适用场景
Apache POI 复杂格式、小数据量
EasyExcel 大数据量、快速开发
模板导出 依赖方案 固定格式报表
  • 小数据量+复杂样式:选择Apache POI,灵活控制单元格样式。
  • 大数据量+简单导出:优先EasyExcel,避免OOM问题。
  • 固定格式报表:基于模板导出,提高开发效率。

常见问题与解决方案

  1. 中文乱码:确保文件名和内容使用UTF-8编码,响应头设置charset=utf-8
  2. 日期格式化:通过@DateTimeFormat注解或CellStylesetDataFormat方法处理。
  3. 大数据量OOM:使用EasyExcel的SXSSFWorkbook或POI的SXSSF模式,启用sheet.setRandomAccessMode(RandomAccessMode.READ_WRITE)

通过以上方法,开发者可以根据实际需求灵活选择Excel导出方案,高效实现业务功能,在实际开发中,还需注意异常处理和资源释放,确保程序的稳定性。

赞(0)
未经允许不得转载:好主机测评网 » java怎么导出excel?多 sheet、带样式、大数据量怎么处理?