下面是一份Java实现批量导入excel表格数据到数据库中的方法的攻略:
一、前置要求
- 数据库的表结构,表中的字段需要与excel表格中的字段一一对应。
- Jdbc数据库驱动。
- Apache POI库,它是用于读取和写入Microsoft Office二进制文件格式的Java库。
二、实现步骤
- 解析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, ...));
}
- 将读取到的数据依次插入到数据库中。
// 导入所需类库
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技术站