杰瑞科技汇

Java如何导出Excel并保存?

Java 导出 Excel 并保存

在 Java 中导出 Excel 文件并保存到本地,有多种方法可以实现,以下是几种常用的方案:

Java如何导出Excel并保存?-图1
(图片来源网络,侵删)

使用 Apache POI (推荐)

Apache POI 是最流行的 Java 操作 Office 文件的库。

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;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelExporter {
    public static void main(String[] args) {
        // 1. 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 2. 创建工作表
        Sheet sheet = workbook.createSheet("员工信息");
        // 3. 创建表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("姓名");
        headerRow.createCell(1).setCellValue("年龄");
        headerRow.createCell(2).setCellValue("部门");
        // 4. 添加数据
        Object[][] data = {
            {"张三", 28, "技术部"},
            {"李四", 32, "市场部"},
            {"王五", 25, "财务部"}
        };
        for (int i = 0; i < data.length; i++) {
            Row row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue((String) data[i][0]);
            row.createCell(1).setCellValue((Integer) data[i][1]);
            row.createCell(2).setCellValue((String) data[i][2]);
        }
        // 5. 自动调整列宽
        for (int i = 0; i < 3; i++) {
            sheet.autoSizeColumn(i);
        }
        // 6. 保存文件
        try (FileOutputStream outputStream = new FileOutputStream("员工信息.xlsx")) {
            workbook.write(outputStream);
            System.out.println("Excel 文件已成功保存!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用 EasyExcel (阿里巴巴开源)

EasyExcel 是基于 POI 封装的,更简单易用,适合大数据量导出。

Maven 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

示例代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelExporter {
    public static void main(String[] args) {
        // 1. 准备数据
        List<User> dataList = new ArrayList<>();
        dataList.add(new User("张三", 28, "技术部"));
        dataList.add(new User("李四", 32, "市场部"));
        dataList.add(new User("王五", 25, "财务部"));
        // 2. 创建Excel文件并写入数据
        String fileName = "员工信息_EasyExcel.xlsx";
        // 3. 设置样式
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 11);
        headWriteFont.setBold(true);
        headWriteCellStyle.setWriteFont(headWriteFont);
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 10);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = 
            new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        // 4. 写入Excel
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, User.class)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet("员工信息").build();
            excelWriter.write(dataList, writeSheet);
            System.out.println("Excel 文件已成功保存!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 数据模型类
    public static class User {
        private String name;
        private Integer age;
        private String department;
        public User(String name, Integer age, String department) {
            this.name = name;
            this.age = age;
            this.department = department;
        }
        // getter和setter方法
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public Integer getAge() { return age; }
        public void setAge(Integer age) { this.age = age; }
        public String getDepartment() { return department; }
        public void setDepartment(String department) { this.department = department; }
    }
}

使用 JXL (较老但简单)

JXL 是一个轻量级的 Excel 操作库,但只支持旧版 Excel(.xls)格式。

Maven 依赖

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

示例代码

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import java.io.File;
import java.io.IOException;
public class JxlExporter {
    public static void main(String[] args) {
        String fileName = "员工信息_JXL.xls";
        try {
            // 1. 创建可写入的Excel工作簿
            WritableWorkbook workbook = Workbook.createWorkbook(new File(fileName));
            // 2. 创建工作表
            WritableSheet sheet = workbook.createSheet("员工信息", 0);
            // 3. 添加表头
            sheet.addCell(new Label(0, 0, "姓名"));
            sheet.addCell(new Label(1, 0, "年龄"));
            sheet.addCell(new Label(2, 0, "部门"));
            // 4. 添加数据
            Object[][] data = {
                {"张三", 28, "技术部"},
                {"李四", 32, "市场部"},
                {"王五", 25, "财务部"}
            };
            for (int i = 0; i < data.length; i++) {
                sheet.addCell(new Label(0, i + 1, (String) data[i][0]));
                sheet.addCell(new Label(1, i + 1, data[i][1].toString()));
                sheet.addCell(new Label(2, i + 1, (String) data[i][2]));
            }
            // 5. 写入文件并关闭
            workbook.write();
            workbook.close();
            System.out.println("Excel 文件已成功保存!");
        } catch (IOException | WriteException e) {
            e.printStackTrace();
        }
    }
}

使用 SXSSFWorkbook (大数据量导出)

当需要导出大量数据时,可以使用 SXSSFWorkbook 来避免内存溢出。

Java如何导出Excel并保存?-图2
(图片来源网络,侵删)

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.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class LargeDataExcelExporter {
    public static void main(String[] args) {
        // 1. 创建SXSSFWorkbook,设置窗口大小(内存中保留的行数)
        Workbook workbook = new SXSSFWorkbook(100); // 内存中保留100行,其余写入临时文件
        // 2. 创建工作表
        Sheet sheet = workbook.createSheet("大数据量数据");
        // 3. 创建表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("ID");
        headerRow.createCell(1).setCellValue("名称");
        headerRow.createCell(2).setCellValue("描述");
        // 4. 添加大量数据
        for (int i = 1; i <= 100000; i++) {
            Row row = sheet.createRow(i);
            row.createCell(0).setCellValue(i);
            row.createCell(1).setCellValue("项目" + i);
            row.createCell(2).setCellValue("这是第" + i + "个项目的描述");
        }
        // 5. 保存文件
        try (FileOutputStream outputStream = new FileOutputStream("大数据量.xlsx")) {
            workbook.write(outputStream);
            System.out.println("大数据量Excel文件已成功保存!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ((SXSSFWorkbook) workbook).dispose(); // 清理临时文件
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
方案 优点 缺点 适用场景
Apache POI 功能强大,支持所有Excel功能 API较复杂,大数据量会内存溢出 需要复杂操作或中小数据量
EasyExcel 简单易用,大数据量性能好 功能相对POI较少 大数据量导出,简单报表
JXL 轻量级,简单 只支持.xls格式,已停止更新 简单需求,旧版Excel
SXSSF 专门针对大数据量 功能受限,需要清理临时文件 超大数据量导出

根据你的具体需求选择合适的方案,对于大多数应用场景,Apache POI 或 EasyExcel 是不错的选择。

Java如何导出Excel并保存?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇