温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用注释解决反射不保证字段的顺序

发布时间:2021-10-14 10:43:04 来源:亿速云 阅读:107 作者:iii 栏目:编程语言

本篇内容主要讲解“如何用注释解决反射不保证字段的顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用注释解决反射不保证字段的顺序”吧!

Talk is cheap, show me the code.直接上码!

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyColumn {

    int columnIndex() default 0;

}
public class PoiUtil {

    /**
     * 获取文件内容列表
     *
     * @param file
     * @param clazz
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> List<T> getListFromFile(MultipartFile file, Class<T> clazz) throws Exception {
        //最终返回数据
        List<T> resultList = new ArrayList<T>();

        InputStream is = file.getInputStream();
        //使用工厂方法创建.
        Workbook wb = WorkbookFactory.create(is);
        Sheet sheet = wb.getSheetAt(0);

        int totalRowNum = sheet.getLastRowNum();
        //获得总列数
        int cellLength = sheet.getRow(0).getPhysicalNumberOfCells();
        //获取反射类的所有字段
        Field[] fields = clazz.getDeclaredFields();
        //创建一个字段数组,用于和excel行顺序一致.
        Field[] newFields = new Field[cellLength];
        for (int i = 0; i < cellLength; i++) {
            for (Field field : fields) {
                Annotation[] annotationArr = field.getDeclaredAnnotations();
                for (Annotation annotation : annotationArr) {
                    if (annotation instanceof MyColumn) {
                        if (i == ((MyColumn) annotation).columnIndex()) {
                            newFields[i] = field;
                        }
                    }
                }
            }
        }

        //从第x行开始获取
        for (int x = 1; x <= totalRowNum; x++) {
            T object = clazz.newInstance();
            //获得第i行对象
            Row row = sheet.getRow(x);
            //如果一行里的所有单元格都为空则不放进list里面
            int rowNum = 0;
            for (int y = 0; y < cellLength; y++) {
                if (!(row == null)) {
                    Cell cell = row.getCell(y);
                    if (cell == null) {
                        rowNum++;
                    } else {
                        Field field = newFields[y];
                        String value = getCellVal(cell);
                        if (value != null && !value.equals("")) {
                            //给字段设置值.
                            setValue(field, value, object);
                        }
                    }
                }
            }
            if (rowNum != cellLength && row != null) {
                resultList.add(object);
            }
        }

        return resultList;
    }


    /**
     * 导出文件
     *
     * @param list
     * @param clazz
     * @param <T>
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws NoSuchMethodException
     */
    public <T> void exportFile(List<T> list, Class clazz) throws Exception {
        //1.创建一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2.创建一个工作表sheet
        HSSFSheet sheet = workbook.createSheet("test");
        //List<User> userList = userService.selectAll();
        //构造参数依次表示起始行,截至行,起始列, 截至列
        CellRangeAddress region = new CellRangeAddress(0, 0, 0, 3);
        sheet.addMergedRegion(region);

        HSSFCellStyle style = workbook.createCellStyle();
        //水平居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        HSSFRow row1 = sheet.createRow(0);
        HSSFCell cell = row1.createCell(0);
        //设置值,这里合并单元格后相当于标题
        cell.setCellValue("人员信息表");
        //将样式添加生效
        cell.setCellStyle(style);

        // 获取反射类的所有字段
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < list.size(); i++) {
            //行
            HSSFRow row = sheet.createRow(i + 1);
            //对列赋值
            int colIndex2 = 0;
            for (Field field : fields) {
                String fieldName = field.getName();
                Annotation[] annotationArr = field.getDeclaredAnnotations();
                for (Annotation annotation : annotationArr) {
                    if (annotation instanceof MyColumn) {
                        if (((MyColumn) annotation).columnIndex() == colIndex2) {
                            String value = clazz.getMethod("get" + getFirstCapitalStr(fieldName)).invoke(list.get(i)).toString();
                            row.createCell(0).setCellValue(value);
                        }
                        colIndex2++;
                    }
                }
            }
        }
    }

    /**
     * 判断字符串首字母是否为大写,如果不是转化为大写
     *
     * @param str
     * @return
     */
    public static String getFirstCapitalStr(String str) {
        if (str.charAt(0) >= 'A' && str.charAt(0) <= 'Z') {
            return str;
        }
        char[] ch = str.toCharArray();
        ch[0] -= 32;
        return String.valueOf(ch);
    }

    /**
     * 给字段赋值,判断值的类型,然后转化成实体需要的类型值.
     *
     * @param field  字段
     * @param value  值
     * @param object 对象
     */
    private static void setValue(Field field, String value, Object object) {
        try {
            field.setAccessible(true);
            DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            if (field.getGenericType().toString().contains("Integer")) {
                field.set(object, Integer.valueOf(value));
            } else if (field.getGenericType().toString().contains("String")) {
                field.set(object, value);
            } else if (field.getGenericType().toString().contains("Date")) {
                field.set(object, fmt.parse(value));
            }
            field.setAccessible(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取单元格中的值
     *
     * @param cell
     * @return String
     */

    private static String getCellVal(Cell cell) {
        // DecimalFormat df = new DecimalFormat("0.0000");
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String val = "";

        switch (cell.getCellTypeEnum()) {
            case STRING:
                val = cell.getRichStringCellValue().getString();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    //日期型
                    val = fmt.format(cell.getDateCellValue());
                } else {
                    // 数字格式 todo
                    val = String.valueOf(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                val = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA:
                val = cell.getCellFormula();
                break;
            case BLANK:
                break;
            default:
                val = "";
        }

        return val;
    }


}

到此,相信大家对“如何用注释解决反射不保证字段的顺序”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI