很多信息都是以excel的形式存在的,这时候如果批量导入到数据库,对数据的操作会比较方便。

工程需要导入的jar包:

Java实现Excel表导入数据库_apache

项目结构:

Java实现Excel表导入数据库_apache_02

mysql中表:

Java实现Excel表导入数据库_apache_03

utils包下代码:

package com.utils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
public class MysqlUtils {
    @Test
    public static Connection getConnection(){
        try {
            String url="jdbc:mysql://localhost:3306/info?useSSL=false&useUnicode=true&characterEncoding=utf8";
            String user="root";
            String password="xxx";
            Class.forName("com.mysql.jdbc.Driver");

            java.sql.Connection conn = DriverManager.getConnection(url, user,password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

bean包下代码:

package com.bean;

public class Student {
    private String address;
    private String school;
    private String age;
    
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) 
        this.address = address;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getSchool() {
        return school;
    }
    public void setSchool(String school) {
        this.school = school;
    }

    @Override

    public String toString() {
        return "Student{" +
                "address='" + address + '\'' +
                ", school='" + school + '\'' +
                ", age=" + age +
                '}';
    }
}

dao包下代码:

package com.dao;

import com.bean.Student;
public interface StudentDao {

    public void add(Student student) throws Exception;

}

Impl包下代码:

package com.impl;

import com.bean.Student;

import com.dao.StudentDao;

import com.utils.MysqlUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;


public class StudentDaoImpl implements StudentDao {

    @Override

    public void add(Student student) throws Exception {

        Connection conn=null;

        try {

            conn= MysqlUtils.getConnection();

            String sql="insert into student (age,address,school) values(?,?,?)";

            PreparedStatement preparedStatement = conn.prepareStatement(sql);

            preparedStatement.setString(1,student.getAge());

            preparedStatement.setString(2,student.getAddress());

            preparedStatement.setString(3,student.getSchool());


            preparedStatement.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

            throw new Exception("添加失败");

        }finally {

            if(conn!=null){

                conn.close();

            }

        }

    }

}

test包下代码:

package com.test;
import com.bean.Student;
import com.impl.StudentDaoImpl;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import java.io.FileInputStream;

/**
 * @author xxp
 * @date 2020/11/6-9:32
 */
public class AddToData {
    //excel的路径文件
//    public static String filePath="E:\\sqlTestExcel\\student.xls";

    public static void main(String[] args) {
        try {
            HSSFWorkbook sheets = new HSSFWorkbook(new FileInputStream("E:\\sqlTestExcel\\student.xls"));//创建对Excel工作簿的引用
            HSSFSheet sheet1 = sheets.getSheet("sheet1");//根据名字获取第一张sheet
            int rows = sheet1.getPhysicalNumberOfRows();//获取excel的所有行数
            //遍历行
            for (int i = 1; i < rows; i++) {
                //读取左上端单元格
                HSSFRow row = sheet1.getRow(i);
                if (row != null) {
                    int cells = row.getPhysicalNumberOfCells();//获取一行中多有的列的列数
                    String value = "";
                    //遍历列
                    for (int j = 0; j < cells; j++) {
                        HSSFCell cell = row.getCell(j);//获取列值
                        if (cell != null) {
                            switch (cell.getCellType()) {
                                case FORMULA:
                                    break;
                                case NUMERIC:
                                    value += cell.getNumericCellValue();
                                    value += ",";
                                    break;
                                case STRING:
                                    value += cell.getStringCellValue() ;
                                    value += ",";
                                    break;
                                default:
                                    value += "0";
                                    break;
                            }
                        }
                    }
                    //将数据写入到mysql数据库
                    String[] val = value.split(",");//打印测试
                    for (String tem:val){
                        System.out.println(tem);
                    }

                    Student student = new Student();
                    student.setAge(val[0]);
                    student.setAddress(val[1]);
                    student.setSchool(val[2]);

                    StudentDaoImpl studentDao = new StudentDaoImpl();
                    studentDao.add(student);
                    System.out.println("insert success!!!");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

效果:

1.excel效果:

Java实现Excel表导入数据库_java_04

mysql效果:

Java实现Excel表导入数据库_java_05

总结:过程还是比较容易的,主要是出现报错信息后,需要能够根据提示,该引jar包下jar包,还有就是属性为int或者浮点型,程序跑起来总是出错,至今没有找到原因,字符串转过去也不行。所以,我直接把age等直接定义为String类型,在数据库表中定义为varchar类型,这样程序就可以正常跑了。

还有一点需要注意test包下的HSSFWorkbook sheets = new HSSFWorkbook(new FileInputStream("E:\\sqlTestExcel\\student.xls"));//创建对Excel工作簿的引用这里只能识别以xls为后缀的excel表名,如果不想费事再改代码可以把xlsx后缀的另存为xls。

以下为xlsx方法:

HSSFWorkbook 是用来解析 03版的 excel 文件(.xls),而解析 07版的 excel 文件(.xlsx) 则需要使用 XSSFWorkbook 来读取,知道原因后,我们就可以做出改进方案。这样就可以解决上述问题了,但总感觉这样做有些不合适,于是继续翻博客,找到大佬写的 POI - 读取Excel2003、Excel2007或更高级的兼容性问题 ,在这篇博客里和源码可以知道因为 HSSFWorkbook和XSSFWorkbook都实现了Workbook接口,所以可以使用poi-ooxml中的 WorkbookFactory.create(inputStream) 来创建Workbook。