2020-12-23

//批量添加
@ApiOperation("员工导入Excel")
@PostMapping("/excelImport")
public R addQuestions(@RequestParam("file") MultipartFile file,String subInstId) throws IOException {
    ResultExcel resultExcel = new ResultExcel(0);
    try {
        // 获取所有的内容
        Map<String, Map<Integer, Map<Integer, String>>> sheets = UploadUtil.readExcelToMap(file);
        Set<String> keys = sheets.keySet();
        List<String> steetsNames = new ArrayList<>();
        // 获取所有的key ==页名称
        for (String steetsName : keys) {
            steetsNames.add(steetsName);
        }
        ArrayList<ArrayList<String>> outErrorData = new ArrayList<ArrayList<String>>();
        // 遍历所有的列
        ManInstEntity entity = manInstService.queryInstEntityByInstId(subInstId);
        for (int i = 0; i < sheets.size(); i++) {
            // 根据页名称获取页
            Map<Integer, Map<Integer, String>> rows = sheets.get(steetsNames.get(i));
            if (rows.size() > 0) {
                // 根据所有的行 遍历
                for (int j = 1; j < rows.size(); j++) {
                    // 遍历当前行的所有列
                    Map<Integer, String> columns = rows.get(j);
                    String jobNum = columns.get(0);
                    String mobile = columns.get(1);
                    String empName = columns.get(2);
                    String nickName = columns.get(3);
                    String sex = columns.get(4);
                    String position = columns.get(5);
                    String faceGroup = columns.get(6);
                    String facePic = columns.get(7);
                    ManEmployeeEntity employeeEntity = new ManEmployeeEntity();
                    employeeEntity.setFacePic(StringUtils.isEmpty(facePic) ? null : facePic);
                    employeeEntity.setNickName(nickName);
                    employeeEntity.setEmpName(empName);
                    employeeEntity.setMobile(mobile);
                    employeeEntity.setSex(sex);
                    employeeEntity.setPosition(position);
                    employeeEntity.setJobNumber(jobNum);
                    employeeEntity.setSubInstId(subInstId);
                    employeeEntity.setAddress(entity == null ? "" : entity.getAddress());
                    //获取线路linds
                    if(StringUtils.isNotEmpty(faceGroup)){
                        List<String> list = Arrays.asList(faceGroup.split(","));
                        List<String> linds = manLineDataService.queryDataEntitiesByLineName(list,subInstId);
                        if(CollectionUtils.isNotEmpty(linds)){
                            LineAndEmployeeForm employeeForm = new LineAndEmployeeForm();
                            employeeForm.setLineIds(linds);
                            employeeForm.setType(0);
                            employeeEntity.setEmpLines(employeeForm);
                        }
                    }
                    String errorMessage = manEmployeeService.getErrorMessage(employeeEntity);
                    ArrayList<String> outData = new ArrayList<>();
                    boolean isError = false;
                    if (StringUtils.isNotEmpty(errorMessage)) {
                        isError = true;
                    } else {
                        try {
                            manEmployeeService.saveOrUpdateEntity(employeeEntity);
                        } catch (Exception e) {
                            isError = true;
                            errorMessage += e.getMessage();
                        }
                    }
                    if (isError) {
                        outData.add(employeeEntity.getJobNumber());
                        outData.add(employeeEntity.getMobile());
                        outData.add(employeeEntity.getEmpName());
                        outData.add(employeeEntity.getNickName());
                        outData.add("0".equals(employeeEntity.getSex()) ? "男" : "女");
                        outData.add(employeeEntity.getPosition());
                        outData.add(employeeEntity.getPhoto());
                        outData.add(employeeEntity.getFacePic());
                        outData.add(errorMessage);
                        outErrorData.add(outData);
                        continue;
                    }
                }
            }
        }
        if (outErrorData != null && outErrorData.size() > 0) {
            ArrayList<String> excelTitleName = new ArrayList<String>();
            excelTitleName.add("工号");
            excelTitleName.add("手机号");
            excelTitleName.add("姓名");
            excelTitleName.add("昵称");
            excelTitleName.add("性别");
            excelTitleName.add("职位");
            excelTitleName.add("权限组");
            excelTitleName.add("人脸图片");
            excelTitleName.add("错误");
            // 写入临时文件
            ExcelOutPut errorOutPut = new ExcelOutPut(excelTitleName, outErrorData);
            String createExcelTempPath = manEmployeeService.getCreateExcelTempPath(errorOutPut);
            resultExcel.setDetail(createExcelTempPath);
            resultExcel.setCode(100);
            resultExcel.setMessage("新增失败");
        }
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println(e.getMessage());
        //return setResultError("表格出现未知错误!错误码:20");
    }
    if (resultExcel.getCode().intValue() == 0) {
        return R.ok().put("resultExcel", resultExcel);
    } else {
        log.info(JSON.toJSONString(resultExcel));
        return R.error().put("resultExcel", resultExcel);
    }
}
 

//创建临时文件,记录错误信息

@Override
public String getCreateExcelTempPath(ExcelOutPut excelOutPut) {
   XSSFWorkbook wb = null;
   String filePath = "";
   try {
      ArrayList<String> titleList = excelOutPut.getTitleList();
      ArrayList<ArrayList<String>> dataList = excelOutPut.getDataList();
      wb = new XSSFWorkbook();
      XSSFSheet sheet = wb.createSheet();
      XSSFRow row = sheet.createRow((short) 0);
      for (int i = 0; i < titleList.size(); i++) {
         row.createCell(i).setCellValue(titleList.get(i));
      }

      for (int i = 0; i < dataList.size(); i++) {
         row = sheet.createRow((short) i + 1);
         for (int j = 0; j < dataList.get(i).size(); j++) {
            row.createCell(j).setCellValue(dataList.get(i).get(j));
         }
      }

      for (int columnNum = 0; columnNum < dataList.get(0).size(); columnNum++) {
         int columnWidth = sheet.getColumnWidth(columnNum) / 256;
         for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
            XSSFRow currentRow;
            if (sheet.getRow(rowNum) == null) {
               currentRow = sheet.createRow(rowNum);
            } else {
               currentRow = sheet.getRow(rowNum);
            }

            if (currentRow.getCell(columnNum) != null) {
               XSSFCell currentCell = currentRow.getCell(columnNum);
               int length = currentCell.toString().getBytes().length;
               if (columnWidth < length) {
                  columnWidth = length;
               }
            }
         }
         sheet.setColumnWidth(columnNum, columnWidth * 256 + 256 * 1);
      }
      Date currentTime = new Date();
      SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
      String fileName = formatter.format(currentTime);
      String filedisplay = fileName + ".xlsx";
      filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
      String suffix = filedisplay.substring(filedisplay.lastIndexOf("."));
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      wb.write(byteArrayOutputStream);// 写入磁盘
      byte[] bytes = byteArrayOutputStream.toByteArray();
      ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
      filePath = OSSFactory.build().uploadSuffix(byteArrayInputStream, suffix, true);
      int indexOf = filePath.indexOf("#");
      if (indexOf > -1) {
         filePath = filePath.substring(0, indexOf);
      }
   } catch (Exception e) {
      e.printStackTrace();
      filePath = "";
   } finally {
      try {
         wb.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   return filePath;
}
package com.oftoo.common.entity;

import com.oftoo.modules.oss.cloud.OSSFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class UploadUtil {
    //读取上传的文件
    public static Map<String, Map<Integer, Map<Integer, String>>> readExcelToMap(MultipartFile file) throws IOException {

        Workbook wb = null;
        Sheet sheet = null;
        Row row = null;
        // 声明所有页的集合
        Map<String, Map<Integer, Map<Integer, String>>> mapSheet = new LinkedHashMap<>();
        wb = readExcel(file);
        if (wb != null) {
            // 获取总页数
            int pageSize = wb.getNumberOfSheets();
            for (int i = 0; i < pageSize; i++) {

                // 声明当前页的行和列
                Map<Integer, Map<Integer, String>> map = new HashMap<>();
                // 获取当前页
                sheet = wb.getSheetAt(i);
                //声明当前页图片的集合
                Map<String, PictureData> pMap = null;
                //获取图片
                if(file.getOriginalFilename().endsWith(".xls")){
                    pMap = getPictures1((HSSFSheet) sheet);
                }else{
                    pMap = getPictures2((XSSFSheet) sheet);
                }
                String sheetName = sheet.getSheetName();

                // System.out.println("获取当前页的最大行数");
                int rowSize = sheet.getPhysicalNumberOfRows();

//          System.out.println("总行数:"+rowSize);
                // System.out.println("遍历所有行");
                for (int j = 0; j < rowSize; j++) {
                    // System.out.println("获取第"+j+"行");
                    row = sheet.getRow(j);
                    // System.out.println("获取当前页的最大列数");
                    int columnSize = row.getPhysicalNumberOfCells();
                    // 声明当前列
                    Map<Integer, String> columnMap = new HashMap<>();
//             System.out.println("列大小:"+columnSize);
                    for (int j2 = 0; j2 < columnSize; j2++) {
                        // System.out.println("获取第"+j2+"列的内容");
                        String value = (String)getCellFormatValue(row.getCell(j2));
                        // 添加当前列的内容 j2代表第几列 value是内容
                        columnMap.put(j2, value);

                    }
                    // 添加当前行的内容 j代表第几行 value是列的内容 意思是第几行第几列的内容
                    map.put(j, columnMap);
                }
                //解析图片并上传到服务器 并设置该字段的值为字符串类型添加到map中 进行数据库上传
                Object key[] = pMap.keySet().toArray();

                for (int v = 0; v < pMap.size(); v++) {
                    PictureData pic = pMap.get(key[v]);
                    String picName = key[v].toString();
                    String ext = pic.suggestFileExtension();
                    byte[] data = pic.getData();
                    try {
                        InputStream input = new ByteArrayInputStream(data);
                        String url = upload(input, "." + ext);
                        if(StringUtils.isNotEmpty(url)){
                            //解析key 并根据key 设置 某一行的某一列的 图片链接
                            String[] split = picName.split("-");
                            Integer rowIndex = Integer.parseInt(split[0].toString()),columnIndex = Integer.parseInt(split[1].toString());
                            //根据行下标 获取所有的列
                            Map<Integer, String> columns = map.get(rowIndex);

                            //根据列下标 设置图片链接值
                            columns.put(columnIndex, url);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 添加当前页的所有内容
                mapSheet.put(sheetName, map);
            }
        }
        return mapSheet;
    }

    public static String upload( InputStream inputStream,String suffix){
        String url = OSSFactory.build().uploadSuffix(inputStream, suffix);
        String url1 = url;
        String url2 = "";
        if (url.contains("#")) {
            String[] urls = url.split("#");
            if (urls != null && urls.length > 1) {
                url1 = urls[0];
                url2 = urls[1];
            } else {
                url1 = url.substring(0, url.lastIndexOf("#"));
            }
        }
        return url1;
    }

    //获取表格字段属性
    private static Object getCellFormatValue(Cell cell) {
        Object cellValue = null;
        if (cell != null) {
            // 判断cell类型
            switch (cell.getCellType()) {

                case Cell.CELL_TYPE_NUMERIC: {
                    cellValue = String.valueOf(cell.getNumericCellValue());

                    break;
                }
                case Cell.CELL_TYPE_FORMULA: {
                    // 判断cell是否为日期格式
                    if (DateUtil.isCellDateFormatted(cell)) {
                        // 转换为日期格式YYYY-mm-dd
                        cellValue = cell.getDateCellValue();
                    } else {
                        // 数字
                        cellValue = String.valueOf(cell.getNumericCellValue());

                    }
                    break;
                }
                case Cell.CELL_TYPE_STRING: {
                    cellValue = cell.getRichStringCellValue().getString();

                    break;
                }
                default:
                    cellValue = "";
            }
        } else {
            cellValue = "";
        }
        return cellValue;
    }

    // 读取图片
    public static Map<String, PictureData> getPictures1(HSSFSheet sheet) throws IOException {
        Map<String, PictureData> map = new HashMap<String, PictureData>();
        List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
        for (HSSFShape shape : list) {
            if (shape instanceof HSSFPicture) {
                HSSFPicture picture = (HSSFPicture) shape;
                HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
                PictureData pdata = picture.getPictureData();
                String key = cAnchor.getRow1() + "-" + cAnchor.getCol1(); // 行号-列号
                map.put(key, pdata);
            }
        }
        return map;
    }

    //读取图片
    public  static Map<String, PictureData> getPictures2(XSSFSheet sheet) throws IOException {
        Map<String, PictureData> map = new HashMap<String, PictureData>();
        List<POIXMLDocumentPart> list = sheet.getRelations();
        for (POIXMLDocumentPart part : list) {
            if (part instanceof XSSFDrawing) {
                XSSFDrawing drawing = (XSSFDrawing) part;
                List<XSSFShape> shapes = drawing.getShapes();
                for (XSSFShape shape : shapes) {
                    XSSFPicture picture = (XSSFPicture) shape;
                    XSSFClientAnchor anchor = picture.getPreferredSize();
                    CTMarker marker = anchor.getFrom();
                    String key = marker.getRow() + "-" + marker.getCol();
                    map.put(key, picture.getPictureData());
                }
            }
        }
        return map;
    }

    // 读取excel
    @SuppressWarnings("unused")
    private static Workbook readExcel(MultipartFile file) {
        Workbook wb = null;

        if (file == null) {
            return null;
        }
        String filename = file.getOriginalFilename();
        InputStream is = null;
        try {
            is = file.getInputStream();
            if (filename.endsWith(".xls")) {
                return wb = new HSSFWorkbook(is);
            } else if (filename.endsWith(".xlsx")) {
                return wb = new XSSFWorkbook(is);
            } else {
                return wb = null;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值