Java Excel分批导入数据

在数据处理的过程中,我们常常需要将数据从Excel表格导入到数据库中。由于Excel数据可能较大,分批导入可以有效地提升处理效率。本文将重点探讨如何使用Java分批导入Excel数据,配合简单的代码示例指导你完成这个过程。

引言

导入Excel数据的需求在各个领域中都非常普遍,尤其是在数据分析、财务管理等场景中。通过使用Apache POI库,Java可以轻松读取Excel文件。为了提高性能,我们将数据分批导入。以下是导入的基本流程:

  1. 读取Excel文件
  2. 解析数据
  3. 分批处理并插入数据库

环境搭建

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

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

读取Excel文件

接下来,我们将实现读取Excel文件的功能。以下是如何读取Excel并解析数据的示例代码:

import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelReader {
    public List<List<String>> readExcel(String filePath) throws IOException {
        List<List<String>> data = new ArrayList<>();
        FileInputStream file = new FileInputStream(filePath);
        Workbook workbook = WorkbookFactory.create(file);
        Sheet sheet = workbook.getSheetAt(0);
        
        for (Row row : sheet) {
            List<String> rowData = new ArrayList<>();
            for (Cell cell : row) {
                rowData.add(cell.toString());
            }
            data.add(rowData);
        }
        
        workbook.close();
        file.close();
        return data;
    }
}

分批导入数据

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DataImporter {

    private static final int BATCH_SIZE = 1000;

    public void importData(List<List<String>> data) throws SQLException {
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdatabase", "username", "password");
        String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        
        int count = 0;
        for (List<String> row : data) {
            preparedStatement.setString(1, row.get(0));
            preparedStatement.setString(2, row.get(1));
            preparedStatement.addBatch();
            
            if (++count % BATCH_SIZE == 0) {
                preparedStatement.executeBatch();
            }
        }
        preparedStatement.executeBatch(); // Execute the remaining records
        preparedStatement.close();
        connection.close();
    }
}

使用示例

下面是如何整合上述代码的示例:

public class Main {
    public static void main(String[] args) {
        try {
            ExcelReader excelReader = new ExcelReader();
            List<List<String>> data = excelReader.readExcel("path_to_your_excel_file.xlsx");
            DataImporter dataImporter = new DataImporter();
            dataImporter.importData(data);
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }
}

序列图

以下是数据导入过程中的序列图,展示了各个步骤之间的交互关系:

sequenceDiagram
    participant User
    participant ExcelReader
    participant DataImporter
    participant Database

    User->>ExcelReader: readExcel()
    ExcelReader->>User: return data
    User->>DataImporter: importData(data)
    DataImporter->>Database: executeBatch() (每1000条记录分批导入)
    Database->>DataImporter: 数据已插入

总结

通过上述的步骤,我们实现了使用Java分批导入Excel数据的过程。这种方法为处理大数据量提供了便利,有效地提高了执行效率。希望本文能够为你在数据导入的旅程中提供启发,也为你今后的工作提供帮助。如果你对Excel或数据库有更深入的需求,可以继续探索Apache POI或JDBC的其他功能。