|
|
@@ -0,0 +1,154 @@
|
|
|
+package org.springblade.client.school.util;
|
|
|
+
|
|
|
+import com.alibaba.excel.annotation.ExcelProperty;
|
|
|
+import com.alibaba.nacos.api.utils.StringUtils;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.BufferedInputStream;
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author: xxx
|
|
|
+ * @createTime: 2021/12/07 17:07
|
|
|
+ * @company: https://www.xxx.cn
|
|
|
+ * @description:
|
|
|
+ */
|
|
|
+public class ExcelCheck {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检验导入Excel的格式
|
|
|
+ * @param excel
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public static String checkExcelPattern(MultipartFile excel,Object object) throws Exception {
|
|
|
+ if(excel == null || excel.isEmpty()){
|
|
|
+ throw new Exception("导入文件不能为空!");
|
|
|
+ }
|
|
|
+ //用于拼接校验结果
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+ //大小校验
|
|
|
+ /*if((excel.getSize()/1048576)>2){
|
|
|
+ builder.append("上传文件仅支持2M以内的Excel文件;");
|
|
|
+ }*/
|
|
|
+ //校验文件格式,必须为excel文件
|
|
|
+ String fileName = excel.getOriginalFilename();
|
|
|
+ String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
|
|
|
+ if (!"xlsx".equals(suffix)) {
|
|
|
+ builder.append("导入文件只支持xlsx类型后缀;");
|
|
|
+ }
|
|
|
+ //校验文件表头
|
|
|
+ BufferedInputStream fin = new BufferedInputStream(excel.getInputStream());
|
|
|
+ Workbook wb = null;
|
|
|
+ try{
|
|
|
+ wb = WorkbookFactory.create(fin);;
|
|
|
+ }catch(Exception e){
|
|
|
+ wb = WorkbookFactory.create(fin);;
|
|
|
+ }
|
|
|
+ //XSSFWorkbook wb = new XSSFWorkbook(fin);导致出现异常
|
|
|
+ //columnName = {"姓名", "性别", "年级", "班级","身份证号","学籍号","学工号","性格","家庭情况","操行等等","特长","标签"};
|
|
|
+ //获取注解当中的值
|
|
|
+ Map<String, List<String>> annotationValue = getAnnotationValue(object);
|
|
|
+ List<String> annotationName = annotationValue.get("annotationName");
|
|
|
+ //获取到的实体注解名称顺序要与excel表头顺序保持一样
|
|
|
+ String[] columnName = annotationName.toArray(new String[]{});
|
|
|
+ Sheet sheet = wb.getSheetAt(0);
|
|
|
+ Row row = sheet.getRow(0);
|
|
|
+ if (row != null && row.getLastCellNum() >= columnName.length) {
|
|
|
+ int lastCellNum = row.getLastCellNum();
|
|
|
+ for (int idx = 0; idx < lastCellNum; idx++) {
|
|
|
+ String value = getCellValue(row.getCell(idx)).trim();
|
|
|
+ if (idx < columnName.length) {
|
|
|
+ if (StringUtils.isBlank(value) || !columnName[idx].equals(value)) {
|
|
|
+ builder.append("第" + (idx + 1) + "列表头应为" + columnName[idx]+"!");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (idx == columnName.length) {
|
|
|
+ builder.append("导入文件只应该有:"+ columnName.length+"!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ builder.append("上传文件首行不能为空,且应与模板文件表头保持一致;");
|
|
|
+ }
|
|
|
+ if(builder.length()>0){
|
|
|
+ builder.append("请下载模板按照模板表头顺序进行上传!");
|
|
|
+ //builder.setCharAt(builder.length()-1, '!');
|
|
|
+ }
|
|
|
+ return builder.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取cell值
|
|
|
+ *
|
|
|
+ * @param cell
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String getCellValue(Cell cell) {
|
|
|
+ String cellValue = "";
|
|
|
+ // 以下是判断数据的类型
|
|
|
+ switch (cell.getCellType()) {
|
|
|
+ case Cell.CELL_TYPE_NUMERIC: // 数字
|
|
|
+ if (DateUtil.isCellDateFormatted(cell)) {
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ cellValue = sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();
|
|
|
+ } else {
|
|
|
+ DataFormatter dataFormatter = new DataFormatter();
|
|
|
+ cellValue = dataFormatter.formatCellValue(cell);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case Cell.CELL_TYPE_STRING: // 字符串
|
|
|
+ cellValue = cell.getStringCellValue();
|
|
|
+ break;
|
|
|
+ case Cell.CELL_TYPE_BOOLEAN: // Boolean
|
|
|
+ cellValue = cell.getBooleanCellValue() + "";
|
|
|
+ break;
|
|
|
+ case Cell.CELL_TYPE_FORMULA: // 公式
|
|
|
+ cellValue = cell.getCellFormula() + "";
|
|
|
+ break;
|
|
|
+ case Cell.CELL_TYPE_BLANK: // 空值
|
|
|
+ cellValue = "";
|
|
|
+ break;
|
|
|
+ case Cell.CELL_TYPE_ERROR: // 故障
|
|
|
+ cellValue = "非法字符";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cellValue = "未知类型";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return cellValue;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 获取该注解对象的属性值(字段名称和注解的value值)
|
|
|
+ * @param object
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map<String,List<String>> getAnnotationValue(Object object) {
|
|
|
+ Map<String,List<String>>map=new HashMap<>();
|
|
|
+ List<String> fieldList=new ArrayList<>();
|
|
|
+ List<String> annotationList=new ArrayList<>();
|
|
|
+ //StudentVO studentVO = new StudentVO();
|
|
|
+ Field[] fields = object.getClass().getDeclaredFields();
|
|
|
+ for(int i = 0 ; i < fields.length ; i++) {
|
|
|
+ //设置是否允许访问,不是修改原来的访问权限修饰词。
|
|
|
+ fields[i].setAccessible(true);
|
|
|
+ ExcelProperty annotation = fields[i].getAnnotation(ExcelProperty.class);
|
|
|
+ String[] value = annotation.value();
|
|
|
+ for (String s : value) {
|
|
|
+ annotationList.add(s);
|
|
|
+ }
|
|
|
+ fieldList.add(fields[i].getName());
|
|
|
+ }
|
|
|
+ map.put("fieldName",fieldList);
|
|
|
+ map.put("annotationName",annotationList);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|