上一篇                     
               
			  Java如何写入Excel数据?
- 后端开发
- 2025-06-22
- 4749
 在Java中写入Excel文件通常使用Apache POI库,创建Workbook对象(如XSSFWorkbook),构建Sheet、Row和Cell结构,通过setCellValue方法填充数据,最后用FileOutputStream将工作簿写入磁盘文件。
 
在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格式,已停止更新
提示:生产环境建议添加文件锁机制和写入权限校验,避免并发冲突和安全问题。
 
  
			