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

相关推荐
ι:10 小时前
NUC12 Pro 安装 Ubuntu 24.04 LTS 详细教程
linux·windows·ubuntu·nuc
YCOSA202510 小时前
微软宣布将于10月7日举行Windows与Surface发布会,聚焦“Windows、NVIDIA RTX Spark、Surface,以及更广泛PC生态”
windows
Source.Liu11 小时前
【A11】 labelprinter(Tauri 版)新建步骤
windows·rust
Punchline27812 小时前
解决 Windows 环境变量 Path 设置时提示“字符太长”的完整指南
windows·环境变量·path
chushiyunen12 小时前
claude code笔记(二)、claude桌面端(内网不好用)
windows
d_benhua13 小时前
以太网测试步骤
windows
冯一川13 小时前
DeepSeek在Windows系统上部署
windows·python
Data-Miner14 小时前
AI处理数据的脚本复用与逻辑复用有什么区别?哪种方式更能沉淀工作成果
数据分析·excel
解道Jdon15 小时前
JDK 27发布:紧凑对象头、G1默认、量子安全TLS
ide·windows·git·svn·eclipse·github·visual studio
fengjianhua122517 小时前
免费PDF转换工具哪个转换效果最好?磨针PDF转换准确率评测
windows