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,domain层用户的实体类
- /**
- * @author liuchj
- * @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;
- }
- }
1),service层接口
- public interface UserService {
- /**
- * 读取excel中的数据,生成list
- */
- String readExcelFile( MultipartFile file);
- }
2),service实现层代码
- @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 liuchj
- * @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)$");
- }
- }