您的位置:首页 > 数据库

读取excel内容到数据库

2011-09-26 14:18 309 查看
最近在做一个小项目遇到一个问题,对于一个科研学科,分为一级学科和二级学科,且这些数据都是放在一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: