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="userDevice.uploadBtn()" >上传</button>
前台页面效果
excel内容展示
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(); });
/** * @author 李光光(编码小王子) * @erp liguangguang * @Email [email protected] * @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; } }
/** * @author 李光光(编码小王子) * @erp liguangguang * @Email [email protected] * @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)$"); } }