跳转至

Java 操作 Excel 全解析

简介

在日常的软件开发工作中,处理 Excel 文件是一项常见的任务。Java 作为一种广泛使用的编程语言,提供了丰富的库和工具来操作 Excel 文件。无论是读取数据、写入数据还是对 Excel 文件进行复杂的格式设置,Java 都能很好地胜任。本文将深入探讨 Java 操作 Excel 的基础概念、使用方法、常见实践以及最佳实践,帮助读者全面掌握这一重要技能。

目录

  1. Java Excel 基础概念
  2. 使用方法
    • 使用 Apache POI 操作 Excel
    • 使用 EasyExcel 操作 Excel
  3. 常见实践
    • 读取 Excel 数据
    • 写入 Excel 数据
    • 样式设置
  4. 最佳实践
    • 性能优化
    • 错误处理
  5. 小结
  6. 参考资料

Java Excel 基础概念

Excel 文件通常以 .xlsx(Office Open XML 格式)或 .xls(BIFF 格式)为扩展名。在 Java 中操作 Excel,我们需要借助第三方库来处理这些文件格式。常见的库有 Apache POI 和 EasyExcel。

Apache POI

Apache POI 是一个开源的 Java 库,提供了处理各种 Microsoft Office 格式文件的 API,包括 Excel。它支持新旧两种 Excel 文件格式(.xls.xlsx),功能强大且全面,但 API 相对复杂。

EasyExcel

EasyExcel 是一个基于 Apache POI 封装的轻量级 Java Excel 处理库。它简化了 POI 的 API,使得 Excel 的读写操作更加便捷,尤其在处理大数据量时性能表现出色。

使用方法

使用 Apache POI 操作 Excel

首先,需要在项目中引入 Apache POI 的依赖。如果使用 Maven,可以在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>

读取 Excel 文件

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ApachePOIReadExample {
    public static void main(String[] args) {
        String filePath = "path/to/your/file.xlsx";
        try (FileInputStream fis = new FileInputStream(new File(filePath));
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.print(cell.getDateCellValue() + "\t");
                            } else {
                                System.out.print(cell.getNumericCellValue() + "\t");
                            }
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        default:
                            System.out.print(cell + "\t");
                    }
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

写入 Excel 文件

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class ApachePOIWriteExample {
    public static void main(String[] args) {
        String filePath = "path/to/your/output.xlsx";
        try (Workbook workbook = new XSSFWorkbook();
             FileOutputStream fos = new FileOutputStream(new File(filePath))) {

            Sheet sheet = workbook.createSheet("Sheet1");
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("Hello, Excel!");

            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 EasyExcel 操作 Excel

引入 EasyExcel 的依赖:

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

读取 Excel 文件

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.Map;

public class EasyExcelReadExample {

    public static class ExcelListener extends AnalysisEventListener<Map<Integer, String>> {
        @Override
        public void invoke(Map<Integer, String> data, AnalysisContext context) {
            System.out.println(data);
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            System.out.println("All data has been read.");
        }
    }

    public static void main(String[] args) {
        String filePath = "path/to/your/file.xlsx";
        EasyExcel.read(filePath, new ExcelListener()).sheet().doRead();
    }
}

写入 Excel 文件

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;

import java.util.ArrayList;
import java.util.List;

public class EasyExcelWriteExample {

    public static class User {
        private String name;
        private Integer age;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        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 static void main(String[] args) {
        String filePath = "path/to/your/output.xlsx";
        List<User> data = new ArrayList<>();
        data.add(new User("Alice", 25));
        data.add(new User("Bob", 30));

        WriteSheet writeSheet = EasyExcel.writerSheet(0, "Sheet1").head(User.class).build();
        EasyExcel.write(filePath).registerWriteHandler(new CustomCellStyleStrategy()).sheet(writeSheet.getSheetNo(), writeSheet.getSheetName()).doWrite(data);
    }
}

常见实践

读取 Excel 数据

在实际应用中,读取 Excel 数据通常需要根据业务需求进行解析和处理。可能需要对不同类型的数据进行转换,例如将日期格式的字符串转换为 Date 对象,将数字字符串转换为合适的数值类型等。

写入 Excel 数据

写入数据时,可能需要对数据进行格式化,例如设置单元格的字体、颜色、对齐方式等。还可以根据数据的特点进行分组、合并单元格等操作。

样式设置

使用 Apache POI 可以通过 CellStyle 来设置各种样式,例如:

CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

最佳实践

性能优化

  • 使用流式处理:对于大数据量的 Excel 文件,使用流式处理可以避免一次性加载所有数据到内存中,提高性能。EasyExcel 在这方面表现出色,它采用了基于事件驱动的流式读取和写入。
  • 批量操作:在写入数据时,尽量减少对文件的写入次数,采用批量写入的方式可以提高效率。

错误处理

  • 输入验证:在读取 Excel 文件前,对文件路径、文件格式等进行验证,确保输入的正确性。
  • 异常处理:在操作 Excel 文件的过程中,捕获可能出现的异常,如 IOExceptionInvalidFormatException 等,并进行适当的处理,例如记录日志、向用户提供友好的错误提示。

小结

本文详细介绍了 Java 操作 Excel 的相关知识,包括基础概念、使用 Apache POI 和 EasyExcel 进行 Excel 读写的方法、常见实践以及最佳实践。通过掌握这些内容,读者能够在自己的项目中高效地处理 Excel 文件,实现数据的读取、写入和复杂的格式设置。

参考资料