Excel实现多Sheet文件导入导出

Java——使用Excel实现多Sheet导入导出

本文主要介绍如何使用Excel实现导入导出功能。

现以硬件的设备健康度的规则集合数据为例,规则集合中有规则集(rule)、规则组(group)、规则项(item)三个有关联的数据,各存放在不同的表中。其中,规则集id关联规则组的点表id,规则组id关联规则项的组id。现在要导出一个硬件设备的规则集合数据,分别放在不同的Sheet工作表中且存放在同一个Excel文件。(可参考导出导入方法结合自己实际情况实现)

1. 添加依赖

在pom.xml文件中添加依赖,如缺失其他依赖可自行添加。

<!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>

2. 编写Excel工具类

这一步,先在Excel工具类中添加导出方法,即将数据写入多Sheet工作表中。后续导出excel文件中需要用到。

public class ExcelUtil<T> {

    public ExcelUtil(Class<T> clazz) {
        this.clazz = clazz;
    }

	/**
     * 将数据写入工作表
     *
     * @param sheet    工作表
     * @param dataList 数据列表
     * @param headers  表头
     * @throws IllegalAccessException
     */
    public static void writeDataToSheet(Sheet sheet, List<?> dataList, String[] headers) throws IllegalAccessException {
        //初始化列数和行数
        int columnNum = 0;
        int rowNum = 0;
        //创建并填充头部行
        Row headerRow = sheet.createRow(rowNum++);
        for (String header : headers) {
            headerRow.createCell(columnNum++).setCellValue(header);
        }
        //遍历数据列表
        for (Object data : dataList) {
            //创建新行
            Row dataRow = sheet.createRow(rowNum++);
            columnNum = 0;
            //如果数据不为空,获取其类并反射获取字段
            if (data != null) {
                Class<?> clazz = data.getClass();
                Field[] fields = clazz.getDeclaredFields();
                //遍历字段,查找注解为Excel的字段
                for (Field field : fields) {
                    //允许访问私有字段
                    field.setAccessible(true);
                    Excel excelAnnotation = field.getAnnotation(Excel.class);
                    //如果字段有Excel注解,获取字段值并写入单元格
                    if (excelAnnotation != null) {
                        Object value = field.get(data);
                        dataRow.createCell(columnNum++).setCellValue(value != null ? value.toString() : "");
                    }
                }
            }
        }
    }

其中,Excel自定义注解如下:

/**
 * 自定义导出Excel数据注解
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
    /**
     * 导出时在excel中排序
     */
    int sort() default Integer.MAX_VALUE;

    /**
     * 导出到Excel中的名字.
     */
    String name() default "";

    /**
     * 日期格式, 如: yyyy-MM-dd
     */
    String dateFormat() default "";

    /**
     * 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
     */
    String dictType() default "";

    /**
     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
     */
    String readConverterExp() default "";

    /**
     * 分隔符,读取字符串组内容
     */
    String separator() default ",";

    /**
     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
     */
    int scale() default -1;

    /**
     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
     */
    int roundingMode() default BigDecimal.ROUND_HALF_EVEN;

    /**
     * 导出时在excel中每个列的高度 单位为字符
     */
    double height() default 14;

    /**
     * 导出时在excel中每个列的宽 单位为字符
     */
    double width() default 16;

    /**
     * 文字后缀,如% 90 变成90%
     */
    String suffix() default "";

    /**
     * 当值为空时,字段的默认值
     */
    String defaultValue() default "";

    /**
     * 提示信息
     */
    String prompt() default "";

    /**
     * 设置只能选择不能输入的列内容.
     */
    String[] combo() default {};

    /**
     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
     */
    boolean needMerge() default false;

    /**
     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
     */
    boolean isExport() default true;

    /**
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
     */
    String targetAttr() default "";

    /**
     * 是否自动统计数据,在最后追加一行统计数据总和
     */
    boolean isStatistics() default false;

    /**
     * 导出类型(0数字 1字符串 2图片)
     */
    ColumnType cellType() default ColumnType.STRING;

    /**
     * 导出列头背景色
     */
    IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;

    /**
     * 导出列头字体颜色
     */
    IndexedColors headerColor() default IndexedColors.WHITE;

    /**
     * 导出单元格背景色
     */
    IndexedColors backgroundColor() default IndexedColors.WHITE;

    /**
     * 导出单元格字体颜色
     */
    IndexedColors color() default IndexedColors.BLACK;

    /**
     * 导出字段对齐方式
     */
    HorizontalAlignment align() default HorizontalAlignment.CENTER;

    /**
     * 自定义数据处理器
     */
    Class<?> handler() default ExcelHandlerAdapter.class;

    /**
     * 自定义数据处理器参数
     */
    String[] args() default {};

    /**
     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    Type type() default Type.ALL;

    enum Type {
        ALL(0), EXPORT(1), IMPORT(2);
        private final int value;

        Type(int value) {
            this.value = value;
        }

        public int value() {
            return this.value;
        }
    }

    enum ColumnType {
        NUMERIC(0), STRING(1), IMAGE(2);
        private final int value;

        ColumnType(int value) {
            this.value = value;
        }

        public int value() {
            return this.value;
        }
    }
}

3. 导出代码实现

controller层

	/**
     * 导出规则数据
     */
    @PostMapping("/export/{deviceId}")
    public void export(HttpServletResponse response, @PathVariable("deviceId") String deviceId) throws Exception {
        sysRuleAllService.exportRuleAllData(response, deviceId);
    }

service层

	/**
     * 导出规则数据
     */
    public void exportRuleAllData(HttpServletResponse response, String deviceId) throws Exception;

实现service:其中sysRuleMapper、sysRuleGroupMapper、sysRuleItemMapper各对应规则集合下面的三个数据集合。Header数组对应的在常量类中。根据业务自行实现。

/**
 * 规则数据常量类
 */
public class SysRuleConstants {

    //导出数据标题(对应三个Sheet工作表的表头,也就是三组数据表中的属性)
    public static final String[][] HEADERS = {{"序号", "规则描述"},
            {"id", "关联点表id", "组序号", "健康度"},
            {"关联规则组id", "项序号", "连接符", "规则项", "规则描述", "判断符", "条件"}};
    //标题占用行数(标题占用Sheet表的第1行,从0开始)
    public static final int TITLE_NUM = 0;
    //导入成功(失败)默认条数
    public static final int INIT_NUM = 0;
    //(这里是导入后返回的信息)
    //成功条数 
    private final int successCount;
    //失败条数
    private final int failureCount;

    public SysRuleConstants(int successCount, int failureCount) {
        this.successCount = successCount;
        this.failureCount = failureCount;
    }

    public int getSuccessCount() {
        return successCount;
    }

    public int getFailureCount() {
        return failureCount;
    }
}
 	/**
     * 导出规则数据
     *
     * @param response 响应对象
     * @param deviceId 设备Id
     * @throws Exception
     */
    @Override
    public void exportRuleAllData(HttpServletResponse response, String deviceId) throws Exception {
    	//这里根据实际情况导出想要的list数据,可导出多个list集合
        List<SysRule> ruleList = sysRuleMapper.selectSysRuleListByDeviceId(deviceId);
        List<SysRuleGroup> groupList = sysRuleGroupMapper.selectSysRuleGroupListByModeIdAndDeviceId(deviceId);
        List<SysRuleItem> itemList = sysRuleItemMapper.selectSysRuleItemListByGroupIdAndModeIdAndDeviceId(deviceId);

        //创建一个新的Excel文件
        Workbook workbook = new XSSFWorkbook();
        //在工作簿中创建三个工作表
        Sheet ruleSheet = workbook.createSheet("规则集数据");
        Sheet groupSheet = workbook.createSheet("规则组数据");
        Sheet itemSheet = workbook.createSheet("规则项数据");

        //调用方法写入数据(Header要对应导出的数据表头)
        ExcelUtil.writeDataToSheet(ruleSheet, ruleList, SysRuleConstants.HEADERS[0]);
        ExcelUtil.writeDataToSheet(groupSheet, groupList, SysRuleConstants.HEADERS[1]);
        ExcelUtil.writeDataToSheet(itemSheet, itemList, SysRuleConstants.HEADERS[2]);

        //设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");

        //写入输出流并关闭工作簿
        workbook.write(response.getOutputStream());
        workbook.close();
    }

至此,导出三组不同的数据到三个Sheet工作表中,并存放在同一个Excel文件下就完成了。

4. 导出Excel文件展示




导出文件存放在本地。现在以这个Excel文件为例进行导入操作。

5. 添加Excel导入方法

在Excel工具类中添加:多Sheet表转换list数据

	/**
     * 对excel表单指定表格索引名转换成list
     *
     * @param sheetName 表格索引名
     * @param titleNum  标题占用行数
     * @param is        输入流
     * @return 转换后集合
     */
    public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception {
        this.type = Type.IMPORT;
        this.wb = WorkbookFactory.create(is);
        List<T> list = new ArrayList<T>();
        // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
        Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0);
        if (sheet == null) {
            throw new IOException("文件sheet不存在");
        }
        boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
        Map<String, PictureData> pictures;
        if (isXSSFWorkbook) {
            pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb);
        } else {
            pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb);
        }
        // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1
        int rows = sheet.getLastRowNum();

        if (rows > 0) {
            // 定义一个map用于存放excel列的序号和field.
            Map<String, Integer> cellMap = new HashMap<String, Integer>();
            // 获取表头
            Row heard = sheet.getRow(titleNum);
            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
                Cell cell = heard.getCell(i);
                if (StringUtils.isNotNull(cell)) {
                    String value = this.getCellValue(heard, i).toString();
                    cellMap.put(value, i);
                } else {
                    cellMap.put(null, i);
                }
            }
            // 有数据时才处理 得到类的所有field.
            List<Object[]> fields = this.getFields();
            Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>();
            for (Object[] objects : fields) {
                Excel attr = (Excel) objects[1];
                Integer column = cellMap.get(attr.name());
                if (column != null) {
                    fieldsMap.put(column, objects);
                }
            }
            for (int i = titleNum + 1; i <= rows; i++) {
                // 从第2行开始取数据,默认第一行是表头.
                Row row = sheet.getRow(i);
                // 判断当前行是否是空行
                if (isRowEmpty(row)) {
                    continue;
                }
                T entity = null;
                for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) {
                    Object val = this.getCellValue(row, entry.getKey());

                    // 如果不存在实例则新建.
                    entity = (entity == null ? clazz.newInstance() : entity);
                    // 从map中得到对应列的field.
                    Field field = (Field) entry.getValue()[0];
                    Excel attr = (Excel) entry.getValue()[1];
                    // 取得类型,并根据对象类型设置值.
                    Class<?> fieldType = field.getType();
                    if (String.class == fieldType) {
                        String s = Convert.toStr(val);
                        if (StringUtils.endsWith(s, ".0")) {
                            val = StringUtils.substringBefore(s, ".0");
                        } else {
                            String dateFormat = field.getAnnotation(Excel.class).dateFormat();
                            if (StringUtils.isNotEmpty(dateFormat)) {
                                val = parseDateToStr(dateFormat, val);
                            } else {
                                val = Convert.toStr(val);
                            }
                        }
                    } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
                        val = Convert.toInt(val);
                    } else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
                        val = Convert.toLong(val);
                    } else if (Double.TYPE == fieldType || Double.class == fieldType) {
                        val = Convert.toDouble(val);
                    } else if (Float.TYPE == fieldType || Float.class == fieldType) {
                        val = Convert.toFloat(val);
                    } else if (BigDecimal.class == fieldType) {
                        val = Convert.toBigDecimal(val);
                    } else if (Date.class == fieldType) {
                        if (val instanceof String) {
                            val = DateUtils.parseDate(val);
                        } else if (val instanceof Double) {
                            val = DateUtil.getJavaDate((Double) val);
                        }
                    } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
                        val = Convert.toBool(val, false);
                    }
                    if (StringUtils.isNotNull(fieldType)) {
                        String propertyName = field.getName();
                        if (StringUtils.isNotEmpty(attr.targetAttr())) {
                            propertyName = field.getName() + "." + attr.targetAttr();
                        } else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
                            val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
                        } else if (StringUtils.isNotEmpty(attr.dictType())) {
                            val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
                        } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) {
                            val = dataFormatHandlerAdapter(val, attr);
                        } else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) {
                            PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey());
                            if (image == null) {
                                val = "";
                            } else {
                                byte[] data = image.getData();
                                val = FileUtils.writeImportBytes(data);
                            }
                        }
                        ReflectUtils.invokeSetter(entity, propertyName, val);
                    }
                }
                list.add(entity);
            }
        }
        return list;
    }

6. 导入代码实现

controller层

	/**
     * 导入规则数据
     */
    @PostMapping("/import/{deviceId}")
    public AjaxResult importRuleAllData(@RequestPart("file") MultipartFile file, @PathVariable String deviceId) throws Exception {
        ExcelUtil<SysRule> ruleExcelUtil = new ExcelUtil<>(SysRule.class);
        List<SysRule> ruleList = ruleExcelUtil.importExcel("规则集数据", file.getInputStream(), SysRuleConstants.TITLE_NUM);
        ExcelUtil<SysRuleGroup> groupExcelUtil = new ExcelUtil<>(SysRuleGroup.class);
        List<SysRuleGroup> groupList = groupExcelUtil.importExcel("规则组数据", file.getInputStream(), SysRuleConstants.TITLE_NUM);
        ExcelUtil<SysRuleItem> itemExcelUtil = new ExcelUtil<>(SysRuleItem.class);
        List<SysRuleItem> itemList = itemExcelUtil.importExcel("规则项数据", file.getInputStream(), SysRuleConstants.TITLE_NUM);
        String message = sysRuleAllService.importRuleAllData(ruleList, groupList, itemList, deviceId);
        file.getInputStream().close();
        return AjaxResult.success(message);
    }

service层

	/**
     * 导入规则数据
     */
    public String importRuleAllData(List<SysRule> ruleList, List<SysRuleGroup> groupList, List<SysRuleItem> itemList, String deviceId);

实现service

	/**
     * 导入规则数据
     *
     * @param ruleList  规则集列表
     * @param groupList 规则组列表
     * @param itemList  规则项列表
     * @param deviceId  设备Id
     * @return
     */
    @Override
    public String importRuleAllData(List<SysRule> ruleList, List<SysRuleGroup> groupList, List<SysRuleItem> itemList, String deviceId) {
        //规则集不能为空
        if (StringUtils.isNull(ruleList) || ruleList.size() == 0) {
            throw new ServiceException("导入的规则集不能为空!");
        }
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        //注意:这里根据实际业务处理,此处封装了导入成功或失败后的返回信息
        //规则集
        SysRuleConstants ruleResult = importRule(ruleList, deviceId, SysRuleConstants.INIT_NUM, SysRuleConstants.INIT_NUM, successMsg, failureMsg);
        //规则组
        SysRuleConstants groupResult = importGroup(groupList, deviceId, SysRuleConstants.INIT_NUM, SysRuleConstants.INIT_NUM, successMsg, failureMsg);
        //规则项
        SysRuleConstants itemResult = importItem(itemList, deviceId, SysRuleConstants.INIT_NUM, SysRuleConstants.INIT_NUM, successMsg, failureMsg);
        int successNum = ruleResult.getSuccessCount() + groupResult.getSuccessCount() + itemResult.getSuccessCount();
        int failureNum = ruleResult.getFailureCount() + groupResult.getFailureCount() + itemResult.getFailureCount();
        if (successNum > 0 && failureNum == 0) {
            successMsg.insert(0, "恭喜您,数据导入成功!共 " + successNum + " 条。");
            return successMsg.toString();
        }
        if (failureNum > 0 && successNum == 0) {
            throw new ServiceException("很抱歉,数据导入失败!共 " + failureNum + " 条。" + failureMsg.toString());
        }
        if (successNum > 0 && failureNum > 0) {
            failureMsg.insert(0, "部分数据已存在!共 " + failureNum + " 条。");
            successMsg.insert(0, "部分数据导入成功!共 " + successNum + " 条。");
            return failureMsg.toString() + "<br/>" + successMsg.toString();
        }
        return "没有数据被导入或处理";
    }

	//以下三个方法即:三组数据导入的逻辑处理,由于三组数据分开存放且三表有联系,此处分别处理数据。只参考导出导入方法可跳过。

    /**
     * 导入规则集
     *
     * @param ruleList       规则集数据
     * @param deviceId       设备Id
     * @param ruleSuccessNum 规则集成功条数
     * @param ruleFailNum    规则集失败条数
     * @param successMsg     成功信息
     * @param failureMsg     失败信息
     * @return
     */
    public SysRuleConstants importRule(List<SysRule> ruleList, String deviceId, int ruleSuccessNum, int ruleFailNum, StringBuilder successMsg, StringBuilder failureMsg) {
        for (SysRule sysRule : ruleList) {
            try {
                SysRule newSysRule = new SysRule();
                newSysRule.setDeviceId(deviceId);
                newSysRule.setOrderNum(sysRule.getOrderNum());
                newSysRule.setRuleDesc(sysRule.getRuleDesc());
                List<SysRule> sysRules = sysRuleMapper.selectSysRuleList(newSysRule);
                if (StringUtils.isNull(sysRules) || sysRules.size() == 0) {
                    sysRule.setDeviceId(deviceId);
                    sysRuleMapper.insertSysRule(sysRule);
                    ruleSuccessNum++;
                    successMsg.append("<br/>" + ruleSuccessNum + "条规则集 " + " 导入成功");
                } else {
                    ruleFailNum++;
                    failureMsg.append("<br/>" + ruleFailNum + "条规则集 " + " 已存在!");
                }
            } catch (Exception e) {
                ruleFailNum++;
                String msg = ("<br/>" + ruleFailNum + "条规则集 " + sysRule.getDeviceId() + " 导入失败:" + e.getMessage());
                failureMsg.append(msg + e.getMessage());
                LogUtils.getBlock(e);
            }
        }
        return new SysRuleConstants(ruleSuccessNum, ruleFailNum);
    }

    /**
     * 导入规则组
     *
     * @param groupList       规则组数据
     * @param deviceId        设备Id
     * @param groupSuccessNum 规则组成功条数
     * @param groupFailNum    规则组失败条数
     * @param successMsg      成功信息
     * @param failureMsg      失败信息
     * @return
     */
    public SysRuleConstants importGroup(List<SysRuleGroup> groupList, String deviceId, int groupSuccessNum, int groupFailNum, StringBuilder successMsg, StringBuilder failureMsg) {
        for (SysRuleGroup sysRuleGroup : groupList) {
            try {
                //重复导入判断:根据要导入的设备id取出group数据,比较这个数据和groupList是否相同
                List<SysRuleGroup> existGroupList = sysRuleGroupMapper.selectSysRuleGroupListByModeIdAndDeviceId(deviceId);
                //比较existGroupList和groupList是否相同,不比较id
                if (existGroupList.size() != 0 && existGroupList.size() == groupList.size()) {
                    for (SysRuleGroup existGroup : existGroupList) {
                        if (existGroup.equals(sysRuleGroup)) {
                            throw new ServiceException("规则组已存在!");
                        }
                    }
                    groupFailNum++;
                    failureMsg.append("<br/>" + groupFailNum + "条规则组 " + " 已存在!");
                } else {
                    //已经导入进去的规则集sysRule
                    List<SysRule> newSysRules = sysRuleMapper.selectSysRuleListByDeviceId(deviceId);
                    if (StringUtils.isNull(newSysRules) || newSysRules.size() == 0) {
                        throw new ServiceException("导入规则组失败,规则组对应的规则集不存在!");
                    } else {
                        /*
                            根据sysRuleGroup的modeId查询到旧的rule,再根据旧的rule的设备id,orderNum和ruleDesc查询到新的rule
                            然后取出新的rule的id作为新的group的modeId,其他数据不变,插入sys_rule_group表
                         */
                        SysRule oldSysRule = sysRuleMapper.selectSysRuleById(sysRuleGroup.getModeId());
                        if (StringUtils.isNull(oldSysRule)) {
                            throw new ServiceException("规则集不存在!");
                        }
                        SysRule newSysRule = sysRuleMapper.selectSysRuleByDeviceIdAndOrderNumAndDesc(deviceId, oldSysRule.getOrderNum(), oldSysRule.getRuleDesc());
                        if (StringUtils.isNotNull(newSysRule)) {
                            SysRuleGroup newGroup = new SysRuleGroup();
                            newGroup.setModeId(newSysRule.getId());
                            newGroup.setOrderNum(sysRuleGroup.getOrderNum());
                            newGroup.setHealth(sysRuleGroup.getHealth());
                            sysRuleGroupMapper.insertSysRuleGroup(newGroup);
                            groupSuccessNum++;
                            successMsg.append("<br/>" + groupSuccessNum + "条规则组 " + " 导入成功");
                        }
                    }
                }
            } catch (Exception e) {
                groupFailNum++;
                String msg = ("<br/>" + groupFailNum + "条规则组,导入失败:" + e.getMessage());
                failureMsg.append(msg + e.getMessage());
                LogUtils.getBlock(e);
            }
        }
        return new SysRuleConstants(groupSuccessNum, groupFailNum);
    }

    /**
     * 导入规则项
     *
     * @param itemList       规则项数据
     * @param deviceId       设备Id
     * @param itemSuccessNum 规则项成功条数
     * @param itemFailNum    规则项失败条数
     * @param successMsg     成功信息
     * @param failureMsg     失败信息
     * @return
     */
    public SysRuleConstants importItem(List<SysRuleItem> itemList, String deviceId, int itemSuccessNum, int itemFailNum, StringBuilder successMsg, StringBuilder failureMsg) {
        for (SysRuleItem sysRuleItem : itemList) {
            try {
                //已经导入进去的规则组sysRuleGroup
                List<SysRuleGroup> newSysRuleGroups = sysRuleGroupMapper.selectSysRuleGroupListByModeIdAndDeviceId(deviceId);
                if (StringUtils.isNull(newSysRuleGroups) || newSysRuleGroups.size() == 0) {
                    throw new ServiceException("导入规则项失败,规则组对应的规则组不存在!");
                } else {
                    /*
                        根据sysRuleItem的groupId查询对应的旧的group,再根据旧的group的modeId查询对应的旧的rule
                        然后根据设备id和旧的rule的orderNum和ruleDesc找到新的rule,取出新的rule的id(即新插入的group的modeId)
                        根据rule的新id(新的group的modeId)对应的新的group(这个新的group可能是多个)
                        根据旧的group的modeId查询所有的旧的group列表,根据新的rule的id查询出新的group列表
                        遍历两个group列表,如果旧的group的id和item的groupId一样,sysRuleItem的groupId设置为对应的新的group的id
                        其他数据不变,然后查询新sysRuleItem数据列表,没有的话插入
                     */
                    SysRuleGroup oldSysRuleGroup = sysRuleGroupMapper.selectSysRuleGroupById(sysRuleItem.getGroupId());
                    if (StringUtils.isNull(oldSysRuleGroup)) {
                        throw new ServiceException("规则组不存在!");
                    }
                    SysRule oldSysRule = sysRuleMapper.selectSysRuleById(oldSysRuleGroup.getModeId());
                    if (StringUtils.isNull(oldSysRule)) {
                        throw new ServiceException("规则不存在!");
                    }
                    SysRule newSysRule = sysRuleMapper.selectSysRuleByDeviceIdAndOrderNumAndDesc(deviceId, oldSysRule.getOrderNum(), oldSysRule.getRuleDesc());
                    if (StringUtils.isNull(newSysRule)) {
                        throw new ServiceException("导入后的规则不存在!");
                    }
                    List<SysRuleGroup> oldGroups = sysRuleGroupMapper.selectSysRuleGroupByModeId(oldSysRuleGroup.getModeId());
                    List<SysRuleGroup> newGroups = sysRuleGroupMapper.selectSysRuleGroupByModeId(newSysRule.getId());
                    Iterator<SysRuleGroup> oldGroupIterator = oldGroups.iterator();
                    Iterator<SysRuleGroup> newGroupIterator = newGroups.iterator();
                    while (oldGroupIterator.hasNext() && newGroupIterator.hasNext()) {
                        SysRuleGroup oldGroup = oldGroupIterator.next();
                        SysRuleGroup newGroup = newGroupIterator.next();
                        if (Objects.equals(oldGroup.getId(), sysRuleItem.getGroupId())) {
                            SysRuleItem newRuleItem = new SysRuleItem();
                            newRuleItem.setGroupId(newGroup.getId());
                            newRuleItem.setOrderNum(sysRuleItem.getOrderNum());
                            newRuleItem.setConcat(sysRuleItem.getConcat());
                            newRuleItem.setItem(sysRuleItem.getItem());
                            newRuleItem.setDesc(sysRuleItem.getDesc());
                            newRuleItem.setComparison(sysRuleItem.getComparison());
                            newRuleItem.setConditionType(sysRuleItem.getConditionType());
                            List<SysRuleItem> existItemList = sysRuleItemMapper.selectSysRuleItemList(newRuleItem);
                            if (StringUtils.isNull(existItemList) || existItemList.size() == 0) {
                                sysRuleItemMapper.insertSysRuleItem(newRuleItem);
                                itemSuccessNum++;
                                successMsg.append("<br/>" + itemSuccessNum + "条规则项 " + " 导入成功");
                            } else {
                                itemFailNum++;
                                failureMsg.append("<br/>" + itemFailNum + "条规则项 " + " 已存在!");
                            }
                        }
                    }
                }
            } catch (Exception e) {
                itemFailNum++;
                String msg = ("<br/>" + itemFailNum + "条规则项,导入失败:" + e.getMessage());
                failureMsg.append(msg + e.getMessage());
                LogUtils.getBlock(e);
            }
        }
        return new SysRuleConstants(itemSuccessNum, itemFailNum);
    }

至此,导入功能完成。导入的数据可一一对应,即成功导入。

其中,主要以Excel工具类的数据写入不同工作表、多表转换数据为主。

完~

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值