Mybatis+Jfinal框架下使用jxl导入EXCEL表格,Jfinal调用存储过程
需要导入 jxl.jar
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import jxl.Sheet;
import jxl.Workbook;
//service层--------
public static List<Memberships> getAllByExcel(String file) {
List<Memberships> list = new ArrayList<Memberships>();
try {
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++) {
for (int j = 0; j < clos; j++) {
//先循环行数 有几行就是几个对象 再循环列数 把每个对象的属性单独分离
String ID = rs.getCell(j++, i).getContents();// 默认最左边编号也算一列
// 所以这里得j++
String Department = rs.getCell(j++, i).getContents();
String Specialty = rs.getCell(j++, i).getContents();
String Degree = rs.getCell(j++, i).getContents();
//ID,Department,Specialty,Degree//实体类的各个参数,自己设置
System.out.println("ID:" + ID + " Department:" + Department
+ " Specialty:" + Specialty + " Degree:" + Degree);
list.add(new Memberships().set("ID", Integer.parseInt(ID))
.set("Department", Department)
.set("Specialty", Specialty).set("Degree", Degree));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
//调用存储过程
public static int check(String name, List<Object> a) {
ProcUtil p = new ProcUtil(name, a);
Db.execute(p);
return p.result;
}
//controller层---------------
public void inputMemberships() {
List<Memberships> list = new ArrayList<Memberships>();
String file = getPara("filename");
// 得到表格中所有的数据
List<Memberships> listExcel = libservice.getAllByExcel(file);
for (Memberships Memberships : listExcel) {
li.add(0, Memberships.get("ID"));
li.add(1, Memberships.get("Department"));
li.add(2, Memberships.get("Specialty"));
li.add(3, Memberships.get("Degree"));
int b = libservice.check("procheck", li);
li.clear();
if (b > 0) {
list.add(Memberships);
renderText("已存在");
} else {
renderText("插入成功");
}
renderText("s" + list);
HttpSession session = getSession();
session.setAttribute("mem", list);
}
}
//工具类-----------------
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import com.jfinal.plugin.activerecord.ICallback;
public class ProcUtil implements ICallback {
/**
* 存储过程的名字
*/
String procName = null;
/**
* 存储过程的输入参数
*/
List<Object> params = null;
/**
* 返回结果
*/
public int result = 0;
/**
* 完成初始化
* @param procName
* @param params
*/
public ProcUtil(String procName,List<Object> params){
this.procName = procName;
this.params = params;
}
@Override
public Object call(Connection conn) throws SQLException {
CallableStatement proc = null;//操作对象
try {
//拼接存储过程的名字和参数
String str = procName+"(";
int s = params.size();
for(int i=0;i<s;i++){
str = str+"?,";
}
str = str+"?)";
System.out.println("{ call "+str+" }");
proc = (CallableStatement) conn.prepareCall("{ call "+str+" }"); //调用存储过程
for(int i=0;i<s;i++){
proc.setObject(i+1, params.get(i));//设置参数值
}
proc.registerOutParameter(s+1, java.sql.Types.INTEGER);//设置返回值类型
proc.execute();
result = proc.getInt(s+1);//得到返回值
//System.out.println("结果:"+result);
}catch(Exception e){
e.printStackTrace();
return null;
}
return result;
}
}
//Mybatis存储过程 --------------
IN memid INT,in Department varchar(50),in Specialty varchar(50),in Degree varchar(50),OUT num int
BEGIN
DECLARE A INT;
set @A=(SELECT COUNT(ID) FROM memberships WHERE ID=memid);
IF @A>0 THEN
select 1 into num;
ELSE
insert into memberships (Department,Specialty,Degree) values(Department,Specialty,Degree);
select -1 into num;
END IF;
END