若依 el-upload 上传execl 导入后 返回错误数据excel(二)

后端接口:

1.下载模版,模版包括三级联动选择

@PostMapping("/downloadClanMemberTemplate")
    public void downloadClanMemberTemplate(HttpServletResponse response,String kinId) throws Exception {
        if(StringUtils.isBlank(kinId)){
            throw new ServiceException("参数 kinId 不能为空");
        }

        R<List<MingmenKin>> kinByKinIds = remoteAppUserService.getKinByKinIds(String.valueOf(kinId), SecurityConstants.INNER);
        if(kinByKinIds.getCode() != R.SUCCESS){
            throw new ServiceException("获取家族失败");
        }

        if(kinByKinIds.getData() == null || kinByKinIds.getData().isEmpty()){
            throw new ServiceException("家族不存在");
        }

        // 准备数据
        Map<String, List<String>> areaList = new LinkedHashMap<>();
        //areaList.put("中国", Arrays.asList("北京", "上海", "广州"));
        //areaList.put("美国", Arrays.asList("纽约", "洛杉矶"));
        //areaList.put("日本", Arrays.asList("东京", "大阪"));

        // 准备数据
        Map<String, List<String>> areaList1 = new LinkedHashMap<>();
        //areaList1.put("北京", Arrays.asList("北京1", "北京2"));
        //areaList1.put("上海", Arrays.asList("上海1", "上海2", "上海3"));

        //查询几世
        List<Map<String,String>> list=new ArrayList<>();
        //查询有无始祖
        MmwzClanMember one = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).eq(MmwzClanMember::getEraNumber, 1).one();
        if(one == null){
            Map<String,String> map=new HashedMap<>();
            map.put("eraNumber","1");
            map.put("eraNumberName","始祖");
            list.add(map);
        }

        MmwzClanMember eraNumberMax = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).isNotNull(MmwzClanMember::getEraNumber).orderByDesc(MmwzClanMember::getEraNumber)
                .last("limit 0,1")
                .one();

        if(eraNumberMax != null){
            NumberToChinese converter = new NumberToChinese();

            //当前最大世数
            Integer eraNumber = eraNumberMax.getEraNumber();
            for(int i=2;i<=eraNumber+1;i++){
                Map<String,String> map=new HashedMap<>();
                map.put("eraNumber",i+"");
                map.put("eraNumberName","第"+converter.convert(i)+"世");
                list.add(map);
            }
        }

        List<Map<String,String>> list2=new ArrayList<>();

        for(Map<String,String>  era : list){
            String eraNumber = era.get("eraNumber");
            String eraNumberName = era.get("eraNumberName");

            List<MmwzClanMember> list1 = mmwzClanMemberService.lambdaQuery()
                    .select(MmwzClanMember::getName,MmwzClanMember::getId)
                    .eq(MmwzClanMember::getKinId, kinId)
                    .eq(MmwzClanMember::getSex,0)
                    .eq(MmwzClanMember::getEraNumber, Integer.valueOf(eraNumber) - 1).list();

            List<String> collect = list1.stream().map(m -> m.getName()).collect(Collectors.toList());

            areaList.put(eraNumberName,collect);

            for(MmwzClanMember mmwzClanMember:list1){
                Map<String,String> map=new HashedMap<>();
                map.put("id",String.valueOf(mmwzClanMember.getId()));
                map.put("name",mmwzClanMember.getName());
                list2.add(map);
            }
        }

        for(Map<String,String> spouse:list2){
            String id = spouse.get("id");
            String name = spouse.get("name");

            List<MmwzClanMember> list3 = mmwzClanMemberService.lambdaQuery()
                    .select(MmwzClanMember::getName,MmwzClanMember::getId)
                    .eq(MmwzClanMember::getKinId, kinId)
                    .eq(MmwzClanMember::getPid,id)
                    .eq(MmwzClanMember::getPidRelationType, 0).list();

            List<String> collect = list3.stream().map(m -> m.getName()).collect(Collectors.toList());

            areaList1.put(name,collect);
        }


        //导出
        ClassPathResource resource = new ClassPathResource("excelTemplate/clanMemberTemplate.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(resource.getStream());

        // 获取所有名称
        List<XSSFName> allNames = workbook.getAllNames();
        for (int i = allNames.size() - 1; i >= 0; i--) {
            Name name = allNames.get(i);
            workbook.removeName(name); // 从后向前删除名称
        }


        XSSFSheet mainSheet = workbook.getSheet("Main");

        // 创建隐藏 Sheet 用于存储数据
        //XSSFSheet hiddenSheet = workbook.createSheet("HiddenData");
        XSSFSheet hiddenSheet = workbook.getSheet("HiddenData");
        // 保护工作表
        hiddenSheet.protectSheet("jcd743001734"); // 设置保护密码
        int rowIndex = 0;
        for (Map.Entry<String, List<String>> entry : areaList.entrySet()) {
            XSSFRow row = hiddenSheet.createRow(rowIndex++);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue(entry.getKey());
            for (int i = 0; i < entry.getValue().size(); i++) {
                cell = row.createCell(i + 1);
                cell.setCellValue(entry.getValue().get(i));
            }

            // 创建名称管理器
            Name name = workbook.createName();
            name.setNameName(entry.getKey());
            name.setRefersToFormula("HiddenData!$" + (char) ('A' + 1) + "$" + rowIndex + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex);
        }

        // 创建隐藏 Sheet 用于存储数据
        //XSSFSheet hiddenSheet2 = workbook.createSheet("HiddenData2");
        XSSFSheet hiddenSheet2 = workbook.getSheet("HiddenData2");
        // 保护工作表
        hiddenSheet2.protectSheet("jcd743001734"); // 设置保护密码
        int rowIndex2 = 0;
        for (Map.Entry<String, List<String>> entry : areaList1.entrySet()) {
            XSSFRow row = hiddenSheet2.createRow(rowIndex2++);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue(entry.getKey());
            for (int i = 0; i < entry.getValue().size(); i++) {
                cell = row.createCell(i + 1);
                cell.setCellValue(entry.getValue().get(i));
            }

            // 创建名称管理器
            Name name = workbook.createName();
            name.setNameName(entry.getKey());
            name.setRefersToFormula("HiddenData2!$" + (char) ('A' + 1) + "$" + rowIndex2 + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex2);
        }

        // 设置一级下拉菜单
        DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();
        DataValidationConstraint constraint = dvHelper.createFormulaListConstraint("HiddenData!$A$1:$A$" + rowIndex);
        CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0, 0); // A1:A101
        DataValidation validation = dvHelper.createValidation(constraint, addressList);
        validation.setSuppressDropDownArrow(true);
        mainSheet.addValidationData(validation);

        // 设置二级下拉菜单
        for (int i = 1; i <= 100; i++) {
            constraint = dvHelper.createFormulaListConstraint("INDIRECT($A$" + i + ")");
            addressList = new CellRangeAddressList(i , i, 1, 1); // B1:B101
            validation = dvHelper.createValidation(constraint, addressList);
            validation.setSuppressDropDownArrow(true);
            mainSheet.addValidationData(validation);
        }

        // 设置三级下拉菜单
        for (int i = 1; i <= 100; i++) {
            constraint = dvHelper.createFormulaListConstraint("INDIRECT($B$" + i + ")");
            addressList = new CellRangeAddressList(i, i, 2, 2); // B1:B101
            validation = dvHelper.createValidation(constraint, addressList);
            validation.setSuppressDropDownArrow(true);
            mainSheet.addValidationData(validation);
        }


        // 一次性写出内容,使用默认样式,强制输出标题
        //bigExcelWriter.write(list2);
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=clanMemberTemplate.xlsx");
        ServletOutputStream out=response.getOutputStream();
        // 终止后删除临时文件
        //file.deleteOnExit();
        workbook.write(out);
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }

2.导入接口,包含导入失败的数据在下载下来,修改后重新导入

@PostMapping("/importClanMember")
    public void importOwnerAndHouse(MultipartFile file, HttpServletResponse response,@RequestPart(value = "kinId") String kinId) throws Exception {
        //String kinId = (String)formData.get("kinId");
        if(StringUtils.isBlank(kinId)){
            throw new ServiceException("参数 kinId 不能为空");
        }

        R<List<MingmenKin>> kinByKinIds = remoteAppUserService.getKinByKinIds(String.valueOf(kinId), SecurityConstants.INNER);
        if(kinByKinIds.getCode() != R.SUCCESS){
            throw new ServiceException("获取家族失败");
        }

        if(kinByKinIds.getData() == null || kinByKinIds.getData().isEmpty()){
            throw new ServiceException("家族不存在");
        }

        ExcelReader reader = cn.hutool.poi.excel.ExcelUtil.getReader(file.getInputStream());
        List<Sheet> sheets = reader.getSheets();
        Sheet rows = sheets.get(0);
        List<Map<String, String>> sheetData = ImportExcelUtil.getSheetData(rows);

        List<ImportClanMemberDto> list1=new ArrayList<>();
        for(Map<String, String> map:sheetData){
            ImportClanMemberDto dto=new ImportClanMemberDto();
            dto.setEraNumberName(map.get("第几世"));
            dto.setPName(map.get("父亲"));
            dto.setMotherName(map.get("母亲"));
            dto.setSexName(map.get("性别"));
            dto.setName(map.get("姓名"));
            dto.setRanking(Integer.valueOf(map.get("排行")));
            dto.setIntroduction(map.get("简介"));
            dto.setIsMarriedName(map.get("婚否"));
            dto.setSpouseNames(map.get("配偶姓名"));
            list1.add(dto);
        }

        List<ImportClanMemberDto> failList=new ArrayList<>();

        List<ImportClanMemberDto> okList=new ArrayList<>();

        for (ImportClanMemberDto dto:list1){
            if(StringUtils.isBlank(dto.getEraNumberName())){
                dto.setImportFailReason("第几世 不能为空");
                failList.add(dto);
                continue;
            }else{
                String replace = dto.getEraNumberName().replace("第", "").replace("世", "");
                int i = NumberToChinese.chineseToNumber(replace);
                dto.setEraNumber(i);
            }

            if(StringUtils.isBlank(dto.getPName())){
                dto.setImportFailReason("父亲 不能为空");
                failList.add(dto);
                continue;
            }else {
                List<MmwzClanMember> list = mmwzClanMemberService.lambdaQuery()
                        .eq(MmwzClanMember::getKinId, kinId)
                        .eq(MmwzClanMember::getEraNumber, dto.getEraNumber()-1)
                        .eq(MmwzClanMember::getName, dto.getPName()).list();
                if(list.size() != 1){
                    dto.setImportFailReason("查询父亲结果数不为1");
                    failList.add(dto);
                    continue;
                }
                dto.setPid(list.get(0).getId());
            }

            if(StringUtils.isBlank(dto.getMotherName())){
                dto.setImportFailReason("母亲 不能为空");
                failList.add(dto);
                continue;
            }else{
                List<MmwzClanMember> list2 = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId)
                        .eq(MmwzClanMember::getPid, dto.getPid())
                        .eq(MmwzClanMember::getPidRelationType, 0)
                        .eq(MmwzClanMember::getName, dto.getMotherName())
                        .list();
                if(list2.size() != 1){
                    dto.setImportFailReason("查询母亲结果数不为1");
                    failList.add(dto);
                    continue;
                }

                dto.setMotherId(list2.get(0).getId());
            }

            if(StringUtils.isBlank(dto.getSexName())){
                dto.setImportFailReason("性别 不能为空");
                failList.add(dto);
                continue;
            }else {
                if(StringUtils.equals(dto.getSexName(),"男")){
                    dto.setSex(0);
                    dto.setPidRelationType(1);//儿子
                }else if(StringUtils.equals(dto.getSexName(),"女")){
                    dto.setSex(1);
                    dto.setPidRelationType(2);//女儿
                }
            }

            if(StringUtils.isBlank(dto.getIsMarriedName())){
                dto.setImportFailReason("婚否 不能为空");
                failList.add(dto);
                continue;
            }else {
                if(StringUtils.equals(dto.getIsMarriedName(),"未婚")){
                    dto.setIsMarried(0);
                }else if(StringUtils.equals(dto.getIsMarriedName(),"已婚")){
                    dto.setIsMarried(1);
                }
            }

            if(dto.getIsMarried() ==1 && StringUtils.isBlank(dto.getSpouseNames())){
                dto.setImportFailReason("婚否 不能为空");
                failList.add(dto);
                continue;
            }else if(dto.getIsMarried() ==1 && StringUtils.isNotBlank(dto.getSpouseNames())){
                String[] split = StringUtils.split(dto.getSpouseNames(), ",");
                List<MmwzClanMember> list2=new ArrayList<>();
                for(String name:split){
                    MmwzClanMember clanMember1=new MmwzClanMember();
                    //拷贝姓名和简介字段
                    clanMember1.setName(name);
                    clanMember1.setIntroduction(null);

                    clanMember1.setPid(null);
                    clanMember1.setPidRelationType(0);
                    clanMember1.setKinId(Long.valueOf(kinId));
                    list2.add(clanMember1);
                }
                dto.setSpouseList(list2);
            }
            okList.add(dto);
        }

        for (ImportClanMemberDto dto:okList){
            MmwzClanMember mmwzClanMember=new MmwzClanMember();
            BeanUtils.copyBeanProp(mmwzClanMember,dto);
            mmwzClanMember.setKinId(Long.valueOf(kinId));
            mmwzClanMemberService.save(mmwzClanMember);

            //保存配偶
            if(dto.getSpouseList() != null){
                for(MmwzClanMember s : dto.getSpouseList()){
                    s.setPid(mmwzClanMember.getId());
                    mmwzClanMemberService.save(s);
                }
            }


        }
        List<List<Object>> list2 =new ArrayList<>();
        for (ImportClanMemberDto dto:failList){
            List<Object> list3=new ArrayList<>();

            list3.add(dto.getEraNumberName());
            list3.add(dto.getPName());
            list3.add(dto.getMotherName());
            list3.add(dto.getSexName());
            list3.add(dto.getName());
            list3.add(dto.getRanking());
            list3.add(dto.getIntroduction());
            list3.add(dto.getIsMarriedName());
            list3.add(dto.getSpouseNames());//
            list3.add(dto.getImportFailReason());//
            list2.add(list3);
        }

        if (!list2.isEmpty()){
            // 准备数据
            Map<String, List<String>> areaList = new LinkedHashMap<>();
            //areaList.put("中国", Arrays.asList("北京", "上海", "广州"));
            //areaList.put("美国", Arrays.asList("纽约", "洛杉矶"));
            //areaList.put("日本", Arrays.asList("东京", "大阪"));

            // 准备数据
            Map<String, List<String>> areaList1 = new LinkedHashMap<>();
            //areaList1.put("北京", Arrays.asList("北京1", "北京2"));
            //areaList1.put("上海", Arrays.asList("上海1", "上海2", "上海3"));

            //查询几世
            List<Map<String,String>> list=new ArrayList<>();
            //查询有无始祖
            MmwzClanMember one = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).eq(MmwzClanMember::getEraNumber, 1).one();
            if(one == null){
                Map<String,String> map=new HashedMap<>();
                map.put("eraNumber","1");
                map.put("eraNumberName","始祖");
                list.add(map);
            }

            MmwzClanMember eraNumberMax = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).isNotNull(MmwzClanMember::getEraNumber).orderByDesc(MmwzClanMember::getEraNumber)
                    .last("limit 0,1")
                    .one();

            if(eraNumberMax != null){
                NumberToChinese converter = new NumberToChinese();

                //当前最大世数
                Integer eraNumber = eraNumberMax.getEraNumber();
                for(int i=2;i<=eraNumber+1;i++){
                    Map<String,String> map=new HashedMap<>();
                    map.put("eraNumber",i+"");
                    map.put("eraNumberName","第"+converter.convert(i)+"世");
                    list.add(map);
                }
            }

            List<Map<String,String>> list4=new ArrayList<>();

            for(Map<String,String>  era : list){
                String eraNumber = era.get("eraNumber");
                String eraNumberName = era.get("eraNumberName");

                List<MmwzClanMember> list5 = mmwzClanMemberService.lambdaQuery()
                        .select(MmwzClanMember::getName,MmwzClanMember::getId)
                        .eq(MmwzClanMember::getKinId, kinId)
                        .eq(MmwzClanMember::getSex,0)
                        .eq(MmwzClanMember::getEraNumber, Integer.valueOf(eraNumber) - 1).list();

                List<String> collect = list5.stream().map(m -> m.getName()).collect(Collectors.toList());

                areaList.put(eraNumberName,collect);

                for(MmwzClanMember mmwzClanMember:list5){
                    Map<String,String> map=new HashedMap<>();
                    map.put("id",String.valueOf(mmwzClanMember.getId()));
                    map.put("name",mmwzClanMember.getName());
                    list4.add(map);
                }
            }

            for(Map<String,String> spouse:list4){
                String id = spouse.get("id");
                String name = spouse.get("name");

                List<MmwzClanMember> list3 = mmwzClanMemberService.lambdaQuery()
                        .select(MmwzClanMember::getName,MmwzClanMember::getId)
                        .eq(MmwzClanMember::getKinId, kinId)
                        .eq(MmwzClanMember::getPid,id)
                        .eq(MmwzClanMember::getPidRelationType, 0).list();

                List<String> collect = list3.stream().map(m -> m.getName()).collect(Collectors.toList());

                areaList1.put(name,collect);
            }


            //导出
            ClassPathResource resource = new ClassPathResource("excelTemplate/clanMemberTemplate.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook(resource.getStream());

            // 获取所有名称
            List<XSSFName> allNames = workbook.getAllNames();
            for (int i = allNames.size() - 1; i >= 0; i--) {
                Name name = allNames.get(i);
                workbook.removeName(name); // 从后向前删除名称
            }

            //回显数据
            int rowIndex3 = 1;
            XSSFSheet mainSheet = workbook.getSheet("Main");
            for (List<Object> row:list2) {
                XSSFRow erow = mainSheet.createRow(rowIndex3++);

                for (int i = 0; i < row.size(); i++) {
                    XSSFCell cell = erow.createCell(i);
                    cell.setCellValue(String.valueOf(row.get(i)));
                    System.out.println(row.get(i));
                }
            }


            // 创建隐藏 Sheet 用于存储数据
            //XSSFSheet hiddenSheet = workbook.createSheet("HiddenData");
            XSSFSheet hiddenSheet = workbook.getSheet("HiddenData");
            // 保护工作表
            hiddenSheet.protectSheet("jcd743001734"); // 设置保护密码
            int rowIndex = 0;
            for (Map.Entry<String, List<String>> entry : areaList.entrySet()) {
                XSSFRow row = hiddenSheet.createRow(rowIndex++);
                XSSFCell cell = row.createCell(0);
                cell.setCellValue(entry.getKey());
                for (int i = 0; i < entry.getValue().size(); i++) {
                    cell = row.createCell(i + 1);
                    cell.setCellValue(entry.getValue().get(i));
                }

                // 创建名称管理器
                Name name = workbook.createName();
                name.setNameName(entry.getKey());
                name.setRefersToFormula("HiddenData!$" + (char) ('A' + 1) + "$" + rowIndex + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex);
            }

            // 创建隐藏 Sheet 用于存储数据
            //XSSFSheet hiddenSheet2 = workbook.createSheet("HiddenData2");
            XSSFSheet hiddenSheet2 = workbook.getSheet("HiddenData2");
            // 保护工作表
            hiddenSheet2.protectSheet("jcd743001734"); // 设置保护密码
            int rowIndex2 = 0;
            for (Map.Entry<String, List<String>> entry : areaList1.entrySet()) {
                XSSFRow row = hiddenSheet2.createRow(rowIndex2++);
                XSSFCell cell = row.createCell(0);
                cell.setCellValue(entry.getKey());
                for (int i = 0; i < entry.getValue().size(); i++) {
                    cell = row.createCell(i + 1);
                    cell.setCellValue(entry.getValue().get(i));
                }

                // 创建名称管理器
                Name name = workbook.createName();
                name.setNameName(entry.getKey());
                name.setRefersToFormula("HiddenData2!$" + (char) ('A' + 1) + "$" + rowIndex2 + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex2);
            }

            // 设置一级下拉菜单
            DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();
            DataValidationConstraint constraint = dvHelper.createFormulaListConstraint("HiddenData!$A$1:$A$" + rowIndex);
            CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0, 0); // A1:A101
            DataValidation validation = dvHelper.createValidation(constraint, addressList);
            validation.setSuppressDropDownArrow(true);
            mainSheet.addValidationData(validation);

            // 设置二级下拉菜单
            for (int i = 1; i <= 100; i++) {
                constraint = dvHelper.createFormulaListConstraint("INDIRECT($A$" + i + ")");
                addressList = new CellRangeAddressList(i , i, 1, 1); // B1:B101
                validation = dvHelper.createValidation(constraint, addressList);
                validation.setSuppressDropDownArrow(true);
                mainSheet.addValidationData(validation);
            }

            // 设置三级下拉菜单
            for (int i = 1; i <= 100; i++) {
                constraint = dvHelper.createFormulaListConstraint("INDIRECT($B$" + i + ")");
                addressList = new CellRangeAddressList(i, i, 2, 2); // B1:B101
                validation = dvHelper.createValidation(constraint, addressList);
                validation.setSuppressDropDownArrow(true);
                mainSheet.addValidationData(validation);
            }


            // 一次性写出内容,使用默认样式,强制输出标题
            //bigExcelWriter.write(list2);
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
            //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
            response.setHeader("Content-Disposition","attachment;filename=clanMemberTemplate.xlsx");
            ServletOutputStream out=response.getOutputStream();
            // 终止后删除临时文件
            //file.deleteOnExit();
            workbook.write(out);
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }else {
            JSONObject json=new JSONObject();
            json.put("code",200);
            json.put("msg","导入成功");
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json;charset=utf-8");
            PrintWriter out= null;
            out=response.getWriter();
            out.write(json.toString());
        }
    }

3.依赖的类库

package com.ruoyi.inherit.utils;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import java.math.BigDecimal;
import java.util.*;

//读取excel工具类
public class ImportExcelUtil {
    /**
     * 读取Sheet 的所有数据
     * @param rows
     * @return
     */
    public static List<Map<String, String>> getSheetData(Sheet rows){
        Map<Integer, String> tableHeader=new HashMap<Integer, String>();
        List<Map<String, String>> list=new ArrayList<Map<String, String>>();

        int rowNum=0;
        Iterator<Row> rowIterator = rows.rowIterator();
        while (rowIterator.hasNext()){

            Row row = rowIterator.next();
            Iterator<Cell> cellIterator = row.cellIterator();
            int column=0;
            Map<String, String> tdata=new HashMap<>();
            while(cellIterator.hasNext()){
                Cell next = cellIterator.next();
                int columnIndex = next.getColumnIndex();
                String cellValue = getCellValue(next);
                if(rowNum == 0){
                    //第0行,表头
                    tableHeader.put(column,cellValue);
                }else {
                    tdata.put(tableHeader.get(columnIndex),cellValue);
                }
                column++;
            }
            if(rowNum != 0){
                list.add(tdata);
            }
            rowNum ++;
        }
        return list;
    }

    private static String getCellValue(Cell cell) {
        CellType cellType = cell.getCellType();
        if (cellType == CellType.STRING){
            String stringCellValue = cell.getStringCellValue();
            return stringCellValue;
        }else if (cellType == CellType.NUMERIC){
            Double value = cell.getNumericCellValue();
            BigDecimal bd1 = new BigDecimal(Double.toString(value));
            // 去掉后面无用的零  如小数点后面全是零则去掉小数点
            String s = "";
            if (bd1.toPlainString().contains(".")){
                s = bd1.toPlainString().replaceAll("0+?$", "").replaceAll("[.]$", "");
            }else{
                s = bd1.toPlainString();
            }

            return s;
        }
        return "";
    }
}

<!--Hutool -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>

前端调用

<el-dialog
      title="族谱成员导入"
      :visible.sync="importClanMember.show"
      width="600px"
      append-to-body
    >
      <el-form
        ref="form"
        :model="importClanMember.data"
        :rules="importClanMember.rules"
        label-width="150px"
      >
        <el-row>
          <el-col :span="24">
            <el-link
              type="primary"
              @click="downloadClanMemberTemplate()"
              style="margin-bottom: 20px"
              >下载导入模板</el-link
            >
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-upload
              action="#"
              :before-upload="handleBeforeUpload"
              :show-file-list="false"
              :headers="uploadData.headers"
              class="upload-file-uploader"
              :http-request="upAndDowndoad"
            >
              <el-button size="mini" type="primary">选取文件</el-button>
              <div class="el-upload__tip" slot="tip">
                请上传
                <template v-if="uploadData.fileType">
                  格式为 <b style="color: #f56c6c">{{ uploadData.fileType.join("/") }}</b>
                </template>
                的文件
              </div>
            </el-upload>
          </el-col>
        </el-row>
      </el-form>
    </el-dialog>

import { listMmwzClanMember, getMmwzClanMember, delMmwzClanMember, addMmwzClanMember, updateMmwzClanMember ,importClanMember} from "@/api/inherit/mmwzClanMember";
import { blobValidate } from "@/utils/ruoyi";
import { saveAs } from "file-saver";

// 验证是否为blob格式
export function blobValidate(data) {
  return data.type !== 'application/json'
}
// 上传前校检格式和大小
    handleBeforeUpload(file) {
      // 校检文件类型
      if (this.uploadData.fileType) {
        const fileName = file.name.split(".");
        const fileExt = fileName[fileName.length - 1];
        const isTypeOk = this.uploadData.fileType.indexOf(fileExt) >= 0;
        if (!isTypeOk) {
          this.$modal.msgError(
            `文件格式不正确, 请上传${this.uploadData.fileType.join("/")}格式文件!`
          );
          return false;
        }
      }
      return true;
    },
    upAndDowndoad(params) {
      var that = this;
      let form = new FormData();
      form.append("file", params.file);
      form.append("kinId", this.importClanMember.kinId);
      importClanMember(form).then((response) => {
        console.log(response);
        const isBlob = blobValidate(response);
        if (isBlob) {
          const blob = new Blob([response]);
          saveAs(blob, "族谱成员导入模板-需修改重新上传.xlsx");
        } else {
          response
            .text()
            .then((data) => {
              var resp = JSON.parse(data);
              if (resp.code == 500) {
                this.$modal.msgError(resp.msg);
              } else {
                that.$modal.msgSuccess(resp.msg);
              }
            })
            .catch((err) => {});
          
          this.getList();
        }
      });
    },
    handleImport(){
      if(this.ids.length != 1){
        this.$modal.msgError('请选择一个成员,导入成员到他的家族');
        return ;
      }

      var arr = this.mmwzClanMemberList.filter(item => item.id == this.ids[0]);
      if(arr.length != 1){
        this.$modal.msgError('未找到家族ID');
        return ;
      }
      this.importClanMember.kinId = arr[0]['kinId'];

      this.importClanMember.show=true;
    },
    downloadClanMemberTemplate() {
      this.download(
        "/inherit/mmwzClanMember/downloadClanMemberTemplate",
        {kinId:this.importClanMember.kinId},
        "族谱成员导入模板.xlsx",
        {}
      );
    },

//导入族谱成员
export function importClanMember(data) {
  /*return request({
    url: '/inherit/mmwzClanMember/importClanMember',
    method: 'post',
    responseType: 'blob',
    data:data
  });*/
  return request.post("/inherit/mmwzClanMember/importClanMember", data, {
    headers: {
      "Content-Type": "multipart/form-data",
    },
    responseType: "blob",
  });

const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000
})

Excel模版参考文件下载

通过网盘分享的文件:若依 el-upload 上传execl 导入后 返回错误数据excel(二)

链接: https://pan.baidu.com/s/1u4ZAxLSahk-1j93bAq2oew?pwd=fbx8 提取码: fbx8

相关推荐
m0_6724496034 分钟前
使用Java操作Excel
java·python·excel
太空漫步111 小时前
ListView展示图片
windows
修昔底德1 小时前
费曼学习法12 - 告别 Excel!用 Python Pandas 开启数据分析高效之路 (Pandas 入门篇)
人工智能·python·学习·excel·pandas
非晓为骁3 小时前
【Python】在Windows下配置Python最小环境并在React执行Python脚本
windows·python·react.js
数据小爬虫@5 小时前
如何解析API返回的JSON数据?
windows·python·json
System_sleep6 小时前
win11编译pytorchaudio cuda128版本流程
人工智能·pytorch·windows·python·编译·cuda
人类群星闪耀时6 小时前
巧用优先队列与分治法:高效合并 K 个升序链表
数据结构·windows·链表
Alkaid:6 小时前
conda常用命令
windows·python·conda
开拓忍者7 小时前
Notpad++通过SFTP连接ubuntu20.04实现windows下文件修改
linux·windows·ubuntu