将Excel文件导入到数据库中

今天公司让实现两个Excel文件通过某种特定的规则合并成一个文件。要实现这个功能的第一步就是将Excel导入到数据库之中。
下面总结一下将Excel导入到数据库的具体步骤。(java程序)

1:明确所需要的类
这里我使用了三个类:
Ⅰ:DBUtil类。这个类是个工具类,主要负责,连接数据库、搜索……等操作数据库的行为。
Ⅱ:InputExcel类。这个类的主要作用是负责上传,解析Excel表等对Excel表进行‘预操作’的行为
Ⅲ:Model类。这个类是一个模型,里面全是get()、set()方法等。主要起一个‘桥梁’的作用。

这样我们就可以将InputExce类中方法获得的数据通过Model传给数据库,也可以将数据库的数据传给Model,再来获取这些数据。

2:明确需要的jar包和相关的知识
对Excel进行操作的的方法有两种,这两种方法对应的jar包各不相同。这里我们使用‘jxl’来对Excel进行操作。因此我们需要“jxl.jar”这个包,找不到的话可以去maven的网站上直接下载就行。

简单说下jxl的基本对象代表的相应含义:

Workbook 这个对象代表的是整个Excel文件。例如:Workbook a=Workbook.getWorkbook(new File(“相应的文件路径”))。此时对象a便可以近似的看作是这个Excel文件。
Sheet 这个对象代表的是当前文件下的第几个工作簿。例如:Sheet rs=a.getSheet(0);此时rs便代表第一个工作簿。
Cell 代表的是当前工作簿下的某个表格。例如Cell cel=rs.getCell(0,2);此时cel代表的是第1列第3行的那个表格。(注:Excel表中的第一列是前面的数字,第一行是最上面的字母。)随后便可以通过cel.getContents().方法来获取该表格中的数据。

3:写代码

Model的代码不必多说,下面是我的Model代码:

public class K3Model {
	String id;
	String name;	
	String typeString;
	String number;
	String status;	
    public K3Model(String id,String name,String typeString,String number,String status) {
		// TODO Auto-generated constructor stub
    	
    	this.id=id;
    	this.name=name;
    	this.typeString=typeString;
    	this.number=number;
    	this.status=status;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTypeString() {
		return typeString;
	}
	public void setTypeString(String typeString) {
		this.typeString = typeString;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	@Override
	public String toString() {
		return "K3Model [id=" + id + ", name=" + name + ", typeString=" + typeString + ", number=" + number
				+ ", status=" + status + "]";
	}
}

DBUti类,下面是我的代码实现

package cn.wintec.util;

import java.sql.*;
public class DBhelper {
	
	Connection conn=null;
	ResultSet rSet=null;
	
	public void connect(){
		try {
			//这里输入相应的驱动名称(你用的mysql就输入mysql的,用的sqlsever的就输入sqlsever的。别忘了装上相应驱动的jar包)
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//这里用来输入相应的连接ip与对应数据库的账号密码。			conn=DriverManager.getConnection("jdbc:sqlserver://192.122.11.221:1433;DatabaseName=k3excel;IntegratedSecurity=false","username","password");			
		} catch (ClassNotFoundException e) {
			// TODO: handle exceptio
			System.out.println("数据库驱动不可用");
			e.printStackTrace();						
		}catch (SQLException e) {
			// TODO: handle exception
			System.out.println("连接大失败!!");			
			e.printStackTrace();
			}		
	}
	public ResultSet  Search(String sql,String str[]) {
	/*这里不能用连接函数,因为我们Search往往不会仅仅只调用一次。如果我们的数据比较多的话就会不断的重复调用该方法,最后会导致数据库分配过多而拒绝访问。下面的也是同理*/
		//connect();
		try {
		//这里我们将带有‘?’	的失去了语句压入PreparedStatement对象。
			PreparedStatement pst=conn.prepareStatement(sql);			
			for (int i = 0; i <= str.length-1; i++) {
			//这里我们将相对应的‘?’匹配上字符。第一个参数表示的是第几个‘?’进行匹配,第二个参数表示匹配的内容。
				pst.setString(i+1,str[i]);
			}
			//executeQuery();用于insert、update、delete等方法的执行,但是不能用于select的执行。
			rSet=pst.executeQuery();
		} catch (Exception e) {
			// TODO: handle exception
			//e.printStackTrace();
			System.out.println("搜索错误");
		}		
		return rSet;	
	}
	
	public int Addu(String sql ,String str[]){
		int a=-1;
		//不能放在这里,因为会出现连接次数过多从而导致程序崩溃
		//connect();	
		try {
		//同上理
		PreparedStatement pStatement=conn.prepareStatement(sql);
		if (str!=null) {
				for (int i = 0; i <= str.length-1; i++) {
					//同上理
					pStatement.setString(i+1,str[i]);		
				}
			}
			//executeUpdate();负责执行select的SQL语句。
			a=pStatement.executeUpdate();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("SQL语句出现错误"+a);
			e.printStackTrace();		
		}		
		return a;
	}		
}

InputExcel类,下面是我的代码实现

package cn.com.wintec.controller;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import cn.com.wintec.entity.K3Model;
import cn.wintec.util.DBhelper;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;


//负责数据中的各种操作
public class InputExcel {

	//这个方法用于获得数据库中的数据
	public static List<K3Model> getAllByDb() {
		//将获得的数据用Model类存储起来。
		List<K3Model> list=new ArrayList<K3Model>();	
		//创建对数据库操作的工具类
		DBhelper db=new DBhelper();
		String sql="select * from TMPITEM";
		//连接数据库
		db.connect();
		//执行相应的sql语句,将select的搜索集合使用ResultSet对象接收。
		ResultSet rSet=db.Search(sql, null);
		try {
			//遍历ResultSet对象
			while (rSet.next()){
			//根据数据库中的列名获取相应的数据。(使用的get方法要对应相应的类型)
				String id=rSet.getInt("id");
				String name=rSet.getString("name");
				String typeString=rSet.getString("typeString");
				String number=rSet.getString("number");
				String status=rSet.getString("status");
				//将获取的数据添加到Model对象的list里。
				list.add(new K3Model(id, name, typeString, number, status));				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		//返回搜索到的所有数据
		return	list;
	}
	

	//这个方法用于获取Excel表中的数据(但是不将其存入数据库)
	public static List<K3Model> getAllByExcel(String file){
	//list对象
		List<K3Model> list =new ArrayList<K3Model>();
		try {
		    //创建excel表对象
			Workbook rwb=Workbook.getWorkbook(new File(file));
		   //创建工作表对象	
			Sheet rs=rwb.getSheet(0);
     		//获取工作表的行数
			int clos=rs.getColumns();
			//获取工作表的列数
			int rows=rs.getRows();
	
			for (int i = 1; i < rows; i++) {
				int j=0;
				//获取第二列第二行(也就是第一个表格)的数据。
				String id=rs.getCell(j++,i).getContents();
				//获取第三列第二行(也就是第二个表格)的数据。
				String name=rs.getCell(j++,i).getContents();
				String typeString=rs.getCell(j++,i).getContents();
				String number=rs.getCell(j++,i).getContents();
				String status=rs.getCell(j++,i).getContents();				
			//	System.out.println("id:"+id+"  name:"+name+" typeString:"+typeString+" num:"+number+" status:"+status);
			//将相应的数据放入Model的list中
				list.add(new K3Model(id, name, typeString, number, status));
			}			
		} catch (IOException e) {
			System.out.println("文件读取出现问题");
			// TODO: handle exception
		} catch (BiffException e) {
			// TODO Auto-generated catch block
			System.out.println("JXL使用出现问题");
		}	
		return list;
	}

//这个类起的是一个判断作用,输入的id是否存在在数据库之中
	public static boolean isExist(String id,DBhelper dBhelper){
		try {
			//使用上面的Serch方法来返回一个搜索结果
			ResultSet rSet=  dBhelper.Search("select * from TMPITEM where FNumber=?", new String[]{id});	
			//如果存在这个搜索结果则返回true
			if (rSet.next()) {
				return true;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		//如果结果不存在则返回false
		return false;			
	}	
}

下面是使用这几个类来将excel导入数据库的实例代码

//提交k3文档,这里使用注解设置映射路径
	@ResponseBody
	@RequestMapping(value="K3fileUpload", produces = "application/json;charset=UTF-8")
	public static void  inputExcel(HttpServletRequest request) {
		//获取前段传过来的文件路径
		String file = request.getParameter("cs");
		System.out.println("file===="+file);
		//获取这个路径对应Excel文件中的内容
		List<K3Model> listExcel=InputExcel.getAllByExcel(file);
		//创建数据库工具类实例对象
		DBhelper dBhelper=new DBhelper();
		//连接数据库
		dBhelper.connect();
		//迭代K3Model类型的链表(这里一个model其实就是对应了一行Excel)
		for (K3Model k3Model:listExcel) {
			//获取相应的数据
			String  id=k3Model.getId();
			//判断要插入的数据是否已经存在
			if (!InputExcel.isExist(id,dBhelper)) {
				String sql="insert into TMPITEM(FNumber,FName,FModel) values(?,?,?)";
				String[] str=new String[]{k3Model.getId(),k3Model.getName(),k3Model.getTypeString()};
				//System.out.println("-----------in-------------------"+str.toString());
				//将设置的sql语句与字符串传入相应的方法
				dBhelper.Addu(sql, str);
			}else{
			//同上理
				String sql="update TMPITEM set FName=?,FModel=? where FNumber=?";
				String[] str=new String[]{k3Model.getName(),k3Model.getTypeString(),id};
				//System.out.println("------------up------------------"+str.toString());
				dBhelper.Addu(sql, str);
			}
		}
		System.out.println("数据更新成功");		
	}	

如此整个Excel导入的后台代码全部完成。在前端只需要想办法调用inputExcel()方法,再传入需要导入的excel文件的路径就可以完成这次导入。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值