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日

相关文章

  • 详解在SpringBoot中@Transactional事物操作和事物无效问题排查

    详解在SpringBoot中@Transactional事物操作和事物无效问题排查 事物被认为是许多企业应用程序的重要组成部分。在SpringBoot中,我们可以使用@Transactional注解来处理事务。但有时候,这个注解可能无法正常工作,导致事物无效。这时我们需要排查问题。下面是详细攻略: 问题排查 无效的事物操作可能是由以下原因引起的: 事物管理器…

    Java 2023年5月20日
    00
  • Java中使用LocalDate根据日期来计算年龄的实现方法

    以下是详细的“Java中使用LocalDate根据日期来计算年龄的实现方法”的攻略: 1. 概述 Java 8中的java.time包提供了一个强大的日期和时间API。在Java 8中,可以使用LocalDate类来表示一个日期,该类提供了许多方法来计算年龄。可以使用LocalDate的静态方法来计算年龄。在本攻略中,我们将提供两个示例,来演示如何使用Loc…

    Java 2023年5月20日
    00
  • java 中的乱码问题汇总及解决方案

    Java 中的乱码问题汇总及解决方案 在 Java 中,由于字符集编码不统一或者操作过程中出现错误,会导致乱码问题的出现。以下是解决 Java 中乱码问题的一些方法总结。 字符集编码不正确 确定并设置编码方式 在 Java 的编码过程中,需要使用字符集编码,否则会出现乱码。在开发中,一般使用 UTF-8 编码,若使用其他编码方式,需要明确指定字符集编码。比如…

    Java 2023年5月19日
    00
  • 基于自定义校验注解(controller、method、(groups)分组的使用)

    基于自定义校验注解的使用可以提高代码的可读性和可维护性,可以定义自己的业务规则并在控制器中进行验证,从而更好地保障数据的安全性。下面给出一个完整的攻略,包括自定义注解的编写、控制器中的使用、注解的分组以及两个示例。 编写自定义注解 自定义注解应该使用@Target和@Retention注解对其进行标记,使其可以被正确地应用到需要校验的方法上。下面是一个简单的…

    Java 2023年5月20日
    00
  • java web实现网上手机销售系统

    Java Web实现网上手机销售系统的完整攻略主要包括以下几个步骤: 1.需求分析 首先需要明确网上手机销售系统的功能需求,包括前台页面、后台管理系统、交互流程等。具体包括用户注册、登录、浏览商品、加入购物车、结算、支付等一系列操作。同时,应考虑系统的安全性、可扩展性、性能等方面的问题。 选择开发框架 在开发过程中,可以选择一些成熟的Java Web框架,如…

    Java 2023年5月24日
    00
  • 如何通过一张图搞懂springBoot自动注入原理

    下面是关于“如何通过一张图搞懂springBoot自动注入原理”的完整攻略。 1. 简介 在 Spring Boot 中,我们可以使用自动配置完成很多操作,其中最重要的一个就是通过自动注入来维护 Spring 应用程序之间的依赖关系。 Spring Boot 中自动注入的原理比较复杂,但我们可以用一张图来概述它的过程。 2. 图片介绍 下面这张图片展示了自动…

    Java 2023年5月15日
    00
  • Java 字符串反转实现代码

    我来详细讲解一下“Java 字符串反转实现代码”的攻略。 什么是字符串反转 字符串反转是指将一个字符串的顺序颠倒过来,即从后往前读取原字符串。比如,将字符串“hello”反转后得到的字符串为“olleh”。 字符串反转的实现方法 Java 中字符串是不可变的对象,因此不能直接对字符串进行反转。我们可以通过将字符串转换为字符数组,并且进行字符数组的反转,最后再…

    Java 2023年5月27日
    00
  • springboot jackson配置教程

    下面是SpringBoot Jackson配置教程的完整攻略,包括Jackson的基本功能、注解、配置、示例等详细步骤。 一、什么是Jackson Jackson是Java编程语言中用于将Java对象序列化为JSON(JavaScript对象表示)和反序列化从JSON返回Java对象的库。它是一种流行的JSON库,可以快速轻松地将Java对象转换为JSON格…

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