重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容主要讲解“如何用注释解决反射不保证字段的顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用注释解决反射不保证字段的顺序”吧!
创新互联主打移动网站、成都网站建设、成都网站设计、网站改版、网络推广、网站维护、主机域名、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
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; } }
到此,相信大家对“如何用注释解决反射不保证字段的顺序”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!