java 导入excel工具类

1.PoiExcelImportUtil类

import com.*.core.annotation.IsNeeded;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.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 java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.Collator;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PoiExcelImportUtil {

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

    /**
     * 导入excel
     * <按顺序放入带有注解的实体成员变量中>
     *
     * @param wb 工作簿
     * @param t 实体
     * @return List<T> 实体列表
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> excelToList(Workbook wb, T t,Boolean isExam)throws Exception{
        List<T> listt = new ArrayList<T>();

        /** 得到第一个sheet */
        Sheet sheet = wb.getSheetAt(0);
        /** 得到Excel的行数 */
        // 总行数
        int totalRows = sheet.getPhysicalNumberOfRows();
        int totalCells = 0;

        /** 得到Excel的列数 */
        if (totalRows >= 1 && sheet.getRow(0) != null){
            // 总列数
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        /** 循环Excel的行 */
        for (int r = 1; r < totalRows; r++){
            Object newInstance = t.getClass().newInstance();
            Row row = sheet.getRow(r);
            if (isExam){
                String judgeType=sheet.getRow(0).getCell(0).toString();
                if(!"题型".equals(judgeType)){
                    break;
                }
            }
            if (row == null){continue;}
            // 成员变量的值
            Object entityMemberValue = "";
            // 所有成员变量
            Field[] fields = t.getClass().getDeclaredFields();
            // 列开始下标
            int startCell = 0;
            int index = 0;
            //存放选项的list
            List<Object> list = new ArrayList<>();
            //上传试题
            if(isExam && totalCells>4){
                for (int f = 0; f <= totalCells; f++){
                    fields[index].setAccessible(true);
                    String fieldName = fields[index].getName();
                    boolean fieldHasAnno = fields[index].isAnnotationPresent(IsNeeded.class);

                    // 有注解
                    if (fieldHasAnno){
                        IsNeeded annotation = fields[index].getAnnotation(IsNeeded.class);
                        boolean isNeeded = annotation.isNeeded();
                        // Excel需要赋值的列
                        if (isNeeded && fieldName.equals("examOption")){
                            Cell cell = row.getCell(startCell);
                            String cellValue = cell==null ? "无" : getCellValue(cell);
                            list.add(replaceBlank(cellValue));
                            Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
                        }else if (isNeeded){
                            Cell cell = row.getCell(startCell);
                            //String cellValue = getCellValue(cell);
                            String cellValue = cell==null ? "无" : getCellValue(cell);
                            entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, cellValue);
                            // 赋值
                            PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
                            index++;
                        }
                        // 列的下标加1
                        startCell++;
                    }else {
                        index++;
                    }
                    if (f == totalCells){
                        PropertyUtils.setProperty(newInstance,fieldName,list);
                    }
                }
            }else {
                //上传成绩
                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, replaceBlank(cellValue));
                            // 赋值
                            PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
                        }
                        // 列的下标加1
                        startCell++;
                    }
                }
            }
            listt.add((T)newInstance);
        }
        return listt;
    }
    //==========================本类私有方法=========================//

    /*
        * 去除数据的空格、回车、换行符、制表符
        */
    public static String replaceBlank(String str) {
        String dest = "";
        if (str!=null) {
            //空格\t、回车\n、换行符\r、制表符\t
            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }


    /**
     * 根据Excel表格中的数据判断类型得到值
     */
    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 {
                        cellValue = String.valueOf(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: // 空值
                    break;
                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    cellValue = "非法字符";
                    break;
                default:
                    cellValue = "未知类型";
                    break;
            }

        }
        return cellValue;
    }

    /**
     * 根据实体成员变量的类型得到成员变量的值
     */
    private static Object getEntityMemberValue(Object realValue, Field[] fields, int f, String cellValue){
        String type = fields[f].getType().getName();
        if (StringUtils.isNotBlank(cellValue) && "mobile".equals(fields[f].getName())){
            DecimalFormat df = new DecimalFormat("#");
            cellValue = df.format(Double.parseDouble(cellValue));
        }
        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 "int":
            case "java.lang.Integer":
                realValue = StringUtils.isBlank(cellValue) ? null : Integer.valueOf(cellValue);
                break;
            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).setScale(1,BigDecimal.ROUND_HALF_UP);
                break;
            default:
                break;
        }
        return realValue;
    }

    /**
     * 根据路径或文件名选择Excel版本
     */
    public static Workbook chooseWorkbook(String filePathOrName, InputStream in)
            throws IOException{
        /** 根据版本选择创建Workbook的方式 */
        Workbook wb = null;
        boolean isExcel2003 = ExcelVersionUtil.isExcel2003(filePathOrName);
        if (isExcel2003){
            wb = new HSSFWorkbook(in);
        }
        else{
            wb = new XSSFWorkbook(in);
        }
        return wb;
    }

    // =================== 版本判断==========================
    private static class ExcelVersionUtil{

        /**
         * 是否是2003的excel,返回true是2003
         */
        private static boolean isExcel2003(String filePath){
            return filePath.matches("^.+\\.(?i)(xls)$");
        }
    }

    public static class DateUtil{
        // 日期格式化常量

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

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

        /**
         * 自定义取值,Date类型转为String类型
         */
        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类型的时间
         */
        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;
        }
    }
}

2.IsNeed.java

package com.*.core.annotation;
import java.lang.annotation.*;

/**
 * 是否需要从解析excel赋值
 * 因为再实体类里面并不是所有的属性都要参与excel的导入,给需要参与导入的属性加上此注解
 *
 */
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
public @interface IsNeeded {

    /**
     * 是否需要从解析excel赋值
     * @return
     * true:需要  false:不需要
     */
    boolean isNeeded() default true;
    String head() default "";
}
3.controller类
T t= new T();
1>.List<T> list= PoiExcelImportUtil.excelToList(wb, courseScore, false);//false表示导入类型
2>.List<T> list= PoiExcelImportUtil.excelToList(wb, T);

4.实体类

@IsNeeded(head = "手机号")
@ApiModelProperty(value = "手机号")
@TableField("phone")
private String phone;

猜你喜欢

转载自blog.csdn.net/lsy_know/article/details/86511860
今日推荐