java基于poi-ooxml编写Excel导出的工具类
作者: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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!