读取excel内容到数据库

最近在做一个小项目遇到一个问题,对于一个科研学科,分为一级学科和二级学科,且这些数据都是放在一个excel文件中。数据量接近900行,如果手工录入肯定会疯掉,说不定还会录错,既然咱是程序猿读取excel内容到数据库肯定不用自己去干这么傻的事。网上溜达了一下找到一个解决方案。


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 );

看一下运行结果:

读取excel内容到数据库


好了这个小demo完成了,希望可以帮到大家!!

所有用到的素材都打包好了,有需要的同学可以自己去下载。

http://download.****.net/detail/akwolf/3636901