如何用Java读取Excel文件写到数据库中

问题描述

我们需要将一个Excel文件中的数据写入到数据库中。这个Excel文件包含了一些表格数据,每行数据对应数据库中的一条记录。我们需要通过Java程序读取Excel文件,将数据提取出来,并插入到数据库中。

解决方案

我们可以使用Apache POI库来读取Excel文件,使用JDBC连接数据库,并使用SQL语句将数据插入到数据库中。

1. 导入依赖

首先,我们需要在项目的pom.xml文件中添加以下依赖:

```xml
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
</dependencies>

2. 读取Excel文件

我们可以使用Apache POI库来读取Excel文件。我们需要创建一个Workbook对象,然后通过它来获取Sheet对象和Row对象,进而读取数据。

```java
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 ExcelReader {

    public static void main(String[] args) {
        try {
            // 读取Excel文件
            FileInputStream fis = new FileInputStream(new File("data.xlsx"));
            Workbook workbook = new XSSFWorkbook(fis);
            
            // 获取第一个Sheet
            Sheet sheet = workbook.getSheetAt(0);
            
            // 遍历每一行
            for (Row row : sheet) {
                // 遍历每一列
                for (Cell cell : row) {
                    // 读取单元格的值
                    String value = cell.getStringCellValue();
                    System.out.print(value + "\t");
                }
                System.out.println();
            }
            
            // 关闭文件流
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

3. 插入数据到数据库

我们可以使用JDBC来插入数据到数据库。首先,我们需要建立数据库连接,然后执行插入数据的SQL语句。

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

public class DatabaseWriter {

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;

        try {
            // 连接数据库
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");

            // 准备插入数据的SQL语句
            String sql = "INSERT INTO mytable (column1, column2) VALUES (?, ?)";
            statement = connection.prepareStatement(sql);

            // 设置参数并执行插入数据的SQL语句
            statement.setString(1, "value1");
            statement.setString(2, "value2");
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据库连接和预编译语句
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

4. 将Excel数据写入数据库

现在,我们可以将读取Excel文件和插入数据到数据库的代码结合起来,完成将Excel数据写入数据库的功能。

```java
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;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ExcelToDatabase {

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;

        try {
            // 连接数据库
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");

            // 读取Excel文件
            FileInputStream fis = new FileInputStream(new File("data.xlsx"));
            Workbook workbook = new XSSFWorkbook(fis);

            // 获取第一个Sheet
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历每一行
            for (Row row : sheet) {
                // 准备插入数据的SQL语