Spring boot 上传文件以及解析Excel

最近工作忙,产品在推广阶段,市场那别的需求猛如虎,而且还使必须做的,基本上两天就要完成一个需求.压力大啊.其中就用到了解析Excel的东西和生成Excel的技术,当然这些东西以前用过,当再次用的时候发现自己忘了,看来知识还是需要记录的.下面就将这次用到的技术做一个记录,是希望可以帮到其他人.

我们公司用的是Spring boot 我就集成POI完成了这次任务,使用IEDA搭建Spring boot特别简单,网上一大把一大把.在这里就不介绍了.

一.Maven坐标

下面是需要的Maven 坐标

 
            org.springframework.boot
            spring-boot-starter
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
        
            org.apache.poi
            poi
            3.14
        
        
            org.apache.poi
            poi-ooxml
            3.14
        
        
            org.apache.poi
            poi-ooxml-schemas
            3.14
        
        
        
            com.xiaoleilu
            hutool-all
            3.3.2
        

        
        
            org.projectlombok
            lombok
            1.16.20
            provided
        
        
        
            com.google.code.gson
            gson
            2.8.2
        

以上是需要用到的maven坐标,并将每一个的依赖的作用加了注释.

二.文件的的上传

1.文件的上传的配置

/**
 * 

* 类说明 *

* * @author Alemand * @since 2018/3/19 */ @Configuration public class UploadFileProperties extends WebMvcConfigurerAdapter { @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // 设置文件大小限制 ,超出设置页面会抛出异常信息, // 这样在文件上传的地方就需要进行异常信息的处理了; factory.setMaxFileSize("128MB"); // KB,MB /// 设置总上传数据总大小 factory.setMaxRequestSize("256MB"); //设置文件路径 //factory.setLocation(""); return factory.createMultipartConfig(); } }
2.文件上传的前台页面编写



文件上传示例


    

文件上传示例


文件:

 
  

3.Controller的编写

/**
 * 

* 类说明 *

* * @author Alemand * @since 2018/3/19 */ @RestController @RequestMapping("/resolve") public class ResolveExcelController { @Resource(name = "resolveExcelServiceImpl") private ResolveExcelService resolveExcelService; /** * 文件上传 */ @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public ApiResponse uploadExcel(@RequestParam("file") MultipartFile file) { Object result; try { result = resolveExcelService.resolveExcel(file); //如果需要将文件放到服务其中加以下代码 /* try { BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(file.getOriginalFilename()))); out.write(file.getBytes()); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); }*/ } catch (BusinessException e) { e.printStackTrace(); return ApiResponse.failOf(-1, e.getErrMsg()); } return ApiResponse.successOf(result); } }

4.Service层的编写要在Service解析Excel在这里我将解析到的数据封装到了一个对象

下面是我的对象字段

@Data
public class ReqImportClient {

    @SerializedName("userName")
    @Expose
    private String userName;

    @SerializedName("loginName")
    @Expose
    private String loginName;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("groupID")
    @Expose
    private String groupID;
    
}

@Service("resolveExcelServiceImpl")
public class ResolveExcelServiceImpl implements ResolveExcelService {
    /**
     *打印日志
     */
    private static final Log logger = LogFactory.get();
    /**
     * 注册url
     */
    private static final String SUFFIX_2003 = ".xls";
    private static final String SUFFIX_2007 = ".xlsx";
    /**
     * 电话的正则
     */
    public static final String PHONE_NUMBER_REG = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[01356789]|18[0-9]|19[89])\\d{8}$";
    /**
     * 密码长度
     */
    public static final int passWardLength = 6;

    @Override
    public List resolveExcel(MultipartFile file) throws BusinessException {


        List list = new ArrayList<>();
        if (file == null) {
            throw new BusinessException(ReturnCode.CODE_FAIL, "对象不能为空");
        }
        //获取文件的名字
        String originalFilename = file.getOriginalFilename();
        Workbook workbook = null;
        try {
            if (originalFilename.endsWith(SUFFIX_2003)) {
                workbook = new HSSFWorkbook(file.getInputStream());
            } else if (originalFilename.endsWith(SUFFIX_2007)) {
                workbook = new XSSFWorkbook(file.getInputStream());
            }
        } catch (Exception e) {
            logger.info(originalFilename);
            e.printStackTrace();
            throw new BusinessException(ReturnCode.CODE_FAIL, "格式错误");
        }
        if (workbook == null) {
            logger.info(originalFilename);
            throw new BusinessException(ReturnCode.CODE_FAIL, "格式错误");
        } else {
            //获取所有的工作表的的数量
            int numOfSheet = workbook.getNumberOfSheets();
            //遍历这个这些表
            for (int i = 0; i < numOfSheet; i++) {
                //获取一个sheet也就是一个工作簿
                Sheet sheet = workbook.getSheetAt(i);
                int lastRowNum = sheet.getLastRowNum();
                //从第一行开始第一行一般是标题
                for (int j = 1; j <= lastRowNum; j++) {
                    Row row = sheet.getRow(j);
                    ReqImportClient reqImportClient = new ReqImportClient();
                    //获取电话单元格
                    if (row.getCell(0) != null) {
                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
                        String longName = row.getCell(0).getStringCellValue();
                        //todo 正则比对
                        boolean matche = Pattern.matches(PHONE_NUMBER_REG, longName);
                        if (!matche) {
                            throw new BusinessException(ReturnCode.CODE_FAIL, "电话格式错误");
                        }
                        reqImportClient.setLoginName(longName);
                    }
                    //密码
                    if (row.getCell(1) != null) {
                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
                        String passWard = row.getCell(1).getStringCellValue();
                        if (passWard.replace("", "").length() < passWardLength) {//校验密码长度
                            throw new BusinessException(ReturnCode.CODE_FAIL, "密码的格式有误");
                        }
                        reqImportClient.setPassword(passWard);
                    }
                    //姓名
                    if (row.getCell(2) != null) {
                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
                        String userName = row.getCell(2).getStringCellValue();
                        reqImportClient.setUserName(userName);
                    }
                    if (row.getCell(3) != null) {
                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
                        String groupID = row.getCell(3).getStringCellValue();
                        reqImportClient.setGroupID(groupID);
                    }
                    list.add(reqImportClient);
                }
            }
        }
        return list;
    }


}

这样就将Excel解析完了,其实学会了是比较简单的.没有技术难度的.

最后附上Demo的地址gitHub



你可能感兴趣的:(应用)