今天公司让实现两个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 getAllByDb() {
//将获得的数据用Model类存储起来。
List list=new ArrayList();
//创建对数据库操作的工具类
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 getAllByExcel(String file){
//list对象
List list =new ArrayList();
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 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文件的路径就可以完成这次导入。