使用Java解析复杂的Excel文件

在当今数据驱动的时代,Excel文件被广泛用于存储和处理数据。当我们面临复杂的Excel文件时,如何有效地解析这些数据成为了一项重要的技能。本文将通过一个实际问题,展示如何使用Java来解析一个复杂的Excel文件,并提供完整的代码示例。

实际问题

我们有一个复杂的Excel文件,其中包含多个工作表,每个工作表中都有不同结构的数据。我们需要从这个Excel文件中提取特定数据,并将其转换为特定的对象,以便于后续的处理。

Excel文件结构示例

假设我们的Excel文件(data.xlsx)包含两个工作表:

  1. 客户信息工作表,包含客户ID、姓名和邮箱。
  2. 订单信息工作表,包含订单ID、客户ID和订单金额。

Java解析Excel的实现

解析Excel文件的工具有很多,Apache POI是一个常用的库,它可以帮助我们操作Excel文件。接下来,我们将使用Apache POI来解析上述复杂的Excel文件。

导入依赖

首先,在pom.xml中添加Apache POI的依赖:

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

数据对象模型

我们将定义两个数据模型,分别用于表示客户和订单。

public class Customer {
    private String customerId;
    private String name;
    private String email;

    // Getters and Setters
}

public class Order {
    private String orderId;
    private String customerId;
    private double amount;

    // Getters and Setters
}

Excel解析类

接下来,我们创建一个ExcelParser类来处理Excel文件的解析:

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

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelParser {
    private String filePath;

    public ExcelParser(String filePath) {
        this.filePath = filePath;
    }

    public List<Customer> parseCustomers() throws IOException {
        List<Customer> customers = new ArrayList<>();
        FileInputStream fis = new FileInputStream(filePath);
        Workbook workbook = new XSSFWorkbook(fis);
        Sheet sheet = workbook.getSheetAt(0);

        for (Row row : sheet) {
            if (row.getRowNum() == 0) continue;  // Skip header
            Customer customer = new Customer();
            customer.setCustomerId(row.getCell(0).getStringCellValue());
            customer.setName(row.getCell(1).getStringCellValue());
            customer.setEmail(row.getCell(2).getStringCellValue());
            customers.add(customer);
        }
        workbook.close();
        fis.close();
        return customers;
    }

    public List<Order> parseOrders() throws IOException {
        List<Order> orders = new ArrayList<>();
        FileInputStream fis = new FileInputStream(filePath);
        Workbook workbook = new XSSFWorkbook(fis);
        Sheet sheet = workbook.getSheetAt(1);

        for (Row row : sheet) {
            if (row.getRowNum() == 0) continue;  // Skip header
            Order order = new Order();
            order.setOrderId(row.getCell(0).getStringCellValue());
            order.setCustomerId(row.getCell(1).getStringCellValue());
            order.setAmount(row.getCell(2).getNumericCellValue());
            orders.add(order);
        }
        workbook.close();
        fis.close();
        return orders;
    }
}

使用示例

下面是如何使用ExcelParser类的示例代码:

public class Main {
    public static void main(String[] args) {
        String filePath = "data.xlsx";
        ExcelParser parser = new ExcelParser(filePath);

        try {
            List<Customer> customers = parser.parseCustomers();
            List<Order> orders = parser.parseOrders();
            
            System.out.println("Customers:");
            for (Customer customer : customers) {
                System.out.println(customer.getCustomerId() + ", " + customer.getName() + ", " + customer.getEmail());
            }
            
            System.out.println("Orders:");
            for (Order order : orders) {
                System.out.println(order.getOrderId() + ", " + order.getCustomerId() + ", " + order.getAmount());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

类图

为了清晰地展示各个类之间的关系,我们使用Mermaid语法生成类图:

classDiagram
    class Customer {
        +String customerId
        +String name
        +String email
    }

    class Order {
        +String orderId
        +String customerId
        +double amount
    }

    class ExcelParser {
        +List<Customer> parseCustomers()
        +List<Order> parseOrders()
    }

甘特图

在实际的开发过程中,我们可以为解析Excel文件的任务设置时间进度。下面是一个简单的甘特图示例:

gantt
    title Excel解析任务进度
    dateFormat  YYYY-MM-DD
    section 数据准备
    创建Excel文件             :done,  des1, 2023-01-01, 1d
    section 数据解析
    解析客户信息               :active,  des2, 2023-01-02, 2d
    解析订单信息               :active,  des3, after des2, 2d
    section 数据输出
    输出解析结果               : des4, after des3, 1d

结论

通过本文的示例,我们展示了如何使用Java和Apache POI库来解析复杂的Excel文件。这个过程不仅便于我们提取关键信息,而且可以为数据存储和后续处理打下坚实的基础。无论是在项目中,还是在日常的数据处理中,掌握Excel的解析技巧都将极大提高我们的工作效率。希望本文对您有所帮助!