使用模板导入excel 得到数据

拿到excel 再去读取,很难受,搞个工具类,舒服的一,上代码记录一下:

方法调用实例:

@ApiOperation(value = "StaffInfoManageImport", notes = "")
@ResponseBody
@RequestMapping("/importExcel")
@UserPermission(userIdentity="admin")
@Transactional(rollbackFor=Exception.class)
public Result importExcel(@RequestParam(name="file",required=false) MultipartFile multFile) {
    EmplUser emplUser = null;
    //导入错误行数
    int flag = 1;
    DmDHrStaffInfo dmDHrStaffInfo = null;
    EmplUserPermission emplUserPermission = null;
    Result result = new Result();
    try {
        //得到excel中需要导入的数据
        StaffInfoManage s = new StaffInfoManage();
        String fileName = multFile.getOriginalFilename();
        Workbook wb = ImportExeclUtil.chooseWorkbook(fileName, multFile.getInputStream());
        List<StaffInfoManage> readDateListT = ImportExeclUtil.readDateListT(wb, s, 2, 0);
            for (StaffInfoManage staf : readDateListT) {
                flag++;
                emplUser = new EmplUser();
                dmDHrStaffInfo = new DmDHrStaffInfo();
                emplUserPermission = new EmplUserPermission();
                if(staf.getMail()!=null && !staf.getMail().equals("")){
                    emplUser.setUserId(staf.getMail());//邮箱号码
                }
                if(staf.getMobilePhone()!=null && !staf.getMobilePhone().equals("")){
                    emplUser.setMobilePhone(staf.getMobilePhone());//移动电话
                }else{
                    throw new ServiceException("邮箱和电话不能为空!!!");
                }
                emplUser.setState("2");//填报状态,未填写
                emplUser.setUserName(staf.getUserName());//姓名
                emplUser.seteMail(staf.getMail());//邮箱
                dmDHrStaffInfo.setMail(staf.getMail());
                dmDHrStaffInfo.setTwolevelDepartment(staf.getTwolevelDepartment());//二级部门
                dmDHrStaffInfo.setThreelevelmechanism(staf.getThreelevelmechanism());//三级机构
                dmDHrStaffInfo.setPostDesc(staf.getPostDesc());//岗位名称
                dmDHrStaffInfo.setExecutiveDirector(staf.getExecutiveDirector());//直属主管
                dmDHrStaffInfo.setPostLevel(staf.getPostLevel());//岗位标准等级
                dmDHrStaffInfo.setPositionLevel(staf.getPositionLevel());//个人职级
                dmDHrStaffInfo.setEntryChannels(staf.getEntryChannels());//入职途径
                emplUserService.save(emplUser);
                emplUserPermission.setUserId(emplUser.getUserId());
                emplUserPermission.setPhone(staf.getMobilePhone());
                emplUserPermission.setName(staf.getUserName());
                emplUserPermission.setEmail(staf.getMail());
                emplUserPermission.setAdmin("common");
                emplUserPermissionService.save(emplUserPermission);
                dmDHrStaffInfo.setUserNo(emplUser.getUserId());
                dmDHrStaffInfo.setUserId(emplUser.getUserId());
                dmDHrStaffInfoService.save(dmDHrStaffInfo);
            }
        result.setMessage("导入成功");
        result.setCode(ResultCode.SUCCESS);
    } catch (IOException e) {
        result.setMessage("第"+flag+"行数据错误,导入失败!");
        result.setCode(ResultCode.FAIL);
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return result;
    } catch (Exception e) {
        result.setMessage("第"+flag+"行数据错误,不允许添加重复数据!");
        result.setCode(ResultCode.FAIL);
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return result;
    }
    return result;
}

下面是工具类:

package com.unicom.sh.pom.file.util;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;


import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.unicom.sh.pom.file.IsNeeded;
import com.unicom.sh.pom.file.IsRequired;


import org.apache.commons.beanutils.PropertyUtils;



/**
 * excel 工具类
 * @author fz
 * @version 0.1 (2018年12月20日 上午10:51:42)
 * @since 0.1
 * @see
 */
public class ImportExeclUtil {

   private static int totalRows = 0;// 总行数

   private static int totalCells = 0;// 总列数

   private static String errorInfo;// 错误信息

   /** 无参构造方法 */
   public ImportExeclUtil() {
   }

   public static int getTotalRows() {
      return totalRows;
   }

   public static int getTotalCells() {
      return totalCells;
   }

   public static String getErrorInfo() {
      return errorInfo;
   }

   /**
    * 
    * 根据流读取Excel文件
    * 
    * 
    * @param inputStream
    * @param isExcel2003
    * @return
    * @see [类、类#方法、类#成员]
    */
   public List<List<String>> read(InputStream inputStream, boolean isExcel2003) throws IOException {

      List<List<String>> dataLst = null;

      /** 根据版本选择创建Workbook的方式 */
      Workbook wb = null;

      if (isExcel2003) {
         wb = new HSSFWorkbook(inputStream);
      } else {
         wb = new XSSFWorkbook(inputStream);
      }
      dataLst = readDate(wb);

      return dataLst;
   }

   /**
    * 
    * 读取数据
    * 
    * @param wb
    * @return
    * @see [类、类#方法、类#成员]
    */
   private List<List<String>> readDate(Workbook wb) {

      List<List<String>> dataLst = new ArrayList<>();

      /** 得到第一个shell */
      Sheet sheet = wb.getSheetAt(0);

      /** 得到Excel的行数 */
      totalRows = sheet.getPhysicalNumberOfRows();

      /** 得到Excel的列数 */
      if (totalRows >= 1 && sheet.getRow(0) != null) {
         totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
      }

      for (int r = 0; r < totalRows; r++) {
         Row row = sheet.getRow(r);
         if (row == null) {
            continue;
         }
         List<String> rowLst = new ArrayList<>();
         for (int c = 0; c < getTotalCells(); c++) {
            Cell cell = row.getCell(c);
            String cellValue = "";
            if (null != cell) {
               // 以下是判断数据的类型
               switch (cell.getCellType()) {
               case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                  cellValue = cell.getNumericCellValue() + "";
                  break;

               case HSSFCell.CELL_TYPE_STRING: // 字符串
                  cellValue = cell.getStringCellValue();
                  break;

               case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                  cellValue = cell.getBooleanCellValue() + "";
                  break;

               case HSSFCell.CELL_TYPE_FORMULA: // 公式
                  cellValue = cell.getCellFormula() + "";
                  break;

               case HSSFCell.CELL_TYPE_BLANK: // 空值
                  cellValue = "";
                  break;

               case HSSFCell.CELL_TYPE_ERROR: // 故障
                  cellValue = "非法字符";
                  break;

               default:
                  cellValue = "未知类型";
                  break;
               }
            }

            rowLst.add(cellValue);
         }

         /** 保存第r行的第c列 */
         dataLst.add(rowLst);
      }

      return dataLst;
   }

   /**
    * 
    * 按指定坐标读取实体数据 <按顺序放入带有注解的实体成员变量中>
    * 
    * @param wb
    *            工作簿
    * @param t
    *            实体
    * @param in
    *            输入流
    * @param integers
    *            指定需要解析的坐标
    * @return T 相应实体
    * @throws IOException
    * @throws Exception
    * @see [类、类#方法、类#成员]
    */
   @SuppressWarnings("unused")
   public static <T> T readDateT(Workbook wb, T t, InputStream in, Integer[]... integers)
         throws Exception {
      // 获取该工作表中的第一个工作表
      Sheet sheet = wb.getSheetAt(0);

      // 成员变量的值
      Object entityMemberValue = "";

      // 所有成员变量
      Field[] fields = t.getClass().getDeclaredFields();
      // 列开始下标
      int startCell = 0;

      /** 循环出需要的成员 */
      for (int f = 0; f < fields.length; f++) {

         fields[f].setAccessible(true);
         String fieldName = fields[f].getName();
         boolean fieldHasAnno = fields[f].isAnnotationPresent(IsNeeded.class);
         // 有注解
         if (fieldHasAnno) {
            IsNeeded annotation = fields[f].getAnnotation(IsNeeded.class);
            boolean isNeeded = annotation.isNeeded();

            // Excel需要赋值的列
            if (isNeeded) {

               // 获取行和列
               int x = integers[startCell][0] - 1;
               int y = integers[startCell][1] - 1;

               Row row = sheet.getRow(x);
               Cell cell = row.getCell(y);

               if (row == null) {
                  continue;
               }

               // Excel中解析的值
               String cellValue = getCellValue(cell);
               // 需要赋给成员变量的值
               entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, cellValue);
               // 赋值
               PropertyUtils.setProperty(t, fieldName, entityMemberValue);
               // 列的下标加1
               startCell++;
            }
         }

      }

      return t;
   }

   /**
    * 
    * 读取列表数据 <按顺序放入带有注解的实体成员变量中>
    * 
    * @param wb
    *            工作簿
    * @param t
    *            实体
    * @param beginLine
    *            开始行数
    * @param totalcut
    *            结束行数减去相应行数
    * @return List<T> 实体列表
    * @throws Exception
    * @see [类、类#方法、类#成员]
    */
   @SuppressWarnings("unchecked")
   public static <T> List<T> readDateListT(Workbook wb, T t, int beginLine, int totalcut) throws Exception {
      List<T> listt = new ArrayList<>();

      /** 得到第一个shell */
      Sheet sheet = wb.getSheetAt(0);

      /** 得到Excel的行数 */
      totalRows = sheet.getPhysicalNumberOfRows();

      /** 得到Excel的列数 */
      if (totalRows >= 1 && sheet.getRow(0) != null) {
         totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
      }

      /** 循环Excel的行 */
      for (int r = beginLine - 1; r < totalRows - totalcut; r++) {
         Object newInstance = t.getClass().newInstance();
         Row row = sheet.getRow(r);
         if (row == null) {
            continue;
         }
         // 成员变量的值
         Object entityMemberValue = "";
         // 所有成员变量
         Field[] fields = t.getClass().getDeclaredFields();//按照你的成员属性进行排序的
         // 列开始下标
         int startCell = 0;

         for (int f = 0; f < fields.length; f++) {

            fields[f].setAccessible(true);
            String fieldName = fields[f].getName();
            boolean fieldHasAnno = fields[f].isAnnotationPresent(IsNeeded.class);
            // 有注解
            if (fieldHasAnno) {
               IsNeeded annotation = fields[f].getAnnotation(IsNeeded.class);
               boolean isNeeded = annotation.isNeeded();
               // Excel需要赋值的列
               if (isNeeded) {
                  Cell cell = row.getCell(startCell);
                  String cellValue = getCellValue(cell);
                  entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, cellValue);
                  // 赋值
                  PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
                  // 列的下标加1
                  startCell++;
               }
            }

         }

         listt.add((T) newInstance);
      }

      return listt;
   }

   /**
    * 
    * 根据Excel表格中的数据判断类型得到值
    * 
    * @param cell
    * @return
    * @see [类、类#方法、类#成员]
    */
   private static String getCellValue(Cell cell) {
      String cellValue = "";

      if (null != cell) {
         // 以下是判断数据的类型
         switch (cell.getCellType()) {
         case HSSFCell.CELL_TYPE_NUMERIC: // 数字
            if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
               Date theDate = cell.getDateCellValue();
               SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
               cellValue = dff.format(theDate);
            } else {
               DecimalFormat df = new DecimalFormat("0");
               cellValue = df.format(cell.getNumericCellValue());
            }
            break;
         case HSSFCell.CELL_TYPE_STRING: // 字符串
            cellValue = cell.getStringCellValue();
            break;

         case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
            cellValue = cell.getBooleanCellValue() + "";
            break;

         case HSSFCell.CELL_TYPE_FORMULA: // 公式
            cellValue = cell.getCellFormula() + "";
            break;

         case HSSFCell.CELL_TYPE_BLANK: // 空值
            cellValue = "";
            break;

         case HSSFCell.CELL_TYPE_ERROR: // 故障
            cellValue = "非法字符";
            break;

         default:
            cellValue = "未知类型";
            break;
         }

      }
      return cellValue;
   }

   /**
    * 
    * 根据实体成员变量的类型得到成员变量的值
    * 
    * @param realValue
    * @param fields
    * @param f
    * @param cellValue
    * @return
    * @see [类、类#方法、类#成员]
    */
   private static Object getEntityMemberValue(Object realValue, Field[] fields, int f, String cellValue) {
      String type = fields[f].getType().getName();
      switch (type) {
         case "char":
         case "java.lang.Character":
         case "java.lang.String":
            realValue = cellValue;
            break;
         case "java.util.Date":
            realValue = StringUtils.isBlank(cellValue) ? null : DateUtil.strToDate(cellValue, DateUtil.YYYY_MM_DD);
            break;
         case "java.lang.Integer":
            realValue = StringUtils.isBlank(cellValue) ? null : Integer.valueOf(cellValue);
            break;
         case "int":
         case "float":
         case "double":
         case "java.lang.Double":
         case "java.lang.Float":
         case "java.lang.Long":
         case "java.lang.Short":
         case "java.math.BigDecimal":
            realValue = StringUtils.isBlank(cellValue) ? null : new BigDecimal(cellValue);
            break;
         case "java.lang.Object":
            realValue = cellValue;
            break;
         default:
            break;
      }
      return realValue;
   }

   /**
    * 
    * 根据路径或文件名选择Excel版本
    * 
    * 
    * @param filePathOrName
    * @param in
    * @return
    * @throws IOException
    * @see [类、类#方法、类#成员]
    */
   public static Workbook chooseWorkbook(String filePathOrName, InputStream in) throws IOException {
      Workbook wb = null;
      
      boolean isExcel2003 = ExcelVersionUtil.isExcel2003(filePathOrName);
      
      if (isExcel2003) {
         wb = new HSSFWorkbook(in);
      } else {
         wb = new XSSFWorkbook(in);
      }

      return wb;
   }

   static class ExcelVersionUtil {
      private ExcelVersionUtil() {
      }

      /**
       * 
       * 是否是2003的excel,返回true是2003
       * 
       * 
       * @param filePath
       * @return
       * @see [类、类#方法、类#成员]
       */
      public static boolean isExcel2003(String filePath) {
         return filePath.matches("^.+\\.(?i)(xls)$");

      }

      /**
       * 
       * 是否是2007的excel,返回true是2007
       * 
       * 
       * @param filePath
       * @return
       * @see [类、类#方法、类#成员]
       */
      public static boolean isExcel2007(String filePath) {
         return filePath.matches("^.+\\.(?i)(xlsx)$");

      }

   }

   /**
    * 日期格式化
    * 
    * @author sh-fangz3
    *
    */
   public static class DateUtil {

      public static final String YYYY_MM_DDHHMMSS = "yyyy-MM-dd HH:mm:ss";

      public static final String YYYY_MM_DD = "yyyy-MM-dd";

      public static final String YYYY_MM = "yyyy-MM";

      public static final String YYYY = "yyyy";

      public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

      public static final String YYYYMMDD = "yyyyMMdd";

      public static final String YYYYMM = "yyyyMM";

      public static final String YYYYMMDDHHMMSS_1 = "yyyy/MM/dd HH:mm:ss";

      public static final String YYYY_MM_DD_1 = "yyyy/MM/dd";

      public static final String YYYY_MM_1 = "yyyy/MM";

      /**
       * 
       * 自定义取值,Date类型转为String类型
       * 
       * @param date
       *            日期
       * @param pattern
       *            格式化常量
       * @return
       * @see [类、类#方法、类#成员]
       */
      public static String dateToStr(Date date, String pattern) {
         SimpleDateFormat format = null;

         if (null == date)
            return null;
         format = new SimpleDateFormat(pattern, Locale.getDefault());

         return format.format(date);
      }

      /**
       * 将字符串转换成Date类型的时间
       * <hr>
       * 
       * @param s
       *            日期类型的字符串<br>
       *            datePattern :YYYY_MM_DD<br>
       * @return java.util.Date
       */
      public static Date strToDate(String s, String pattern) {
         if (s == null) {
            return null;
         }
         Date date = null;
         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
         try {
            date = sdf.parse(s);
         } catch (ParseException e) {
            e.printStackTrace();
         }
         return date;
      }
   }
   
   /**
    * 对象与对象之间赋值
    * @param origin
    * @param destination
    */
    public static <T> T mergeObject(T origin, T destination) {
           if (origin == null || destination == null){
               return null;
           }
           try {
              Field[] origins = origin.getClass().getDeclaredFields();
              Field[] destinations = destination.getClass().getDeclaredFields();
              for (int f = 0; f < destinations.length; f++) {
                 origins[f].setAccessible(true);
                 Object value = origins[f].get(origin);
                 boolean fieldHasAnno = destinations[f].isAnnotationPresent(IsNeeded.class);
                 if(fieldHasAnno){
                  destinations[f].setAccessible(true);
                   destinations[f].set(destination, value);
               }
            }
            } catch (IllegalArgumentException e) {
               e.printStackTrace();
            } catch (IllegalAccessException e) {
               e.printStackTrace();
            }
         return destination;
       }
    
    /**
     * 判断导入必填字段
     */
    public static <T> Integer isRequired(T t,int num,String isZhicheng,String devType,String businessType,String isRemind) {
      // 所有成员变量
       Field[] fields = t.getClass().getDeclaredFields();//按照你的成员属性进行排序的
       for (int f = 0; f < fields.length; f++) {
          boolean fieldHasAnno = fields[f].isAnnotationPresent(IsRequired.class);
          if(fieldHasAnno){
             fields[f].setAccessible(true);
             String name = fields[f].getName();
             Object value;
            try {
               value = fields[f].get(t);
               //当是否需要支撑选择否的时候,支撑经理和提醒时间非必填
               if("否".equals(isZhicheng) && name.equals("zcManagers") || "否".equals(isRemind) && name.equals("remindDatel")){
                  IsRequired reuquied = fields[f].getAnnotation(IsRequired.class);
                  if(reuquied.condition()){
                     continue;
                  }
               }
               if(!"2".equals(devType) && name.equals("agentName")){
                  IsRequired formToken = fields[f].getAnnotation(IsRequired.class);
                  if(!formToken.condition()&&StringUtil.isEmpty(value.toString())){
                        continue;
                  }
               }
               if(businessType != null && !"基础产品-固网".equals(businessType) && name.equals("amount")){
                  IsRequired reuquied = fields[f].getAnnotation(IsRequired.class);
                  if(!reuquied.condition()){
                     continue;
                  }
               }
               if(StringUtil.isEmpty(value.toString())){
                  num++;
               }
            } catch (IllegalArgumentException e) {
               e.printStackTrace();
            } catch (IllegalAccessException e) {
               e.printStackTrace();
            }
          }
       }
       
       return num;
    }

}

导出注解工具类,也就是在你要读取的对应实体上加上的注解:

package com.unicom.sh.pom.file;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解用于文件导入工具类
 * @author fz
 * @version 0.1 (2018年12月20日 上午10:52:14)
 * @since 0.1
 * @see
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
public @interface IsNeeded
{
    
    /**
     * 是否需要从解析excel赋值
     * @return
     *         true:需要  false:不需要
     * @see [类、类#方法、类#成员]
     */
    boolean isNeeded() default true;
    
}

然后在实体类中加上注解就ok 

完成 

差点忘了pomxml 配置文件

<!-- poi操作excel -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.8</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.8</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>3.8</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
</dependency>
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
</dependency>

猜你喜欢

转载自blog.csdn.net/qq_39930369/article/details/86568711