文件信息批量导入数据库(Struts2实现文件上传,POI实现Excel文件读取并写入数据库) .

如题:文件信息的批量导入......

项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制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页面:

 

  1. <body>  
  2.     <s:form id="form1" name="form1" action="roleFileUpload.action" method="post" enctype="multipart/form-data" theme="simple">  
  3.         <div align="center" id="div1" style="width: 80%">  
  4.     <table width="80%" border="1" align="center" class="DB_table">  
  5.       <tr>  
  6.         <td colspan="99" align="left">文件上传</td>  
  7.       </tr>  
  8.       <tr>  
  9.         <td colspan="99" id="more">  
  10.           <s:file name="uploadFile" label="文件位置" size="80"/>  
  11.         </td>  
  12.       </tr>  
  13.       <tr>  
  14.         <td colspan="99" align="right">  
  15.         <s:submit value="上传"></s:submit>  
  16.         <s:reset value="重置"></s:reset>  
  17.         </td>  
  18.       </tr>  
  19.         </table>  
  20.     </div>  
  21.     </s:form>  
  22.   </body>  

 

 

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

 

 

对应的applicationContext.xml配置

  1. <bean id="roleFileAction" class="com.adtec.datacenter.action.manager.RoleFileUploadAction"  
  2.     scope="prototype">  
  3.     <property name="fileLoadDao" ref="fileLoadDao"></property>  
  4. </bean>  
  5. <bean id="fileLoadDao"  
  6.     class="com.adtec.datacenter.dao.manager.FileLoadDaoImpl">  
  7.     <property name="sessionFactory" ref="sessionFactory"></property>  
  8. </bean>  

 

RoleFileUploadAction实现

这里有几个点需要注意:

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

 

  1. package com.adtec.datacenter.action.manager;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.commons.io.FileUtils;  
  13. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  14. import org.apache.poi.ss.usermodel.Cell;  
  15. import org.apache.poi.ss.usermodel.Row;  
  16. import org.apache.poi.ss.usermodel.Sheet;  
  17. import org.apache.poi.ss.usermodel.Workbook;  
  18. import org.apache.struts2.ServletActionContext;  
  19.   
  20. import com.adtec.datacenter.dao.manager.FileLoadDao;  
  21. import com.adtec.datacenter.dao.manager.RoleDao;  
  22. import com.adtec.datacenter.entity.manager.PtRoleInfo;  
  23. import com.adtec.datacenter.vo.manager.RoleInfo;  
  24. import com.opensymphony.xwork2.ActionSupport;  
  25.   
  26. public class RoleFileUploadAction extends ActionSupport{  
  27.       
  28.     private File uploadFile;  
  29.     private String uploadFileFileName;  
  30.     private FileLoadDao fileLoadDao;  
  31.     private RoleDao roleDao;  
  32.       
  33.     public File getUploadFile() {  
  34.         return uploadFile;  
  35.     }  
  36.     public void setUploadFile(File uploadFile) {  
  37.         this.uploadFile = uploadFile;  
  38.     }  
  39.     public String getUploadFileFileName() {  
  40.         return uploadFileFileName;  
  41.     }  
  42.     public void setUploadFileFileName(String uploadFileFileName) {  
  43.         this.uploadFileFileName = uploadFileFileName;  
  44.     }  
  45.       
  46.     public FileLoadDao getFileLoadDao() {  
  47.         return fileLoadDao;  
  48.     }  
  49.     public void setFileLoadDao(FileLoadDao fileLoadDao) {  
  50.         this.fileLoadDao = fileLoadDao;  
  51.     }  
  52.       
  53.     public RoleDao getRoleDao() {  
  54.         return roleDao;  
  55.     }  
  56.     public void setRoleDao(RoleDao roleDao) {  
  57.         this.roleDao = roleDao;  
  58.     }  
  59.     @Override  
  60.     public void validate() {  
  61.         super.validate();  
  62.     }  
  63.       
  64.     public String loadRoleFile(){  
  65.           
  66.         String directory = "/upload/role";  
  67.         String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);  
  68.         //生成上传的文件对象   
  69.         File target = new File(targetDirectory,uploadFileFileName);  
  70.         //如果文件已经存在,则删除原有文件   
  71.         if(target.exists()){  
  72.             target.delete();  
  73.         }  
  74.         //复制file对象,实现上传   
  75.         try {  
  76.             FileUtils.copyFile(uploadFile, target);  
  77.               
  78.             //out = response.getWriter();   
  79.             //out.print("文件上传成功!");   
  80.         } catch (IOException e) {  
  81.             e.printStackTrace();  
  82.         }  
  83.           
  84.         loadRoleInfo(uploadFileFileName);  
  85.         return SUCCESS;  
  86.     }  
  87.       
  88.     /** 
  89.      * 把Excele表读出的数据,组装成一个List,统一导入数据库 
  90.      * @param uploadFileFileName 
  91.      */  
  92.     public void loadRoleInfo(String uploadFileFileName){  
  93.           
  94.         String directory = "/upload/role";   
  95.         String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);  
  96.         File target = new File(targetDirectory,uploadFileFileName);  
  97.           
  98.         List roleList = new ArrayList();  
  99.         try{  
  100.             FileInputStream fi = new FileInputStream(target);  
  101.             Workbook wb = new HSSFWorkbook(fi);  
  102.             Sheet sheet = wb.getSheetAt(0);  
  103.               
  104.             int rowNum = sheet.getLastRowNum()+1;  
  105.             for(int i=1;i<rowNum;i++){  
  106.                 PtRoleInfo ptRoleInfo = new PtRoleInfo();  
  107.                 Row row = sheet.getRow(i);  
  108.                 int cellNum = row.getLastCellNum();  
  109.                 for(int j=0;j<cellNum;j++){  
  110.                     Cell cell = row.getCell(j);  
  111.                     String cellValue = null;  
  112.                     switch(cell.getCellType()){ //判断excel单元格内容的格式,并对其进行转换,以便插入数据库   
  113.                         case 0 : cellValue = String.valueOf((int)cell.getNumericCellValue()); break;  
  114.                         case 1 : cellValue = cell.getStringCellValue(); break;  
  115.                         case 2 : cellValue = String.valueOf(cell.getDateCellValue()); break;  
  116.                         case 3 : cellValue = ""break;  
  117.                         case 4 : cellValue = String.valueOf(cell.getBooleanCellValue()); break;  
  118.                         case 5 : cellValue = String.valueOf(cell.getErrorCellValue()); break;  
  119.                     }  
  120.                       
  121.                     switch(j){//通过列数来判断对应插如的字段   
  122.                         case 0 : ptRoleInfo.setRoleId(cellValue);break;  
  123.                         case 1 : ptRoleInfo.setRoleName(cellValue);break;  
  124.                         case 2 : ptRoleInfo.setDeil(cellValue);break;  
  125.                     }  
  126.                 }  
  127.                 roleList.add(ptRoleInfo);  
  128.             }  
  129.             fileLoadDao.roleInfotoDB(roleList);  
  130.         }catch(IOException e){  
  131.             e.printStackTrace();  
  132.         }  
  133.     }  
  134.       
  135.       
  136. }  

 

roleDao接口实现

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

 

  1. package com.adtec.datacenter.dao.manager;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.PrintWriter;  
  8. import java.util.Iterator;  
  9. import java.util.List;  
  10.   
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.apache.commons.io.FileUtils;  
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  15. import org.apache.poi.ss.usermodel.Cell;  
  16. import org.apache.poi.ss.usermodel.Row;  
  17. import org.apache.poi.ss.usermodel.Sheet;  
  18. import org.apache.poi.ss.usermodel.Workbook;  
  19. import org.apache.struts2.ServletActionContext;  
  20. import org.hibernate.HibernateException;  
  21. import org.hibernate.Session;  
  22. import org.hibernate.Transaction;  
  23. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  24.   
  25. import com.adtec.datacenter.entity.manager.PtRoleInfo;  
  26. import com.adtec.datacenter.vo.manager.RoleInfo;  
  27. /** 
  28.  * 文件工具类 
  29.  * @author Tony 
  30.  * 
  31.  */  
  32. public class FileLoadDaoImpl extends HibernateDaoSupport implements FileLoadDao {  
  33.     /** 
  34.      * 把从excel表读出的数据写入到数据库 
  35.      */  
  36.     public void roleInfotoDB(List roleList){  
  37.         Session session = this.getHibernateTemplate().getSessionFactory().openSession();  
  38.         Transaction tx = null;  
  39.           
  40.         try{  
  41.             tx = session.beginTransaction();  
  42.             if(roleList.size() > 0){  
  43.                   
  44.                 int roleNum = roleList.size();  
  45.                 for(int i=0;i<roleNum;i++){  
  46.                     session.save(roleList.get(i));  
  47.                 }  
  48.                 /*for(Iterator iterator = roleList.iterator();iterator.hasNext();){ 
  49.                     session.save(iterator.next()); 
  50.                 }*/  
  51.             }  
  52.             tx.commit();  
  53.         }catch(HibernateException e){  
  54.             e.printStackTrace();  
  55.             tx.rollback();  
  56.         }finally{  
  57.             session.close();  
  58.         }  
  59.         //this.getHibernateTemplate().saveOrUpdateAll(roleList);   
  60.         return;  
  61.     }  
  62. }  

 

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

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值