本篇内容主要讲解“如何用注释解决反射不保证字段的顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用注释解决反射不保证字段的顺序”吧!
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;
}
}
到此,相信大家对“如何用注释解决反射不保证字段的顺序”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/moyesen/blog/5017045