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

yizhihongxing

下面是一份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日

相关文章

  • bootstrap 下拉多选框进行多选传值问题代码分析

    下面给出“bootstrap下拉多选框进行多选传值问题代码分析”的完整攻略。 1. 背景 在使用bootstrap开发Web应用时,经常会使用下拉多选框进行多选,但如何将所选的值传递给后端服务器,还是一个值得探讨的问题。 2. 问题 bootstrap的下拉多选框有一个data-selected-text-format属性,它可以控制选中的值的格式,如可以将…

    Java 2023年6月15日
    00
  • 手把手带你用java搞定汉诺塔

    手把手带你用Java搞定汉诺塔 汉诺塔是一种经典的递归算法题目,许多编程语言课程书籍都会在最初的课程中讲述它。Java 作为行业中使用最广泛的编程语言之一,自然也有自己实现汉诺塔的方法。在本篇攻略中,我们将一步步讲解如何使用 Java 代码实现汉诺塔算法。 算法原理 汉诺塔问题的递推公式如下: 在只有一个盘子时,将其直接移动到目标柱子上。 在有n (n &g…

    Java 2023年5月23日
    00
  • JavaWeb登录界面登录失败在同一页面进行提示的解决

    JavaWeb登录界面登录失败在同一页面进行提示的解决 当用户在JavaWeb应用程序中的登录界面输入错误的用户名或密码时,我们需要给与用户提示以完成用户友好体验。该过程有多种方法可以完成,其中一种方法是在同一页面上进行提示。本文将讲解如何在同一页面上显示登录失败的提示信息。 第一步:页面设计我们需要在登录页面添加一个div元素,将错误信息放在里面。但是在一…

    Java 2023年6月15日
    00
  • Java中excel表数据的批量导入方法

    Java中Excel表数据批量导入方法 1. 认识Excel表格 Excel表格是电子表格程序中的一种文件格式,最常见的扩展名为.xlsx。Excel表格数据可以按照行和列进行组织,并且可以进行计算、图表等操作。 2. 批量导入Excel表格数据的步骤 批量导入Excel表格数据的一般流程包括以下步骤: 读取Excel文件。 对Excel文件进行解析,得到表…

    Java 2023年6月15日
    00
  • A标签触发onclick事件而不跳转的多种解决方法

    当我们在HTML中使用标签时通常会使用它来跳转到其他页面。但是,如果我们希望在用户点击这个链接时触发一些功能,而不是跳转到其他页面,我们可以使用onclick事件。本文将介绍几种A标签触发onclick事件而不跳转的多种解决方法。 方法一:Javascript:void(0) 使用Javascript:void(0)作为标签的href值,它可以防止页面跳转,…

    Java 2023年6月15日
    00
  • Struts2配置文件中使用通配符的方法(三种形式)

    使用通配符在Struts2配置文件中可以方便地定义多个相似的Action或者Interceptor,以及进行全局的配置。 在Struts2的配置文件中,有三种形式可以使用通配符,分别如下: 使用“”号通配符 例如:<package name=”default” extends=”struts-default”> <action name=”…

    Java 2023年5月20日
    00
  • java应用领域分析

    Java应用领域分析是指对Java应用程序的具体业务场景和需求进行细致的分析和了解,以便更好地开发出符合用户需求的Java应用,具体的攻略步骤如下: 1.需求调研 首先需要充分调研客户的需求,收集相关业务场景信息和运营数据,包括产品功能、用户痛点、市场趋势、用户体验、业务流程等,为后续的分析和设计提供数据支持。 2.业务分析 在收集完用户需求后,需要对需求进…

    Java 2023年5月20日
    00
  • Spring Security如何在Servlet中执行

    Spring Security 是 Spring 框架中的一个安全框架,可以用于保护 Web 应用程序的安全,包括身份验证、授权、防止攻击等功能。在 Servlet 中使用 Spring Security 可以有效地保护应用程序的安全,下面是详细的使用攻略。 1. 添加 Spring Security 依赖 首先,需要在项目中添加 Spring Securi…

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