很多信息都是以excel的形式存在的,这时候如果批量导入到数据库,对数据的操作会比较方便。
工程需要导入的jar包:
项目结构:
mysql中表:
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效果:
mysql效果:
总结:过程还是比较容易的,主要是出现报错信息后,需要能够根据提示,该引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。