爱卓越-论坛

 找回密码
 立即注册
查看: 399|回复: 0

java 实现excel中的数据导入到数据库的功能

[复制链接]

57

主题

61

帖子

1171

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1171
QQ
发表于 2017-11-14 11:30:11 | 显示全部楼层 |阅读模式
java web项目导入excel获取数据,是实用频率非常高的功能,通过做了几个这样的功能之后,现将此功能总结出了,为了以后自己方便使用,也为大家实现此功能做一个参考.
项目框架
1,后台:spring+springmvc+mybatis
2,前台: bootstrap+jquery+ajax
3,项目管理:maven
说明.excel处理函数需要引入poi的jar包,在pom.xml引入一下代码

  • <!-- POI -->  
  • <dependency>  
  •     <groupId>org.apache.poi</groupId>  
  •     <artifactId>poi</artifactId>  
  •     <version>3.8</version>  
  •     <exclusions>  
  •         <exclusion>  
  •             <artifactId>commons-codec</artifactId>  
  •             <groupId>commons-codec</groupId>  
  •         </exclusion>  
  •     </exclusions>  
  • </dependency>  
  • <dependency>  
  •     <groupId>org.apache.poi</groupId>  
  •     <artifactId>poi-ooxml</artifactId>  
  •     <version>3.8</version>  
  • </dependency>  


别的框架大体上也是可以的,只需稍微调整,如有问题,大家可留言讨论
实现的功能说明:将用户信息(姓名,性别,年龄)通过excel上传,并保存到数据库
具体代码如下
1,前台html代码

  • <form enctype="multipart/form-data" id="batchUpload"  action="user/upload" method="post" class="form-horizontal">   
  •     <button class="btn btn-success btn-xs" id="uploadEventBtn" style="height:26px;"  type="button" >选择文件</button>  
  •     <input type="file" name="file"  style="width:0px;height:0px;" id="uploadEventFile">  
  •     <input id="uploadEventPath"  disabled="disabled"  type="text" placeholder="请选择excel表" style="border: 1px solid #e6e6e6; height: 26px;width: 200px;" >                                          
  • </form>  
  • <button type="button" class="btn btn-success btn-sm"  onclick="user.uploadBtn()" >上传</button>  


前台页面效果

excel内容展示

2,JS代码


  • var User = function(){  
  •       
  •     this.init = function(){  
  •          
  •         //模拟上传excel  
  •          $("#uploadEventBtn").unbind("click").bind("click",function(){  
  •              $("#uploadEventFile").click();  
  •          });  
  •          $("#uploadEventFile").bind("change",function(){  
  •              $("#uploadEventPath").attr("value",$("#uploadEventFile").val());  
  •          });  
  •          
  •     };  
  •     //点击上传按钮  
  •     this.uploadBtn = function(){  
  •         var uploadEventFile = $("#uploadEventFile").val();  
  •         if(uploadEventFile == ''){  
  •             alert("请选择excel,再上传");  
  •         }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
  •             alert("只能上传Excel文件");  
  •         }else{  
  •             var url =  '/user/upload/';  
  •             var formData = new FormData($('form')[0]);  
  •             user.sendAjaxRequest(url,'POST',formData);  
  •         }  
  •     };  
  •       
  •     this.sendAjaxRequest = function(url,type,data){  
  •         $.ajax({  
  •             url : url,  
  •             type : type,  
  •             data : data,  
  •             success : function(result) {  
  •                 alert( result);  
  •             },  
  •             error : function() {  
  •                 alert( "excel上传失败");  
  •             },  
  •             cache : false,  
  •             contentType : false,  
  •             processData : false  
  •         });  
  •     };  
  • }  
  •       
  •   
  • var user;  
  • $(function(){  
  •     user = new User();  
  •     user.init();  
  • });  




3,domon层用户的实体类


  • /**  
  • * @author  李光光(编码小王子)
  • * @date    2016年11月7日 下午2:57:03  
  • * @version 1.0   
  • */  
  • public class User {  
  •     private  String name;  
  •     private String sex;  
  •     private String age;  
  •     public String getName() {  
  •         return name;  
  •     }  
  •     public void setName(String name) {  
  •         this.name = name;  
  •     }  
  •     public String getSex() {  
  •         return sex;  
  •     }  
  •     public void setSex(String sex) {  
  •         this.sex = sex;  
  •     }  
  •     public String getAge() {  
  •         return age;  
  •     }  
  •     public void setAge(String age) {  
  •         this.age = age;  
  •     }  
  •       
  •       
  •   
  • }  




4,controller层代码


  • @Controller  
  • @RequestMapping("/user")  
  • public class UserController{  
  •       
  •     @Autowired  
  •     private UserService  userService;  
  •       
  •     @RequestMapping(value="/upload",method = RequestMethod.POST)  
  •     @ResponseBody  
  •     public String  upload(@RequestParam(value="file",required = false)MultipartFile file,HttpServletRequest request, HttpServletResponse response){  
  •         Sring result = userService.readExcelFile(file);  
  •         return result;  
  •     }  
  • }  

5,service层代码
1),service层接口


  • public interface UserService {  
  •   
  •     /**
  •      * 读取excel中的数据,生成list
  •      */  
  •     String readExcelFile( MultipartFile file);  
  •   
  • }  

2),servic实现层代码

  • @Service  
  • public class MeetingRoomServiceImpl implements MeetingRoomService {  
  •   
  • @Override  
  •     public String readExcelFile(MultipartFile file) {  
  •         String result ="";  
  •         //创建处理EXCEL的类  
  •         ReadExcel readExcel=new ReadExcel();  
  •         //解析excel,获取上传的事件单  
  •         List<User> useList = readExcel.getExcelInfo(file);  
  •         //至此已经将excel中的数据转换到list里面了,接下来就可以操作list,可以进行保存到数据库,或者其他操作,  
  •         //和你具体业务有关,这里不做具体的示范  
  •         if(useList != null && !useList.isEmpty()){  
  •             result = "上传成功";  
  •         }else{  
  •             result = "上传失败";  
  •         }  
  •         return result;  
  •     }  
  •   
  •   
  • }  





3),excel处理函数

  • /**  
  • * @author  李光光(编码小王子)
  • * @date    2016年10月17日 下午2:19:39  
  • * @version 1.0   
  • */  
  • public class ReadExcel {  
  •     //总行数  
  •     private int totalRows = 0;   
  •     //总条数  
  •     private int totalCells = 0;   
  •     //错误信息接收器  
  •     private String errorMsg;  
  •     //构造方法  
  •     public ReadExcel(){}  
  •     //获取总行数  
  •     public int getTotalRows()  { return totalRows;}   
  •     //获取总列数  
  •     public int getTotalCells() {  return totalCells;}   
  •     //获取错误信息  
  •     public String getErrorInfo() { return errorMsg; }   
  •       
  •   /**
  •    * 读EXCEL文件,获取信息集合
  •    * @param fielName
  •    * @return
  •    */  
  •     public List<User> getExcelInfo(MultipartFile mFile) {  
  •         String fileName = mFile.getOriginalFilename();//获取文件名  
  •         try {  
  •             if (!validateExcel(fileName)) {// 验证文件名是否合格  
  •                 return null;  
  •             }  
  •             boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本  
  •             if (isExcel2007(fileName)) {  
  •                 isExcel2003 = false;  
  •             }  
  •             List<User> userList = createExcel(mFile.getInputStream(), isExcel2003);  
  •         } catch (Exception e) {  
  •             e.printStackTrace();  
  •         }  
  •         return userList;  
  •     }  
  •    
  •   /**
  •    * 根据excel里面的内容读取客户信息
  •    * @param is 输入流
  •    * @param isExcel2003 excel是2003还是2007版本
  •    * @return
  •    * @throws IOException
  •    */  
  •     public List<User> createExcel(InputStream is, boolean isExcel2003) {  
  •         try{  
  •             Workbook wb = null;  
  •             if (isExcel2003) {// 当excel是2003时,创建excel2003  
  •                 wb = new HSSFWorkbook(is);  
  •             } else {// 当excel是2007时,创建excel2007  
  •                 wb = new XSSFWorkbook(is);  
  •             }  
  •             List<User> userList = readExcelValue(wb);// 读取Excel里面客户的信息  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         }  
  •         return userList;  
  •     }  
  •    
  •   /**
  •    * 读取Excel里面客户的信息
  •    * @param wb
  •    * @return
  •    */  
  •     private List<User> readExcelValue(Workbook wb) {  
  •         // 得到第一个shell  
  •         Sheet sheet = wb.getSheetAt(0);  
  •         // 得到Excel的行数  
  •         this.totalRows = sheet.getPhysicalNumberOfRows();  
  •         // 得到Excel的列数(前提是有行数)  
  •         if (totalRows > 1 && sheet.getRow(0) != null) {  
  •             this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();  
  •         }  
  •         List<User> userList = new ArrayList<User>();  
  •         // 循环Excel行数  
  •         for (int r = 1; r < totalRows; r++) {  
  •             Row row = sheet.getRow(r);  
  •             if (row == null){  
  •                 continue;  
  •             }  
  •             User user = new User();  
  •             // 循环Excel的列  
  •             for (int c = 0; c < this.totalCells; c++) {  
  •                 Cell cell = row.getCell(c);  
  •                 if (null != cell) {  
  •                     if (c == 0) {  
  •                         //如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25  
  •                         if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
  •                             String name = String.valueOf(cell.getNumericCellValue());  
  •                             user.setName(name.substring(0, name.length()-2>0?name.length()-2:1));//名称  
  •                         }else{  
  •                             user.setName(cell.getStringCellValue());//名称  
  •                         }  
  •                     } else if (c == 1) {  
  •                         if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
  •                             String sex = String.valueOf(cell.getNumericCellValue());  
  •                             user.setSex(sex.substring(0, sex.length()-2>0?sex.length()-2:1));//性别  
  •                         }else{  
  •                             user.setSex(cell.getStringCellValue());//性别  
  •                         }  
  •                     } else if (c == 2){  
  •                         if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
  •                             String age = String.valueOf(cell.getNumericCellValue());  
  •                             user.setAge(age.substring(0, age.length()-2>0?age.length()-2:1));//年龄  
  •                         }else{  
  •                             user.setAge(cell.getStringCellValue());//年龄  
  •                         }  
  •                     }  
  •                 }  
  •             }  
  •             // 添加到list  
  •             userList.add(user);  
  •         }  
  •         return userList;  
  •     }  
  •       
  •     /**
  •      * 验证EXCEL文件
  •      *  
  •      * @param filePath
  •      * @return
  •      */  
  •     public boolean validateExcel(String filePath) {  
  •         if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {  
  •             errorMsg = "文件名不是excel格式";  
  •             return false;  
  •         }  
  •         return true;  
  •     }  
  •       
  •     // @描述:是否是2003的excel,返回true是2003   
  •     public static boolean isExcel2003(String filePath)  {   
  •          return filePath.matches("^.+\\.(?i)(xls)$");   
  •      }   
  •      
  •     //@描述:是否是2007的excel,返回true是2007   
  •     public static boolean isExcel2007(String filePath)  {   
  •          return filePath.matches("^.+\\.(?i)(xlsx)$");   
  •      }   
  • }  



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|论坛 ( 粤ICP备17122063号 )

GMT+8, 2017-11-24 11:52 , Processed in 0.044312 second(s), 19 queries .

快速回复 返回顶部 返回列表