在Java中写入Excel文件通常使用Apache POI库,它提供了全面的API操作Excel(支持.xls和.xlsx格式),以下是详细实现步骤:
环境准备
-
添加Maven依赖:
<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>
-
导入关键类:
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; // .xlsx格式 import org.apache.poi.hssf.usermodel.HSSFWorkbook; // .xls格式 import java.io.FileOutputStream;
基础写入步骤
示例:创建Excel并写入数据
public class ExcelWriter { public static void main(String[] args) throws Exception { // 1. 创建工作簿(.xlsx格式) Workbook workbook = new XSSFWorkbook(); // 2. 创建工作表 Sheet sheet = workbook.createSheet("员工数据"); // 3. 创建表头行 Row headerRow = sheet.createRow(0); String[] headers = {"ID", "姓名", "部门"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); } // 4. 写入数据行 Object[][] data = { {1, "张三", "技术部"}, {2, "李四", "市场部"} }; for (int i = 0; i < data.length; i++) { Row dataRow = sheet.createRow(i + 1); // 从第2行开始 for (int j = 0; j < data[i].length; j++) { Cell cell = dataRow.createCell(j); cell.setCellValue(data[i][j].toString()); } } // 5. 自动调整列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 6. 写入文件 try (FileOutputStream fos = new FileOutputStream("员工表.xlsx")) { workbook.write(fos); } workbook.close(); System.out.println("Excel文件生成成功!"); } }
高级功能
设置单元格样式
// 创建样式 CellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置字体 Font font = workbook.createFont(); font.setBold(true); font.setColor(IndexedColors.BLUE.getIndex()); style.setFont(font); // 应用样式到表头 for (Cell cell : headerRow) { cell.setCellStyle(style); }
写入不同类型数据
Row row = sheet.createRow(4); row.createCell(0).setCellValue(true); // 布尔值 row.createCell(1).setCellValue(new Date());// 日期 row.createCell(2).setCellValue(5000.75); // 数字
处理大文件(SXSSF流式写入)
// 使用SXSSFWorkbook避免内存溢出 Workbook workbook = new SXSSFWorkbook(); Sheet sheet = workbook.createSheet(); for (int i = 0; i < 100000; i++) { Row row = sheet.createRow(i); row.createCell(0).setCellValue("大数据行:" + i); } // 清理临时文件 ((SXSSFWorkbook)workbook).dispose();
常见问题解决
-
文件格式问题:
.xls
(旧格式):使用HSSFWorkbook
.xlsx
(新格式):使用XSSFWorkbook
或SXSSFWorkbook
-
内存溢出:
- 超过10万行数据时,用
SXSSFWorkbook
并设置窗口大小:SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 保留100行在内存中
- 超过10万行数据时,用
-
列宽失效:
- 中文自动列宽可能不准,需手动计算:
sheet.setColumnWidth(0, 20 * 256); // 20字符宽度
- 中文自动列宽可能不准,需手动计算:
最佳实践
-
资源关闭:
使用try-with-resources确保关闭资源:try (Workbook workbook = new XSSFWorkbook(); FileOutputStream fos = new FileOutputStream("output.xlsx")) { workbook.write(fos); }
-
性能优化:
- 批量操作数据后再写入
- 避免频繁创建单元格样式
-
异常处理:
try { // 写入逻辑 } catch (IOException e) { System.err.println("文件写入失败: " + e.getMessage()); }
引用说明
本文代码基于 Apache POI 5.2.3 版本实现,官方文档参考:Apache POI官网。
Java Excel操作库对比:
- Apache POI:功能最全面,适合复杂场景
- EasyExcel(阿里):适合大数据量导出,内存优化更好
- JExcelAPI:仅支持.xls格式,已停止更新
提示:生产环境建议添加文件锁机制和写入权限校验,避免并发冲突和安全问题。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/35210.html