若依 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

相关推荐
开开心心就好11 小时前
仅168KB的桌面图标自动隐藏工具
windows·计算机视觉·计算机外设·excel·启发式算法·宽度优先·csdn开发云
怪兽软家14 小时前
DaVinci Resolve/达芬奇 20安装教程及下载
windows·经验分享·生活
chao18984414 小时前
完整MES系统实现 (C# 客户端服务器)
服务器·windows·c#
Hello_Embed16 小时前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
Muyuan199816 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
AxureMost17 小时前
4DDiG DLL Fixe 1.0.8.2 系统DLL修复工具
windows
蒋胜山17 小时前
Excel 练习题(7)
经验分享·excel
怣疯knight19 小时前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
空中海20 小时前
02. 静态逆向、Manifest 分析与 Smali 重打包
服务器·网络·windows
一拳一个娘娘腔20 小时前
告别图形化界面:基于CLI的Windows系统入侵排查与防御实战手册
windows·安全