如何用注释解决反射不保证字段的顺序
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容主要讲解"如何用注释解决反射不保证字段的顺序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何用注释解决反射不保证字段的顺序"吧!Talk is
千家信息网最后更新 2025年11月08日如何用注释解决反射不保证字段的顺序
本篇内容主要讲解"如何用注释解决反射不保证字段的顺序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何用注释解决反射不保证字段的顺序"吧!
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; }} 到此,相信大家对"如何用注释解决反射不保证字段的顺序"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
字段
反射
顺序
注释
保证
内容
单元
对象
文件
方法
类型
学习
工作
起始
实用
更深
一致
一行
人员
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
苏康码是哪个软件开发公司
怎么创造服务器在我的世界
道哥评价网络安全
日照工业学校计算机网络技术
千牛的手机数据库文件
数据库与计算机专业哪个好
维盟网络技术
国家政策对软件开发的风险
网络安全威胁应该怎么防护
松江区管理软件开发成本价
数据库多少个g
武汉枫欧网络技术开发公司
查询数据库耗时
利用网络技术
immusort数据库
软件开发价格依据
银行软件开发预算
华为数据库分表
网络安全与我 作文800字
郴州优达网络技术有限公司
东莞谷子网络技术公司
网络技术方面的app
贾轶军 网络安全技术及应用
如何在网络安全防护
微软软件开发集团公司
查邮件服务器
网络安全明星推荐词
西安好的软件开发公司
温州索易软件开发有限公司
网络安全与我 作文800字