如何用注释解决反射不保证字段的顺序
发表于: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; }}
到此,相信大家对"如何用注释解决反射不保证字段的顺序"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
字段
反射
顺序
注释
保证
内容
单元
对象
文件
方法
类型
学习
工作
起始
实用
更深
一致
一行
人员
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
双路cpu服务器玩大型游戏
sol2012数据库是什么
租服务器吗
数字人民币需要网络安全吗
公安系统数据库出现记载差错
山西网络服务器机箱是什么
市政给排水材料设备数据库的意义
河北人社显示内部服务器异常
山西ios软件开发优选企业
网络安全上市
益阳市电信宽带dns服务器
网络技术专员面试自我分析
二手服务器转让
服务器分区如何设置
象山ios软件开发
数据库怎样存储百分比
网络安全自查表表格
cio协会网络安全研讨
思科网络技术学院苏州
上海隆得意互联网科技有限公司
时间服务器同步出错
网络技术与应用心得与体会
MySQL数据库技术课后题
防电诈网络安全教育主题班会
c语言CAI软件开发程序
怎么查看淘宝活动的数据库
移动终端软件开发难吗
网络安全法 停机整顿
apache服务器安全狗
麻将软件开发河北约牌吧