千家信息网

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

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,本篇内容主要讲解"如何用注释解决反射不保证字段的顺序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何用注释解决反射不保证字段的顺序"吧!Talk is
千家信息网最后更新 2025年01月17日如何用注释解决反射不保证字段的顺序

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

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      * @return     * @throws Exception     */    public  List getListFromFile(MultipartFile file, Class clazz) throws Exception {        //最终返回数据        List resultList = new ArrayList();        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      * @throws InvocationTargetException     * @throws IllegalAccessException     * @throws NoSuchMethodException     */    public  void exportFile(List list, Class clazz) throws Exception {        //1.创建一个工作簿        HSSFWorkbook workbook = new HSSFWorkbook();        //2.创建一个工作表sheet        HSSFSheet sheet = workbook.createSheet("test");        //List 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;    }}

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

0