上一篇
java怎么导出excel
- 后端开发
- 2025-08-03
- 3694
va可通过Apache POI库操作Workbook对象创建Excel文件,设置单元格数据后写入输出流
是关于Java如何导出Excel的详细指南,涵盖主流库的使用、代码示例及最佳实践:
Apache POI(功能全面)
- 适用场景:需要精细控制单元格样式、公式或复杂格式时首选,支持新旧版Excel(.xls和.xlsx)。
- 依赖配置:Maven项目中需添加以下三个核心组件:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.9</version> </dependency>
- 基本实现步骤
| 步骤 | 作用 | 关键类/方法 |
|——|——-|————–|
| 创建Workbook实例 | 根据文件类型选择HSSF(旧版)或XSSF(新版) |new XSSFWorkbook()
|
| 添加Sheet页 | 指定名称和索引位置 |workbook.createSheet("数据表")
|
| 构建表头行 | 遍历列名创建首行单元格 |Row headerRow = sheet.createRow(0); headerRow.createCell(i).setCellValue("列名")
|
| 填充数据区 | 逐行写入业务数据 |for循环中调用row.getCell(colNum).setCellValue(value)
|
| 设置样式属性 | 包括字体加粗、背景色等美化操作 |CellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER);
|
| 输出到流 | 通过字节流保存物理文件 |FileOutputStream → workbook.write()
| - 优势特点:支持图表嵌入、条件格式、数据验证等高级特性;适合生成带有复杂格式要求的报表,但学习曲线较陡,代码量相对较大。
JExcelApi(简单轻量)
- 定位差异:专注于基础读写操作,仅兼容Excel 97-2003格式(.xls),适合不需要现代特性的传统系统迁移场景。
- 典型用法示例:
WritableWorkbook wb = Workbook.createWorkbook(new File("output.xls")); WritableSheet sheet = wb.createSheet("第一页", 0); Label titleCell = new Label(0, 0, "用户名"); // 坐标从0开始计数 sheet.addCell(titleCell); Number numCell = new Number(1, 0, 28); // (列索引, 行索引, 数值) sheet.addCell(numCell); wb.write(); // 自动关闭并刷盘
- 性能考量:由于不支持SXSSF模式,大数据量场景下容易出现内存瓶颈,建议配合分批写入策略使用。
EasyExcel(阿里开源方案)
- 设计哲学:通过注解映射实现极简API,天然支持大数据分块处理,特别适合Web应用中的动态导出需求。
- 快速上手模板:
// 定义模型类 public class UserDTO { @ExcelProperty("登录名称") private String loginName; @ExcelProperty("注册时间") private Date registerDate; // getters/setters省略... } // 执行导出 List<UserDTO> dataList = queryDatabase(); EasyExcel.write("用户清单.xlsx") .head(UserDTO.class) .sheet("会员信息") .doWrite(dataList);
- 性能优化技巧:当单次导出超过5万条记录时,可采用分页机制:
int batchSize = 1000; for (int start=0; start<total; start+=batchSize){ int end = Math.min(start+batchSize, total); EasyExcel.write(filePath) .head(HeadClass.class) .sheet("Sheet1") .doWrite(subList(start, end)); }
- 扩展能力:通过实现
WriteHandler
接口可自定义渲染逻辑,如自动换行、特殊标记高亮等。
方案对比矩阵
特性 | Apache POI | JExcelApi | EasyExcel |
---|---|---|---|
功能完整性 | |||
API简洁度 | |||
大数据支持 | SXSSF模式可用 | 不支持 | 内置分页机制 |
样式控制精度 | 像素级控制 | 基础样式 | 中等灵活性 |
社区活跃度 | 国际广泛使用 | 维护停滞 | 国内生态完善 |
推荐应用场景 | 企业级复杂报表 | 遗留系统维护 | 互联网项目快速迭代 |
FAQs
Q1:遇到乱码问题怎么解决?
A:确保所有文本类型的单元格都明确设置为UTF-8编码格式,对于POI用户,可在创建Workbook后执行workbook.setCharset(StandardCharsets.UTF_8)
;EasyExcel则默认使用UTF-8,若出现异常需检查源码文件的实际编码是否匹配。
Q2:如何防止数字被科学计数法显示?
A:在POI中创建单元格时指定单元格类型为STRING类型;使用EasyExcel时,可在@ExcelProperty注解中添加参数format = "#{}"
强制按原样显示长数字串,`@ExcelProperty(value = “身份证号”, format = “#{}