Procházet zdrojové kódy

feature(1.数据安全级别导入 2.数据分级导入): 1.数据安全级别导入 2.数据分级导入

1.数据安全级别导入 2.数据分级导入
mazq před 4 roky
rodič
revize
35c3dd2cb7

+ 8 - 0
dcuc-app-api/src/main/java/com/dragoninfo/dcuc/app/facade/sub/IDataLevelFacade.java

@@ -1,6 +1,7 @@
 package com.dragoninfo.dcuc.app.facade.sub;
 
 import com.dragoninfo.dcuc.app.sub.dto.DataLevelDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.data.domain.Page;
@@ -53,4 +54,11 @@ public interface IDataLevelFacade {
      */
     @PostMapping("search")
     Page<DataLevelDTO> pageSearch(@RequestBody SearchDTO searchDTO);
+
+    /**
+     * 文件导入
+     * @param fileId 文件id
+     * @return
+     */
+    ResponseStatus impExcel(@RequestParam("fileId") String fileId);
 }

+ 8 - 0
dcuc-app-api/src/main/java/com/dragoninfo/dcuc/app/facade/sub/IDataSecFacade.java

@@ -1,6 +1,7 @@
 package com.dragoninfo.dcuc.app.facade.sub;
 
 import com.dragoninfo.dcuc.app.sub.dto.DataSecDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.data.domain.Page;
@@ -53,4 +54,11 @@ public interface IDataSecFacade {
      */
     @PostMapping("search")
     Page<DataSecDTO> pageSearch(@RequestBody SearchDTO searchDTO);
+
+    /**
+     * 文件导入
+     * @param fileId 文件id
+     * @return
+     */
+    ResponseStatus impExcel(@RequestParam("fileId") String fileId);
 }

+ 38 - 0
dcuc-app-model/src/main/java/com/dragoninfo/dcuc/app/sub/dto/ExcelDataLevel.java

@@ -0,0 +1,38 @@
+package com.dragoninfo.dcuc.app.sub.dto;
+
+import lombok.Data;
+
+/**
+ * excel导入数据分级对象
+ * @author mazq
+ * @date 2021/6/4
+ */
+@Data
+public class ExcelDataLevel {
+
+    /**
+     * 行数
+     */
+    private Integer rowNum;
+
+    /**
+     * 数据分级代码
+     */
+    private String levelCode;
+
+    /**
+     * 数据分级名称
+     */
+    private String levelName;
+
+    /**
+     * 说明
+     */
+    private String remark;
+
+
+
+
+
+
+}

+ 33 - 0
dcuc-app-model/src/main/java/com/dragoninfo/dcuc/app/sub/dto/ExcelDataSec.java

@@ -0,0 +1,33 @@
+package com.dragoninfo.dcuc.app.sub.dto;
+
+import lombok.Data;
+
+/**
+ * excel导入数据安全等级对象
+ * @author mazq
+ * @date 2021/6/4
+ */
+@Data
+public class ExcelDataSec {
+
+    /**
+     * 行数
+     */
+    private Integer rowNum;
+
+    /**
+     * 数据安全等级代码
+     */
+    private String secCode;
+
+    /**
+     * 数据安全等级名称
+     */
+    private String secName;
+
+    /**
+     * 说明
+     */
+    private String remark;
+
+}

+ 6 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/facade/DataLevelFacade.java

@@ -4,6 +4,7 @@ import com.dragoninfo.dcuc.app.facade.sub.IDataLevelFacade;
 import com.dragoninfo.dcuc.app.sub.dto.DataLevelDTO;
 import com.dragoninfo.dcuc.app.sub.entity.DataLevel;
 import com.dragoninfo.dcuc.app.sub.service.IDataLevelService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,5 +54,10 @@ public class DataLevelFacade implements IDataLevelFacade {
         return dataLevelService.pageSearch(searchDTO);
     }
 
+    @Override
+    public ResponseStatus impExcel(String fileId) {
+        return dataLevelService.impExcel(fileId);
+    }
+
 
 }

+ 6 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/facade/DataSecFacade.java

@@ -4,6 +4,7 @@ import com.dragoninfo.dcuc.app.facade.sub.IDataSecFacade;
 import com.dragoninfo.dcuc.app.sub.dto.DataSecDTO;
 import com.dragoninfo.dcuc.app.sub.entity.DataSec;
 import com.dragoninfo.dcuc.app.sub.service.IDataSecService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,5 +55,10 @@ public class DataSecFacade implements IDataSecFacade {
         return dataSecService.pageSearch(searchDTO);
     }
 
+    @Override
+    public ResponseStatus impExcel(String fileId) {
+        return dataSecService.impExcel(fileId);
+    }
+
 
 }

+ 10 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/service/IDataLevelService.java

@@ -3,6 +3,7 @@ package com.dragoninfo.dcuc.app.sub.service;
 import com.dragoninfo.dcuc.app.sub.dto.DataLevelDTO;
 import com.dragoninfo.dcuc.app.sub.entity.DataLevel;
 import com.dragoninfo.dcuc.app.vo.DataLevelVo;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.data.domain.Page;
 
@@ -69,4 +70,13 @@ public interface IDataLevelService {
      * @param list
      */
     void sync(List<DataLevelVo> list);
+
+    /**
+     * 文件导入
+     * @param fileId
+     * @return
+     */
+    ResponseStatus impExcel(String fileId);
+
+    List<DataLevel> getByCodes(List<String> codes);
 }

+ 10 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/service/IDataSecService.java

@@ -3,6 +3,7 @@ package com.dragoninfo.dcuc.app.sub.service;
 import com.dragoninfo.dcuc.app.sub.dto.DataSecDTO;
 import com.dragoninfo.dcuc.app.sub.entity.DataSec;
 import com.dragoninfo.dcuc.app.vo.DataLevelVo;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import org.springframework.data.domain.Page;
 
@@ -69,4 +70,13 @@ public interface IDataSecService {
      * @param list
      */
     void sync(List<DataLevelVo> list);
+
+    /**
+     * 导入数据
+     * @param fileId
+     * @return
+     */
+    ResponseStatus impExcel(String fileId);
+
+    List<DataSec> getByCodes(List<String> codes);
 }

+ 134 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/service/impl/DataLevelServiceImpl.java

@@ -3,20 +3,31 @@ package com.dragoninfo.dcuc.app.sub.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.dragoninfo.dcuc.app.sub.dto.DataLevelDTO;
+import com.dragoninfo.dcuc.app.sub.dto.ExcelDataLevel;
 import com.dragoninfo.dcuc.app.sub.entity.DataLevel;
 import com.dragoninfo.dcuc.app.sub.mapper.DataLevelMapper;
 import com.dragoninfo.dcuc.app.sub.service.IDataLevelService;
+import com.dragoninfo.dcuc.app.util.ImportUtil;
 import com.dragoninfo.dcuc.app.vo.DataLevelVo;
+import com.dragoninfo.dcuc.auth.sub.dto.ExcelImpOrgInfo;
+import com.dragoninfo.dcuc.duceap.facade.IDuceapUploadFacade;
+import com.dragoninfo.dcuc.duceap.upload.dto.DocContentDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
+import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
 import com.dragonsoft.duceap.commons.util.string.StringUtils;
 import com.dragonsoft.duceap.core.search.Searchable;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -30,9 +41,14 @@ import static com.dragoninfo.dcuc.app.enumresources.DataResourceEnum.getByCode;
 @Service
 public class DataLevelServiceImpl implements IDataLevelService {
 
+    private List<String> excelTitle = Arrays.asList("代码","数据分级","说明");
+
     @Autowired
     private DataLevelMapper dataLevelMapper;
 
+    @Autowired
+    private IDuceapUploadFacade uploadFacade;
+
     @Override
     public DataLevel saveOrUpdate(DataLevelDTO dto) {
         String id = dto.getId();
@@ -126,6 +142,124 @@ public class DataLevelServiceImpl implements IDataLevelService {
         });
     }
 
+    @Override
+    public ResponseStatus impExcel(String fileId) {
+        DocContentDTO fileContent = uploadFacade.getFileContent(fileId);
+        InputStream inputStream = fileContent.getInputStream();
+        try {
+            List<ExcelDataLevel> list = loadDataLevelFromExcel(inputStream);
+            verifyImport(list);
+            saveImport(list);
+        } catch (IOException e){
+            return ResponseStatus.fail("文件格式不正确");
+        } catch (NumberFormatException e) {
+            return ResponseStatus.fail(e.getMessage());
+        }
+        return ResponseStatus.success();
+    }
+
+    private void saveImport(List<ExcelDataLevel> list) {
+        Date date = new Date();
+        list.forEach(item->{
+            DataLevel dataLevel = new DataLevel();
+            BeanUtils.copyProperties(item, dataLevel);
+            dataLevel.setDeleted(BooleanEnum.FALSE.value);
+            dataLevel.setCreateTime(date);
+            dataLevelMapper.insert(dataLevel);
+        });
+    }
+
+    private void verifyImport(List<ExcelDataLevel> list) {
+        if(list.size() > 1000) {
+            throw new NumberFormatException("导入条数超过1000条!!!");
+        }
+
+        String codeEmpRows = list.stream().filter(item -> StringUtils.isBlank(item.getLevelCode()))
+                .map(item -> item.getRowNum().toString())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(codeEmpRows)) {
+            throw new NumberFormatException("第【"+ codeEmpRows +"】行【代码】列为空");
+        }
+
+        String nameEmpRows = list.stream().filter(item -> StringUtils.isBlank(item.getLevelName()))
+                .map(item -> item.getRowNum().toString())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(nameEmpRows)) {
+            throw new NumberFormatException("第【"+ nameEmpRows +"】行【数据分级】列为空");
+        }
+
+        String remarkLengthRows = list.stream().filter(item -> {
+            String remark = item.getRemark();
+            return StringUtils.isNotBlank(remark) && remark.length() > 500;
+        }).map(item -> item.getRowNum().toString()).collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(remarkLengthRows)) {
+            throw new NumberFormatException("第【"+ remarkLengthRows +"】行【说明】列超过500个字符!!!");
+        }
+        //校验导入的数据中是否存在重复
+        Map<String, List<ExcelDataLevel>> map = list.stream()
+                .collect(Collectors.groupingBy(ExcelDataLevel::getLevelCode));
+        String dupCodes = map.values().stream()
+                .filter(item -> item.size() >= 2)
+                .map(item -> item.get(0).getLevelCode())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(dupCodes)) {
+            throw new NumberFormatException("导入的数据中存在重复代码:【"+ dupCodes +"】");
+        }
+
+        //校验编码是否存在
+        List<String> codes = list.stream().map(ExcelDataLevel::getLevelCode).distinct().collect(Collectors.toList());
+        List<DataLevel> existList = getByCodes(codes);
+        if (CollectionUtils.isNotEmpty(existList)) {
+            String existCodes = existList.stream().map(DataLevel::getLevelCode).collect(Collectors.joining(","));
+            throw new NumberFormatException("【"+ existCodes +"】代码已被使用");
+        }
+    }
+
+    @Override
+    public List<DataLevel> getByCodes(List<String> codes) {
+        LambdaQueryWrapper<DataLevel> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select().in(DataLevel::getLevelCode, codes);
+        return dataLevelMapper.selectList(queryWrapper);
+    }
+
+    private List<ExcelDataLevel> loadDataLevelFromExcel(InputStream inputStream) throws IOException {
+        List<ExcelDataLevel> list = new ArrayList<>();
+        Workbook wb0 = new HSSFWorkbook(inputStream);
+        //获取Excel文档中的第一个表单
+        Sheet sht0 = wb0.getSheetAt(0);
+        for (Row r : sht0) {
+            if (r.getRowNum() == 0) {
+                ImportUtil.checkTitle(r, excelTitle);
+            }else {
+                if(ImportUtil.checkIsEmpty(r, 2)) {
+                    continue;
+                }
+                ExcelDataLevel dataLevel = getDataLevelFromRow(r);
+                list.add(dataLevel);
+            }
+        }
+        return list;
+    }
+
+    private ExcelDataLevel getDataLevelFromRow(Row r) {
+        ExcelDataLevel dataLevel = new ExcelDataLevel();
+        dataLevel.setRowNum(r.getRowNum());
+        Cell cell;
+        //码值
+        cell = r.getCell(0);
+        String code = ImportUtil.getCellStringValue(cell);
+        dataLevel.setLevelCode(code);
+        //数据分级
+        cell = r.getCell(1);
+        String name = ImportUtil.getCellStringValue(cell);
+        dataLevel.setLevelName(name);
+        //说明
+        cell = r.getCell(2);
+        String remark = ImportUtil.getCellStringValue(cell);
+        dataLevel.setRemark(remark);
+        return dataLevel;
+    }
+
     private void saveByCode(DataLevel dataLevel) {
         DataLevel exist = this.getByCode(dataLevel.getLevelCode());
         if(null == exist) {

+ 133 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/service/impl/DataSecServiceImpl.java

@@ -3,20 +3,35 @@ package com.dragoninfo.dcuc.app.sub.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.dragoninfo.dcuc.app.sub.dto.DataSecDTO;
+import com.dragoninfo.dcuc.app.sub.dto.ExcelDataLevel;
+import com.dragoninfo.dcuc.app.sub.dto.ExcelDataSec;
+import com.dragoninfo.dcuc.app.sub.entity.DataLevel;
 import com.dragoninfo.dcuc.app.sub.entity.DataSec;
 import com.dragoninfo.dcuc.app.sub.mapper.DataSecMapper;
 import com.dragoninfo.dcuc.app.sub.service.IDataSecService;
+import com.dragoninfo.dcuc.app.util.ImportUtil;
 import com.dragoninfo.dcuc.app.vo.DataLevelVo;
+import com.dragoninfo.dcuc.duceap.facade.IDuceapUploadFacade;
+import com.dragoninfo.dcuc.duceap.upload.dto.DocContentDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
+import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
 import com.dragonsoft.duceap.commons.util.string.StringUtils;
 import com.dragonsoft.duceap.core.search.Searchable;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -28,9 +43,15 @@ import java.util.stream.Collectors;
 @Service
 public class DataSecServiceImpl implements IDataSecService {
 
+    private List<String> excelTitle = Arrays.asList("代码","数据安全级别","说明");
+
     @Autowired
     private DataSecMapper dataSecMapper;
 
+    @Autowired
+    private IDuceapUploadFacade uploadFacade;
+
+
     @Override
     public DataSec saveOrUpdate(DataSecDTO dto) {
         String id = dto.getId();
@@ -126,6 +147,118 @@ public class DataSecServiceImpl implements IDataSecService {
         });
     }
 
+    @Override
+    public ResponseStatus impExcel(String fileId) {
+        DocContentDTO fileContent = uploadFacade.getFileContent(fileId);
+        InputStream inputStream = fileContent.getInputStream();
+        try {
+            List<ExcelDataSec> list = loadDataSecFromExcel(inputStream);
+            verifyImport(list);
+            saveImport(list);
+        } catch (IOException e){
+            return ResponseStatus.fail("文件格式不正确");
+        } catch (NumberFormatException e) {
+            return ResponseStatus.fail(e.getMessage());
+        }
+        return ResponseStatus.success();
+    }
+
+    private void saveImport(List<ExcelDataSec> list) {
+
+    }
+
+    private void verifyImport(List<ExcelDataSec> list) {
+        if(list.size() > 1000) {
+            throw new NumberFormatException("导入条数超过1000条!!!");
+        }
+
+        String codeEmpRows = list.stream().filter(item -> StringUtils.isBlank(item.getSecCode()))
+                .map(item -> item.getRowNum().toString())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(codeEmpRows)) {
+            throw new NumberFormatException("第【"+ codeEmpRows +"】行【代码】列为空");
+        }
+
+        String nameEmpRows = list.stream().filter(item -> StringUtils.isBlank(item.getSecName()))
+                .map(item -> item.getRowNum().toString())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(nameEmpRows)) {
+            throw new NumberFormatException("第【"+ nameEmpRows +"】行【数据安全级别】列为空");
+        }
+
+        String remarkLengthRows = list.stream().filter(item -> {
+            String remark = item.getRemark();
+            return StringUtils.isNotBlank(remark) && remark.length() > 500;
+        }).map(item -> item.getRowNum().toString()).collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(remarkLengthRows)) {
+            throw new NumberFormatException("第【"+ remarkLengthRows +"】行【说明】列超过500个字符!!!");
+        }
+        //校验导入的数据中是否存在重复
+        Map<String, List<ExcelDataSec>> map = list.stream()
+                .collect(Collectors.groupingBy(ExcelDataSec::getSecCode));
+        String dupCodes = map.values().stream()
+                .filter(item -> item.size() >= 2)
+                .map(item -> item.get(0).getSecCode())
+                .collect(Collectors.joining(","));
+        if(StringUtils.isNotBlank(dupCodes)) {
+            throw new NumberFormatException("导入的数据中存在重复代码:【"+ dupCodes +"】");
+        }
+
+        //校验编码是否存在
+        List<String> codes = list.stream().map(ExcelDataSec::getSecCode).distinct().collect(Collectors.toList());
+        List<DataSec> existList = getByCodes(codes);
+        if (CollectionUtils.isNotEmpty(existList)) {
+            String existCodes = existList.stream().map(DataSec::getSecCode).collect(Collectors.joining(","));
+            throw new NumberFormatException("【"+ existCodes +"】代码已被使用");
+        }
+    }
+
+    @Override
+    public List<DataSec> getByCodes(List<String> codes) {
+        LambdaQueryWrapper<DataSec> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select().in(DataSec::getSecCode, codes);
+        return dataSecMapper.selectList(queryWrapper);
+    }
+
+    private List<ExcelDataSec> loadDataSecFromExcel(InputStream inputStream) throws IOException {
+        List<ExcelDataSec> list = new ArrayList<>();
+        Workbook wb0 = new HSSFWorkbook(inputStream);
+        //获取Excel文档中的第一个表单
+        Sheet sht0 = wb0.getSheetAt(0);
+        for (Row r : sht0) {
+            if (r.getRowNum() == 0) {
+                ImportUtil.checkTitle(r, excelTitle);
+            }else {
+                if(ImportUtil.checkIsEmpty(r, 2)) {
+                    continue;
+                }
+                ExcelDataSec dataSec = getDataSecFromRow(r);
+                list.add(dataSec);
+            }
+        }
+        return list;
+    }
+
+    private ExcelDataSec getDataSecFromRow(Row r) {
+        ExcelDataSec dataSec = new ExcelDataSec();
+        dataSec.setRowNum(r.getRowNum());
+        Cell cell;
+        //码值
+        cell = r.getCell(0);
+        String code = ImportUtil.getCellStringValue(cell);
+        dataSec.setSecCode(code);
+        //数据安全级别
+        cell = r.getCell(1);
+        String name = ImportUtil.getCellStringValue(cell);
+        dataSec.setSecName(name);
+        //说明
+        cell = r.getCell(2);
+        String remark = ImportUtil.getCellStringValue(cell);
+        dataSec.setRemark(remark);
+        return dataSec;
+    }
+
+
     private void saveByCode(DataSec dataSec) {
         DataSec exist = this.getByCode(dataSec.getSecCode());
         if(null == exist) {

+ 1 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/sub/service/impl/FieldClaServiceImpl.java

@@ -52,6 +52,7 @@ public class FieldClaServiceImpl implements IFieldClaService {
             FieldClaDTO fieldClaDTO = new FieldClaDTO(dto.getSecCode(),dto.getSecName(),
                     FieldClaTypeEnum.SEC.getLevel(), FieldClaTypeEnum.SEC.getCode());
             fieldClaDTO.setFirId(firId);
+            fieldClaDTO.setRemark(dto.getRemark());
             save(fieldClaDTO);
         }
         return true;

+ 49 - 0
dcuc-app-service/src/main/java/com/dragoninfo/dcuc/app/util/ImportUtil.java

@@ -0,0 +1,49 @@
+package com.dragoninfo.dcuc.app.util;
+
+import com.dragonsoft.duceap.commons.util.string.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Row;
+
+import java.util.List;
+
+/**
+ * @author mazq
+ * @date 2021/6/4
+ */
+public class ImportUtil {
+
+    public static boolean checkIsEmpty(Row r, int columnNum) {
+        for (int i = 0; i < columnNum; i++) {
+            Cell cell = r.getCell(i);
+            if(cell != null) {
+                cell.setCellType(CellType.STRING);
+                String value = cell.getStringCellValue();
+                if(StringUtils.isNotBlank(value)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public static void checkTitle(Row r, List<String> excelTitle) {
+        for (int i = 0; i < excelTitle.size(); i++) {
+            String title = excelTitle.get(i);
+            String value = r.getCell(i).getStringCellValue();
+            if(StringUtils.isEmpty(value) || !title.equals(value)) {
+                throw new NumberFormatException("缺少【"+ title +"】列!");
+            }
+        }
+    }
+
+    public static String getCellStringValue(Cell cell) {
+        if(null != cell) {
+            cell.setCellType(CellType.STRING);
+            String value = cell.getStringCellValue();
+            return value;
+        }
+        return null;
+    }
+
+}