Java实现批量导入excel表格数据到数据库中的方法

下面是一份Java实现批量导入excel表格数据到数据库中的方法的攻略:

一、前置要求

  • 数据库的表结构,表中的字段需要与excel表格中的字段一一对应。
  • Jdbc数据库驱动。
  • Apache POI库,它是用于读取和写入Microsoft Office二进制文件格式的Java库。

二、实现步骤

  1. 解析Excel文件,利用Apache POI库实现,将文件内容读取到一个List或者其他的数据结构中。
// 导入所需的类库
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

// 创建一个excel文件的工作簿
Workbook workbook = new HSSFWorkbook(new FileInputStream(new File(filepath)));

// 获取excel文件的第一个sheet页
Sheet sheet = workbook.getSheetAt(0);

// 遍历sheet页,获取其中每一行的内容
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
    Row row = rowIterator.next();
    // 获取每个单元格的值,并根据实际情况进行类型转换
    String col1 = row.getCell(0).getStringCellValue();
    int col2 = (int)row.getCell(1).getNumericCellValue();
    ...
    // 将读取到的信息添加到要插入的数据结构中去
    dataList.add(new Data(col1, col2, ...));
}
  1. 将读取到的数据依次插入到数据库中。
// 导入所需类库
import java.sql.*;
import java.util.List;

// 建立数据库连接
Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = null;

try {
    // 关闭自动提交
    conn.setAutoCommit(false);
    // 执行批量插入操作
    String sql = "INSERT INTO table_name(field1, field2, ...) VALUES(?, ?, ...)";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    for(Data data : dataList) {
        pstmt.setString(1, data.getField1());
        pstmt.setInt(2, data.getField2());
        ...
        pstmt.addBatch();
    }
    pstmt.executeBatch();
    // 提交事务
    conn.commit();
} catch (SQLException e) {
    // 出现异常时回滚事务
    conn.rollback();
} finally {
    // 关闭链接
    if(null != stmt) {
        stmt.close();
    }
    if(null != conn) {
        conn.close();
    }
}

三、示例

我们来看一个具体的例子:导入一张含有学生信息的Excel表格到数据库中。

示例1:读取Excel文件的同时,将信息插入到数据库

假设我们有一张Excel表格,名称为“student.xlsx”,表格中每一行分别包含以下内容:学号、姓名、年龄、性别。我们将这些信息依次读取出来,同时插入到数据库“student”表中。

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class ExcelImportTest {

    public static void main(String[] args) {
        String filePath = "C:/student.xlsx"; // Excel文件路径
        String jdbcUrl = "jdbc:mysql://localhost:3306/db_name"; // 数据库连接地址
        String username = "root"; // 数据库用户名
        String password = "root"; // 数据库密码

        List<Student> dataList = new ArrayList<Student>(); // 存储从Excel文件中读取到的数据
        Connection conn = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 建立数据库连接
            conn = DriverManager.getConnection(jdbcUrl, username, password);
            conn.setAutoCommit(false); // 设置手动提交

            // 打开Excel文件
            Workbook workbook = new HSSFWorkbook(new FileInputStream(new File(filePath)));
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个sheet页

            // 遍历sheet页,读取每一行的数据
            Iterator<Row> rowIterator = sheet.rowIterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                int id = (int) row.getCell(0).getNumericCellValue();
                String name = row.getCell(1).getStringCellValue();
                int age = (int) row.getCell(2).getNumericCellValue();
                String gender = row.getCell(3).getStringCellValue();
                Student student = new Student(id, name, age, gender);
                dataList.add(student);
            }

            // 批量插入到数据库
            String sql = "INSERT INTO student(id, name, age, gender) VALUES (?, ?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            for (Student student : dataList) {
                pstmt.setInt(1, student.getId());
                pstmt.setString(2, student.getName());
                pstmt.setInt(3, student.getAge());
                pstmt.setString(4, student.getGender());
                pstmt.addBatch();
            }
            pstmt.executeBatch(); // 提交批量操作
            conn.commit(); // 提交事务
        } catch (Exception e) {
            e.printStackTrace();
            try {
                conn.rollback(); // 出现异常时回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                if (null != conn) {
                    conn.close(); // 关闭连接
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

class Student {
    private int id;
    private String name;
    private int age;
    private String gender;

    public Student(int id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

示例2:导入Excel文件到数据库之前,需先检查数据的合法性

在上一个示例中,我们直接将Excel文件中的数据插入到了数据库中。这样操作的好处是简单易行,但在某些情况下我们可能会需要对数据的合法性进行检查,检查完毕之后再执行插入。本示例的目的是说明在导入Excel文件到数据库之前,若需校验数据合法性该如何实现。例子中,我们假设每个学生的名字长度要大于5,年龄要小于30,性别要么是男,要么是女,否则就认为数据非法不予插入。

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class ExcelImportTest2 {

    public static void main(String[] args) {
        String filePath = "C:/student.xlsx"; // Excel文件路径
        String jdbcUrl = "jdbc:mysql://localhost:3306/db_name"; // 数据库连接地址
        String username = "root"; // 数据库用户名
        String password = "root"; // 数据库密码

        List<Student> dataList = new ArrayList<Student>(); // 存储从Excel文件中读取到的数据
        Connection conn = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 建立数据库连接
            conn = DriverManager.getConnection(jdbcUrl, username, password);
            conn.setAutoCommit(false); // 设置手动提交

            // 打开Excel文件
            Workbook workbook = new HSSFWorkbook(new FileInputStream(new File(filePath)));
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个sheet页

            // 遍历sheet页,读取每一行的数据
            Iterator<Row> rowIterator = sheet.rowIterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                int id = (int) row.getCell(0).getNumericCellValue();
                String name = row.getCell(1).getStringCellValue();
                int age = (int) row.getCell(2).getNumericCellValue();
                String gender = row.getCell(3).getStringCellValue();

                // 检查数据的合法性
                boolean valid = true;
                if (name.length() <= 5) {
                    System.out.println("学生[" + name + "]的名字长度不足5,数据无法插入");
                    valid = false;
                } else if (age >= 30) {
                    System.out.println("学生[" + name + "]年龄超过30岁,数据无法插入");
                    valid = false;
                } else if (!"男".equals(gender) && !"女".equals(gender)) {
                    System.out.println("学生[" + name + "]性别不合法,数据无法插入");
                    valid = false;
                }

                // 如果数据合法,则添加到数据列表中
                if (valid) {
                    Student student = new Student(id, name, age, gender);
                    dataList.add(student);
                }
            }

            // 批量插入到数据库
            String sql = "INSERT INTO student(id, name, age, gender) VALUES (?, ?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            for (Student student : dataList) {
                pstmt.setInt(1, student.getId());
                pstmt.setString(2, student.getName());
                pstmt.setInt(3, student.getAge());
                pstmt.setString(4, student.getGender());
                pstmt.addBatch();
            }
            pstmt.executeBatch(); // 提交批量操作
            conn.commit(); // 提交事务
        } catch (Exception e) {
            e.printStackTrace();
            try {
                conn.rollback(); // 出现异常时回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                if (null != conn) {
                    conn.close(); // 关闭连接
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

class Student {
    private int id;
    private String name;
    private int age;
    private String gender;

    public Student(int id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

以上就是Java实现批量导入excel表格数据到数据库中的方法的完整攻略和两条示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现批量导入excel表格数据到数据库中的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 带你详细了解Java值传递和引用传递

    带你详细了解Java值传递和引用传递 Java中传递参数有两种方式:值传递和引用传递。理解这两种方式在Java编程中的应用非常重要。 值传递 在Java中,所有的基本数据类型都是采用值传递。当调用方法时,基本数据类型的参数会被复制一份,传入方法内部,方法内对参数的任何改变都不会影响方法外部的数据。这是因为复制后的参数是一个新的对象,与外界的原始对象没有关系。…

    Java 2023年5月26日
    00
  • SpringBoot SSMP 整合案例分享

    SpringBoot SSMP整合案例分享 SpringBoot是一个快速开发框架,SSM是一个经典的JavaWeb开发框架,它们的整合可以让我们更加高效地进行JavaWeb开发。本文将分享一个SpringBoot整合SSM的案例,包括如何整合MyBatis和SpringMVC,并提供两个示例说明。 1. 创建SpringBoot项目 首先,我们需要创建一个…

    Java 2023年5月18日
    00
  • Java实现树形List与扁平List互转的示例代码

    以下是Java实现树形List与扁平List互转的完整攻略。 1. 概述 树形结构和扁平结构是常用的数据结构之一,在业务开发过程中常常需要互相转换。本攻略给出Java实现树形List与扁平List互转的示例代码。 2. 树形List转为扁平List 树形结构的定义: public class TreeNode { private String id; pri…

    Java 2023年5月26日
    00
  • 深入jaxb xjc编码问题的详细介绍

    下面我来详细讲解“深入JAXB XJC编码问题的详细介绍”的攻略。 什么是JAXB XJC? JAXB(Java Architecture for XML Binding)是Java中一个处理XML编码和解码的框架。JAXB XJC是JAXB中用于将XSD(XML Schema Definition)文件转换为Java类的工具。它可以生成一组Java类,包括…

    Java 2023年5月20日
    00
  • Java中Singleton的3种实现方式详解

    Java中Singleton的3种实现方式详解 一、什么是Singleton? 在面向对象编程中,Singleton(单例)是一种创建模式,用于确保一个类只有一个实例,并提供了一个全局访问点。 在程序中,单例模式通常用于管理共享资源,例如数据库连接池、日志输出、配置信息等。 二、Singleton的实现方式 1. 饿汉式(Eager Initializati…

    Java 2023年5月18日
    00
  • Java中TypeReference用法详情说明

    当我们需要在Java中将一个类型传递给另一个类或方法的时候,通常需要使用TypeReference。TypeReference是一个泛型类,它用于获取某个泛型类型的完整信息。 下面提供两个示例,以说明TypeReference的用法: 示例一:获取Map泛型类型的完整信息 假设我们有一个Map类型的变量,我们想要知道它的泛型类型是什么,该怎么办呢? Map&…

    Java 2023年5月26日
    00
  • java lambda表达式用法总结

    Java Lambda表达式用法总结 什么是Lambda表达式 Lambda表达式是Java 8中引入的一种新特性,可以用于创建一个匿名函数,从而大大简化了代码的编写。它可以看做是一种语法糖,用于简化某些类型的方法的声明。 在Java中,Lambda表达式由两部分组成: 参数列表:可以包含0个或多个参数,多个参数用逗号隔开。 代码块:可以是任意的Java代码…

    Java 2023年5月26日
    00
  • Java使用openOffice对于word的转换及遇到的问题解决

    下面是“Java使用openOffice对于word的转换及遇到的问题解决”的完整攻略,该攻略分为以下几个步骤: 安装openOffice 首先需要安装openOffice,可以通过官网或者软件源安装。安装完成后,确保openOffice服务已启动。 导入openOffice库 Java中使用openOffice实现word转换需要导入相关的库,具体可以参考…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部