excel导入方法改进

改进的地方:1.controllre关于可以通过file直接获取数入流,不用再通过磁盘转一下

                      2.把需要进行必填项验证的字段(其实就是字段的string为非必填)放到一个set集合中,通过反射的形式自动判断,如果有错误放入list集合中,同样思路可以用于判断是否为数字

                      3.导入的话需要维护一个list集合,用于存放于导入表格对应的列,按顺序放入,后期可以维护一个linkhashmap  通过中文与字段的对应关系,先通过中文的表头找出字段对应的列,创建一个map,这样导入的话列可以打乱,后台可以维护我要从导入表中取得linkhashmap  ,这样思路和导出就对应上了修改就方便了。

 @ApiOperation(value = "xxx")
    @PostMapping(value = "xxx")
    public ResultVO<String> xxx(MultipartFile file) throws Exception {

        InputStream inputStream = file.getInputStream(); // 可以直接获取输入流
        ArrayList arrayList = new ArrayList();
//        arrayList.add("id");
    
        arrayList.add("telephone");
        arrayList.add("email");
        arrayList.add("phone");
        arrayList.add("fax");
        arrayList.add("address");
        arrayList.add("description");

        List<xx> listByExcel = ExportLinkHash.getListByExcel(inputStream, arrayList);
        
        Date currentTime = new Date();
       
        ArrayList<String> err = new ArrayList<>();
        List<String> legalPersonIdList = (List<String>) resultVO.getData();
        for(SupplyContract supp:listByExcel){

            Set<String> validateProperty = new HashSet<String>();
            validateProperty.add("isEnableName");
            validateProperty.add("startTimeName");
            validateProperty.add("endTimeName");
            validateProperty.add("contacts");
            validateProperty.add("telephone");
            List list = BeanUtil.checkBeanFieldIsNull( supp, validateProperty);
            if(list.size()>0) {
                if(supp.getSupplyContractCode()!=null){
                    err.add(""+supp.getSupplyContractCode()+list.toString()+"存在必填项为空");
                }
            }

        }
        if(err.size()>0) {
             return resultVOBuilder.failure(err.toString());
        }

        
           

        inputStream.close();

        return null;
    }

现在的类时根据导入写死的 后期改为泛型

public static List<xx> getListByExcel(InputStream in, ArrayList arrayList) throws Exception {

        List<xx> supplyContracts = new ArrayList<>();
        //创建Excel工作薄
        Workbook work = getWorkbook(in);
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;

        //遍历Excel中所有的sheet
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if (sheet == null) {
                continue;
            }

            //遍历当前sheet中的所有行
            for (int j =1; j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                if (row == null ) {
                    continue;
                }


                xx.supp = new xx();

//*该方法用于传入某实例对象以及对象方法名、修改值,通过放射调用该对象的某个set方法设置修改值*/
//                public static Object setProperty(Object beanObj, String property, Object value)v
                        for(i=0;i<arrayList.size();i++){
                            if(row.getCell(i)!=null&&String.valueOf(getCellValue(row.getCell(i)))!=null){
                                System.out.println(String.valueOf(getCellValue(row.getCell(i))));

                                setProperty(supp, String.valueOf(arrayList.get(i)), String.valueOf(getCellValue(row.getCell(i))));

                            }
                        }



                //遍历所有的列(把每一行的内容存放到对象中)
                supplyContracts.add(supp);
            }
            System.out.println(supplyContracts.get(0).toString());
        }

        return supplyContracts;
    }

还有一个工具类实现get方法和set方法的反射

  
public static Workbook getWorkbook(InputStream inStr) throws Exception {
    Workbook wb = null;
    wb = WorkbookFactory.create(inStr);
    return wb;
}
    /*该方法用于传入某实例对象以及对象方法名,通过反射调用该对象的某个get方法*/
    public static Object getProperty(Object beanObj, String property) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        //此处应该判断beanObj,property不为null
        PropertyDescriptor pd = new PropertyDescriptor(property, beanObj.getClass());
        Method getMethod = pd.getReadMethod();
        if(getMethod == null){

        }
        return getMethod.invoke(beanObj);
    }
    /*该方法用于传入某实例对象以及对象方法名、修改值,通过放射调用该对象的某个set方法设置修改值*/
    public static Object setProperty(Object beanObj, String property, Object value) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
        //此处应该判断beanObj,property不为null
        PropertyDescriptor pd = new PropertyDescriptor(property, beanObj.getClass());
        Method setMethod = pd.getWriteMethod();
        if(setMethod == null){

        }
        return setMethod.invoke(beanObj, value);
    }
    }

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是为改进前的代码相比以上代码有更好的维护性

为改进前的代码

                //把每个单元格的值付给对象的对应属性
                if (row.getCell(0)!=null){
                    supp.setId(String.valueOf(getCellValue(row.getCell(0))));
                }
                if (row.getCell(1)!=null){
                    supp.setSupplyContractCode(String.valueOf(getCellValue(row.getCell(1))));
                }
                if (row.getCell(2)!=null){
                    supp.setIsEnableName(String.valueOf(getCellValue(row.getCell(2))));
                }
                if (row.getCell(3)!=null){
                    supp.setSupplierCode(String.valueOf(getCellValue(row.getCell(3))));
                }
                if (row.getCell(4)!=null){
                    supp.setIsEnableName(String.valueOf(getCellValue(row.getCell(4))));
                }
                if (row.getCell(5)!=null){
                    supp.setStartTimeName(String.valueOf(getCellValue(row.getCell(5))));
                }
                if (row.getCell(6)!=null){
                    supp.setEndTimeName(String.valueOf(getCellValue(row.getCell(6))));
                }

                if (row.getCell(7)!=null){
                    supp.setBankName(String.valueOf(getCellValue(row.getCell(7))));
                }
                if (row.getCell(8)!=null){
                    supp.setBankAccount(String.valueOf(getCellValue(row.getCell(8))));
                }
                if (row.getCell(9)!=null){
                    supp.setPaymentTime(String.valueOf(getCellValue(row.getCell(9))));
                }
                if (row.getCell(10)!=null){
                    supp.setPaymentMethod(String.valueOf(getCellValue(row.getCell(10))));
                }
                if (row.getCell(11)!=null){
                    supp.setServiceMode(String.valueOf(getCellValue(row.getCell(11))));
                }

猜你喜欢

转载自blog.csdn.net/fwk19840301/article/details/81710629