最近在做一个小项目遇到一个问题,对于一个科研学科,分为一级学科和二级学科,且这些数据都是放在一个excel文件中。数据量接近900行,如果手工录入肯定会疯掉,说不定还会录错,既然咱是程序猿肯定不用自己去干这么傻的事。网上溜达了一下找到一个解决方案。
1、首先到网上去找一个jxl.jar的jar包,加入到项目中。(注意一点:此jar包不支持excel2007+版本)
2、将要读取的资源放到硬盘上容易找到的地方,为了方便我就放在D盘下了。
3、加入数据库连接jar包,写一个数据库管理类
DBManager:
package com.akwolf.transform;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBManager {
private String url = "jdbc:mysql://localhost:3306/mytest";
private volatile static DBManager dbManger;
private Connection conn ;
private DBManager(){
}
public static DBManager getInstance() {
if (dbManger == null) {
synchronized (DBManager.class) {
if (dbManger == null) {
try {
Class.forName("com.mysql.jdbc.Driver") ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
dbManger = new DBManager();
}
}
}
return dbManger;
}
public Connection getConnection() {
try {
conn = DriverManager.getConnection(url, "zhangh", "123456");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void realse(){
if(conn!=null){
try {
conn.close() ;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4、ok,现在就来进入主要部分编写转换代码
package com.akwolf.transform;
import java.io.File;
import java.sql.Connection;
import java.sql.Statement;
import jxl.Sheet;
import jxl.Workbook;
/**
* 读取Excel到数据库
*
* @author zhanghua
*
*/
public class TransformExcel {
public static void main(String[] args) throws Exception {
File file = new File("D:" + File.separator + "subject.xls");
//取得一个可以操作的excel
Workbook workbook = Workbook.getWorkbook(file);
Sheet[] sheet = workbook.getSheets();
Connection conn = DBManager.getInstance().getConnection();// 取得连接
TransformExcel excel = new TransformExcel();
String sn = "", intro = "", sql = "", firstSn = "";
boolean insert = true; //是否向数据库中插入数据,若一行数据为空据不进行插入
for (int x = 0; x < sheet.length; x++) {
for (int y = 0; y < sheet[x].getRows(); y++) {
boolean first = false;
for (int z = 0; z < sheet[x].getColumns(); z++) {
String content = sheet[x].getCell(z, y).getContents();
// 本行为空
if (z == 0 && content.equals("")) {
insert = false;
break;
}
// 如果是一级学科
if (content.length() == 3 && z == 0) {
firstSn = content;
first = true;
}
//设置每列的数据库
if (z == 0) {
sn = content;
} else if (z == 1) {
intro = content;
}
}
//拼装sql语句
if (first) {
sql = "insert into firstsubject(first_subject_id,first_subject_name) values('"
+ sn + "','" + intro + "')";
first = false;
} else {
sql = "insert into secondsubject(second_subject_id,second_subject_name,first_subject_id) values('"
+ sn + "','" + intro + "','" + firstSn + "')";
}
//是否可以插入到数据库
if (insert) {
excel.insertIntoDB(conn, sql);
}else{
insert = true;
}
}
}
DBManager.getInstance().realse();
}
public void insertIntoDB(Connection conn, String sql) throws Exception {
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
}
}
5、贴上数据库建表语句
set foreign_key_checks=0;
create table if not exists firstsubject (
first_subject_id varchar(100) not null, -- 一级学科主键
first_subject_name varchar(255) null, -- 一级学科名称
isdel bit(1) default b'0', -- defautlt 0,删除标记位
balance int(11) null, -- 排序
primary key (first_subject_id)
);
create table if not exists secondsubject (
second_subject_id varchar(100) not null, -- 二级学科主键
second_subject_name varchar(255) null, -- 二级学科名称
first_subject_id varchar(100) not null, -- 关联firstsubject.first_subject_id
isdel bit(1) default b'0', -- defautlt 0,删除标记位
balance int(11) null, -- 排序
primary key (second_subject_id),
key first_second_fk (first_subject_id),
constraint first_second_fk foreign key (first_subject_id) references firstsubject (first_subject_id) on delete cascade on update cascade
);
看一下运行结果:
好了这个小demo完成了,希望可以帮到大家!!
所有用到的素材都打包好了,有需要的同学可以自己去下载。
http://download.csdn.net/detail/akwolf/3636901