java基于poi-ooxml编写Excel导出的工具类

 更新时间:2025年08月22日 10:15:53   作者:yujkss  
这篇文章主要为大家详细介绍了java如何基于poi-ooxml编写一个Excel导出功能的工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1. 添加poi-ooxml依赖

在 pom.xml 中添加 Apache POI 依赖:

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

2. Excel导出工具类

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

/**
 * Excel导出工具类
 */
public class ExcelExporter {

    /**
     * 导出数据到Excel文件
     * @param dataList  数据列表(泛型支持任意对象)
     * @param headers   表头配置,格式:{ {"列名1", "字段名1"}, {"列名2", "字段名2"} }
     * @param filePath  导出文件路径(如:/tmp/data.xlsx)
     */
    public static <T> void exportToExcel(List<T> dataList, String[][] headers, String filePath) {
        try (Workbook workbook = new XSSFWorkbook()) { // 创建Excel工作簿(xlsx格式)
            Sheet sheet = workbook.createSheet("Sheet1"); // 创建Sheet页

            // 1. 创建表头行
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i][0]); // 写入列名
            }

            // 2. 填充数据行
            for (int rowIdx = 0; rowIdx < dataList.size(); rowIdx++) {
                T data = dataList.get(rowIdx);
                Row dataRow = sheet.createRow(rowIdx + 1); // 数据从第2行开始

                // 通过反射获取字段值
                for (int colIdx = 0; colIdx < headers.length; colIdx++) {
                    String fieldName = headers[colIdx][1]; // 获取字段名
                    Object value = getFieldValue(data, fieldName);
                    
                    Cell cell = dataRow.createCell(colIdx);
                    setCellValue(cell, value); // 写入单元格值
                }
            }

            // 3. 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 4. 写入文件
            try (FileOutputStream fos = new FileOutputStream(filePath)) {
                workbook.write(fos);
            }
            System.out.println("Excel导出成功,路径:" + filePath);

        } catch (IOException | ReflectiveOperationException e) {
            System.err.println("导出Excel失败:" + e.getMessage());
        }
    }

    /**
     * 通过反射获取对象的字段值
     */
    private static <T> Object getFieldValue(T data, String fieldName) 
            throws NoSuchFieldException, IllegalAccessException {
        Field field = data.getClass().getDeclaredField(fieldName);
        field.setAccessible(true); // 允许访问私有字段
        return field.get(data);
    }

    /**
     * 设置单元格的值(支持String、Number、Boolean类型)
     */
    private static void setCellValue(Cell cell, Object value) {
        if (value == null) {
            cell.setCellValue("");
        } else if (value instanceof Number) {
            cell.setCellValue(((Number) value).doubleValue());
        } else if (value instanceof Boolean) {
            cell.setCellValue((Boolean) value);
        } else {
            cell.setCellValue(value.toString());
        }
    }
}
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 模拟数据
        List<User> userList = Arrays.asList(
            new User("张三", 25, true),
            new User("李四", 30, false)
        );

        // 表头配置:{ "列显示名", "实体类字段名" }
        String[][] headers = {
            {"姓名", "name"},
            {"年龄", "age"},
            {"是否VIP", "isVip"}
        };

        // 导出Excel
        ExcelExporter.exportToExcel(userList, headers, "users.xlsx");
    }
}

3.核心逻辑说明

泛型支持:工具类可导出任意对象列表,通过反射动态获取字段值。

表头灵活配置:通过二维数组定义表头显示名和对应字段名。

自动类型处理:支持 String、Number、Boolean 类型字段的自动转换。

资源自动关闭:使用 try-with-resources 确保流正确关闭。

列宽自适应:调用 autoSizeColumn 使列宽适应内容。

4.扩展建议

大数据量优化:若数据量超过万级,建议改用 SXSSFWorkbook(Apache POI流式API)避免内存溢出。

样式定制:可扩展工具类,添加单元格样式(字体、颜色、边框等)。

异常细化:根据业务需求增加更详细的异常处理逻辑。

此实现方案兼顾了简单性和通用性,适合快速集成到Spring Boot、普通Java项目等场景。

5.HSSF、XSSF、SXSSF

以下是HSSF、XSSF、SXSSF的核心原则和场景建议,帮助你在不同需求下快速决策

< 1万行:任选 HSSF 或 XSSF。

需要兼容旧版Office(如2003):选 HSSF。

需要现代Excel功能(如更多样式、公式):选 XSSF。

1万 ~ 100万行:必须选 SXSSF(避免内存溢出)。

> 100万行:SXSSF + 分Sheet存储(单Sheet最多104万行)。

小数据、兼容性优先 → HSSF。

中小数据、功能丰富 → XSSF。

大数据量、内存敏感 → SXSSF。

到此这篇关于java基于poi-ooxml编写Excel导出的工具类的文章就介绍到这了,更多相关java导出Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java servlet手机app访问接口(一)数据加密传输验证

    java servlet手机app访问接口(一)数据加密传输验证

    这篇文章主要为大家详细介绍了java servlet手机app访问接口(一),数据加密传输验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Springboot敏感字段脱敏的实现思路

    Springboot敏感字段脱敏的实现思路

    这篇文章主要介绍了Springboot敏感字段脱敏的实现思路,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • 如何利用MyBatisX插件自动生成代码

    如何利用MyBatisX插件自动生成代码

    这篇文章主要介绍了如何利用MyBatisX插件自动生成代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • MyBatis-Plus自动填充字段的详细教程

    MyBatis-Plus自动填充字段的详细教程

    今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字段(如创建时间 createTime 和更新时间 updateTime),可以分为以下几个部分,这个教程将涵盖从项目配置到自动填充的完整过程,需要的朋友可以参考下
    2024-08-08
  • Java实现JDBC批量插入原理详解

    Java实现JDBC批量插入原理详解

    在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的呢?本文将给大家介绍这背后的原理
    2023-03-03
  • spring整合JMS实现同步收发消息(基于ActiveMQ的实现)

    spring整合JMS实现同步收发消息(基于ActiveMQ的实现)

    本篇文章主要介绍了spring整合JMS实现同步收发消息(基于ActiveMQ的实现),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 关于idea2022.2 闪退的问题

    关于idea2022.2 闪退的问题

    最近更新了idea2022.2版本,这是一个比较大的软件版本更迭,下面小编给大家介绍下idea2022.2 闪退的问题及解决方法,需要的朋友可以参考下
    2022-08-08
  • Java数据库连接池技术的入门教程

    Java数据库连接池技术的入门教程

    这篇文章主要给大家介绍了关于Java数据库连接池技术的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 使用Java计算屏幕的PPI的方法详解

    使用Java计算屏幕的PPI的方法详解

    在现代电子设备中,屏幕的分辨率和显示效果是用户非常关注的一个指标,PPI(Pixels Per Inch,每英寸像素数)是衡量屏幕显示精度的重要参数之一,PPI越高,屏幕显示的图像越细腻,视觉效果越好,本文将详细介绍PPI的概念、计算方法,并通过Java代码实现PPI的计算
    2025-02-02
  • java实现文件的上传功能

    java实现文件的上传功能

    这篇文章主要为大家详细介绍了java实现文件的上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论