项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中的数据提取到数据库的操作,其实实现起来很简单。以下是小菜鸟我的实现思路:

1、JSP页面+Struts2实现文件上传,把定制Excel上传到服务器指定目录下,以供读取;

2、POI读取Excel表格,把数据封装为持久化实体List

3、批量导入数据库

这是TT的开发环境:

Struts2.1.6 + Spring2.5.6 + Hibernate3.3.1 + MyEclipse8.5 + tomcat5.5 + Oracle11g

需要的Jar包:SSH的就不需要说了

主要就是一个POI的包:

我这里是 poi-3.7-beta-20100620.jar,这一个jar包可以去apach的官网上下载

还有一个就是struts的IO包:

commons-io-1.3.2.jar,顾名思义:IO工具类

第一步:文件上传

这一步,网上有很多的例子:

JSP页面:


文件上传



Struts.xml配置文件:这里可以定制Filter,指定文件类型和最大长度,就不列举了

/page/role/roleallinput.jsp

/page/role/roleallinput.jsp

对应的applicationContext.xml配置

scope=“prototype”>
class=“com.adtec.datacenter.dao.manager.FileLoadDaoImpl”>

RoleFileUploadAction实现

这里有几个点需要注意:

上传文件的文件如果为uploadFile,那么文件名一定要为uploadFileFileName,也就是在文件后加入FileName,不然不能识别

packagecom.adtec.datacenter.action.manager;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.List;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.io.FileUtils;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.struts2.ServletActionContext;
importcom.adtec.datacenter.dao.manager.FileLoadDao;
importcom.adtec.datacenter.dao.manager.RoleDao;
importcom.adtec.datacenter.entity.manager.PtRoleInfo;
importcom.adtec.datacenter.vo.manager.RoleInfo;
importcom.opensymphony.xwork2.ActionSupport;
publicclassRoleFileUploadActionextendsActionSupport{
privateFile uploadFile;
privateString uploadFileFileName;
privateFileLoadDao fileLoadDao;
privateRoleDao roleDao;
publicFile getUploadFile() {
returnuploadFile;
}
publicvoidsetUploadFile(File uploadFile) {
this.uploadFile = uploadFile;
}
publicString getUploadFileFileName() {
returnuploadFileFileName;
}
publicvoidsetUploadFileFileName(String uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
}
publicFileLoadDao getFileLoadDao() {
returnfileLoadDao;
}
publicvoidsetFileLoadDao(FileLoadDao fileLoadDao) {
this.fileLoadDao = fileLoadDao;
}
publicRoleDao getRoleDao() {
returnroleDao;
}
publicvoidsetRoleDao(RoleDao roleDao) {
this.roleDao = roleDao;
}
@Override
publicvoidvalidate() {
super.validate();
}
publicString loadRoleFile(){
String directory = “/upload/role”;
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
//生成上传的文件对象
File target = newFile(targetDirectory,uploadFileFileName);
//如果文件已经存在,则删除原有文件
if(target.exists()){
target.delete();
}
//复制file对象,实现上传
try{
FileUtils.copyFile(uploadFile, target);
//out = response.getWriter();
//out.print(“文件上传成功!”);
} catch(IOException e) {
e.printStackTrace();
}
loadRoleInfo(uploadFileFileName);
returnSUCCESS;
}
/**
* 把Excele表读出的数据,组装成一个List,统一导入数据库
* @param uploadFileFileName
*/
publicvoidloadRoleInfo(String uploadFileFileName){
String directory = “/upload/role”;
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
File target = newFile(targetDirectory,uploadFileFileName);
List roleList = newArrayList();
try{
FileInputStream fi = newFileInputStream(target);
Workbook wb = newHSSFWorkbook(fi);
Sheet sheet = wb.getSheetAt(0);
introwNum = sheet.getLastRowNum()+1;
for(inti=1;i
PtRoleInfo ptRoleInfo = newPtRoleInfo();
Row row = sheet.getRow(i);
intcellNum = row.getLastCellNum();
for(intj=0;j
Cell cell = row.getCell(j);
String cellValue = null;
switch(cell.getCellType()){//判断excel单元格内容的格式,并对其进行转换,以便插入数据库
case0: cellValue = String.valueOf((int)cell.getNumericCellValue());break;
case1: cellValue = cell.getStringCellValue();break;
case2: cellValue = String.valueOf(cell.getDateCellValue());break;
case3: cellValue =“”;break;
case4: cellValue = String.valueOf(cell.getBooleanCellValue());break;
case5: cellValue = String.valueOf(cell.getErrorCellValue());break;
}
switch(j){//通过列数来判断对应插如的字段
case0: ptRoleInfo.setRoleId(cellValue);break;
case1: ptRoleInfo.setRoleName(cellValue);break;
case2: ptRoleInfo.setDeil(cellValue);break;
}
}
roleList.add(ptRoleInfo);
}
fileLoadDao.roleInfotoDB(roleList);
}catch(IOException e){
e.printStackTrace();
}
}
}

roleDao接口实现

这里接口类就不贴出来了,直接贴实现类,把持久化实体List循环写入数据库

packagecom.adtec.datacenter.dao.manager;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Iterator;
importjava.util.List;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.io.FileUtils;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.struts2.ServletActionContext;
importorg.hibernate.HibernateException;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
importcom.adtec.datacenter.entity.manager.PtRoleInfo;
importcom.adtec.datacenter.vo.manager.RoleInfo;
/**
* 文件工具类
* @author Tony
*
*/
publicclassFileLoadDaoImplextendsHibernateDaoSupportimplementsFileLoadDao {
/**
* 把从excel表读出的数据写入到数据库
*/
publicvoidroleInfotoDB(List roleList){
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
if(roleList.size() >0){
introleNum = roleList.size();
for(inti=0;i
session.save(roleList.get(i));
}
/*for(Iterator iterator = roleList.iterator();iterator.hasNext();){
session.save(iterator.next());
}*/
}
tx.commit();
}catch(HibernateException e){
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
//this.getHibernateTemplate().saveOrUpdateAll(roleList);
return;
}
}

这里循环写入数据库,可以使用Spring自动注入的事务管理,更方便简洁,可惜我这里的框架不知道为什么,只要注入事务管理就报错,TT正在查找问题所在!哭……..

这样Excel文件的读取以及数据库的写入就实现了!