数据分类分级 数据识别-excel分类分级模版文件导入、解析

这篇具有很好参考价值的文章主要介绍了数据分类分级 数据识别-excel分类分级模版文件导入、解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前面讲了数据分类分级 数据识别-实现部分敏感数据识别,本次针对模版导入展开,excel导入采用的是easyexcel


数据分类分级 数据识别-excel分类分级模版文件导入、解析

上面图片是AI创作生成!如需咒语可私戳哦!

easyexcel介绍

之前的excel导入解析采用的是Apache poi,但是在Java领域解析、生成Excel比较有名的框架如Apache poi,jxl等,在使用的时候,存在一个严重的问题,就是非常的耗内存,如果系统并发量不大的话,可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的垃圾回收。

EasyExcel官网

EasyExcel是阿里巴巴开源的一个excel处理框架,他具有使用简单,节省内存的特点,EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析的,这一特点待会在读取excel数据的时候也会体现出来。

gpt生成的介绍
数据分类分级 数据识别-excel分类分级模版文件导入、解析

easyexcel实战

添加依赖

			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>easyexcel</artifactId>
				<version>2.2.6</version>
			</dependency>

读取数据

easyexcel读取文件数据需要设置监听器,通过实现监听器,就可以实现数据的单行读取操作, 以下面的这个数据对象为例:

/**
 * 分类分级模版数据TemplateData
 */
@Data
public class TemplateData {
    @ExcelProperty(value="一级分类",index = 0)
    private String firstClass;

    @ExcelProperty(value="一级分类描述",index = 1)
    private String firstClassDesc;

    @ExcelProperty(value="一级分类",index = 2)
    private String secondClass;

    @ExcelProperty(value="一级分类描述",index = 3)
    private String secondClassDesc;

    @ExcelProperty(value="一级分类",index = 4)
    private String thirdClass;

    @ExcelProperty(value="一级分类描述",index = 5)
    private String thirdClassDesc;

    @ExcelProperty(value="一级分类",index = 6)
    private String fourthClass;

    @ExcelProperty(value="一级分类描述",index = 7)
    private String fourthClassDesc;
}

读取的数据内容如下示例:
数据安全-数据分类分级-国民经济行业数据分类模版.xlsx
数据分类分级 数据识别-excel分类分级模版文件导入、解析

监听器的实现

在读取excel数据的时候,需要实现AnalysisEventListener监听器,其中需要传入对应的数据类型,在该监听接口中,主要使用的方法是:

  • invoke:一行一行读取,每读取一行数据时就会调用该方法。
  • invokeHeadMap:读取表头数据,
  • doAfterAllAnalysed:所有数据读取完毕之后调用,一般用于对最后读取到的数据进行处理。
  • onException:在转换异常,获取其他异常的情况下会调用此接口,抛出异常就停止读取,如果不抛出异常就继续读取

接口的实现如下:
代码中会包含一些业务数据,如果可以结合上面的模版来看下面的代码可能会更好理解

/**
 * 读取excel,设置监听器
 */
@Slf4j
public class TemplateDataListener extends AnalysisEventListener<TemplateData> {

    /**
     * 定义一个存储的界限,每读取BATCH_COUNT条数据就存储一次数据库,防止数据过多时发生溢出
     * 存储完成之后就清空list重新读取新的数据,方便内存回收
     */
    private static final int BATCH_COUNT = 800;
    /**
     * 定义一个数据存储缓存,用于临时存储sql数据
     */
    public List<String> cacheSqlList = new ArrayList<>();

    String firstClass = null;
    String secondClass = null;
    String thirdClass = null;
    String firstClassId = null;
    String secondClassId = null;
    String thirdClassId = null;
    String fourthClassId = null;
    private List<String> repeatClassList = new ArrayList<>();
    private List<String> templateClassList = new ArrayList<>();

    private final DataSource dataSource;
    private final String templateId;

    public TemplateDataListener(DataSource dataSource, String templateId) {
        this.dataSource = dataSource;
        this.templateId = templateId;
    }


    @Override
    public void invoke(TemplateData templateData, AnalysisContext analysisContext) {

        if (null != templateData) {
        //这里是因为存在分类跨行的数据,但是入库每一行都需要有父分类
            firstClass = null == templateData.getFirstClass() ? firstClass : templateData.getFirstClass();
            secondClass = null == templateData.getSecondClass() ? secondClass : templateData.getSecondClass();
            thirdClass = null == templateData.getThirdClass() ? thirdClass : templateData.getThirdClass();


            firstClassId = null == templateData.getFirstClass() ? firstClassId : CommonUtil.generateClassifyId();
            secondClassId = null == templateData.getSecondClass() ? secondClassId : CommonUtil.generateClassifyId();
            thirdClassId = null == templateData.getThirdClass() ? thirdClassId : CommonUtil.generateClassifyId();
            fourthClassId = CommonUtil.generateClassifyId();
            if (null != firstClass && (firstClass.length() > 30 || firstClass.contains("(") || firstClass.contains(")"))) {
                log.info("#####:" + firstClass);
            }
            if (null != secondClass && (secondClass.length() > 30 || secondClass.contains("(") || secondClass.contains(")"))) {
                log.info("#####:" + secondClass);
            }
            if (null != thirdClass && (thirdClass.length() > 30 || thirdClass.contains("(") || thirdClass.contains(")"))) {
                log.info("#####:" + thirdClass);
            }
            if (null != templateData.getFourthClass() && (templateData.getFourthClass().length() > 30 || templateData.getFourthClass().contains("(") || templateData.getFourthClass().contains(")"))) {
                log.info("#####:" + templateData.getFourthClass());
            }

            log.info("invoke :" + templateData + ", firstClassId:" + firstClassId + ", secondClassId:" + secondClassId + ", thirdClassId:"+ thirdClassId + ", fourthClassId:" + fourthClassId);
            saveData(templateData, firstClassId, secondClassId, thirdClassId, fourthClassId, templateId);

            /**
             * 如果当前缓存列表中的数据等于指定值,就存储
             */
            if (cacheSqlList.size() > BATCH_COUNT) {
                log.info("保存数据到数据库: " + cacheSqlList.size());
                runSql();
            }
        }

    }

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        log.info("表头:" + headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("将最后的数据存储到数据库-cacheSqlList:" + cacheSqlList.size());
        runSql();
        log.info("读取结束,共有分类:" + templateClassList.size());
        if (repeatClassList.size() > 0) {
            log.info("存在重复分类名称:" + repeatClassList);
        }
        cacheSqlList.clear();
    }

    private void runSql() {
        Connection connection = null;
        Statement statement = null;
        try {
            connection = dataSource.getConnection();
            statement = connection.createStatement();
            for (String sql : cacheSqlList) {
                statement.executeUpdate(sql);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw DatabaseErrorCodeEnum.CONNECT_DATABASE_ERROR.newException();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
                throw DatabaseErrorCodeEnum.CONNECT_DATABASE_ERROR.newException();
            }
        }
        //清空缓存列表重新读取
        cacheSqlList.clear();
    }

    /**
     * 在转换异常,获取其他异常的情况下会调用此接口,
     * 抛出异常就停止读取,如果不抛出异常就继续读取。
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {

        if (exception instanceof ExcelDataConvertException){
            ExcelDataConvertException e = (ExcelDataConvertException) exception;
            log.info("数据解析异常,所在行: " + e.getRowIndex() + ", 所在列: " + e.getColumnIndex() + ", 数据是:" + e.getCellData());
        } else {
            log.info("解析失败,但是继续解析下一行:" + exception.getMessage() + ", exception:" + exception.toString());
        }
    }


    /**
     * 将数据存储到持久层
     */
    private void saveData(TemplateData templateData, String firstClassId, String secondClassId, String thirdClassId, String fourthClassId, String templateId) {
        if (null != templateData.getFirstClass()) {
            //检查是否存在重复名称的分类名称
            checkRepeatClass(templateData.getFirstClass());
            //生成sql放入缓存
            String sql = getSql(null == templateData.getSecondClass(), 1L, templateId, templateId, firstClassId, templateData.getFirstClass(), templateData.getFirstClassDesc());
            cacheSqlList.add(sql);
        }
        if (null != templateData.getSecondClass()) {
            checkRepeatClass(templateData.getSecondClass());

            String sql = getSql(null == templateData.getThirdClass(), 2L, templateId, firstClassId, secondClassId, templateData.getSecondClass(), templateData.getSecondClassDesc());
            cacheSqlList.add(sql);
        }
        if (null != templateData.getThirdClass()) {
            checkRepeatClass(templateData.getThirdClass());

            String sql = getSql(null == templateData.getFourthClass(), 3L, templateId, secondClassId, thirdClassId, templateData.getThirdClass(), templateData.getThirdClassDesc());
            cacheSqlList.add(sql);
        }
        if (null != templateData.getFourthClass()) {
            checkRepeatClass(templateData.getFourthClass());

            String sql = getSql(true, 4L, templateId, thirdClassId, fourthClassId, templateData.getFourthClass(), templateData.getFourthClassDesc());
            cacheSqlList.add(sql);
        }

    }

    private void checkRepeatClass(String classifyName) {
        if (templateClassList.contains(classifyName)) {
            repeatClassList.add(classifyName);
        }
        templateClassList.add(classifyName);
    }

    private String getSql(boolean leaf,Long level, String templateId, String parentClassifyId, String classifyId, String classifyName, String classifyDesc) {
        long timestamp = System.currentTimeMillis();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = simpleDateFormat.format(new Date(timestamp));
        return "INSERT INTO `template_classify` (`leaf`, `level`, `classify_template_id`, `parent_classify_id`, `classify_id`, `classify_name`, `classify_desc`, `rule_id`, `is_built_in`, `extra`, `create_time`, `last_modified_time`)" +
                " VALUES(" + leaf + "," + level + ",'" + templateId + "','" + parentClassifyId + "','" + classifyId + "','" + classifyName + "','" + classifyDesc + "',NULL" + "," + 1 + ",'','" + date + "','" + date + "'" + ")";
    }
}

数据读取方法

接口实现完毕之后,进行数据读取的方法其实是非常简单,只需要一句代码就可以了,

读取如下:

    /**
     * 从excel中读取全部工作表的数据
     * dataSource, templateId和都业务需要的数据,如果没有可以删除
     */
    private void readAllSheetDataForExcel(String path, String templateId) {
        /**
         * 主要是doReadAll()方法
         */
        EasyExcel.read(path, TemplateData.class, new TemplateDataListener(dataSource, templateId)).sheet().doRead();
    }

读取结果

数据分类分级 数据识别-excel分类分级模版文件导入、解析
查看数据库
数据分类分级 数据识别-excel分类分级模版文件导入、解析
数据分类分级 数据识别-excel分类分级模版文件导入、解析的操作就到这里,如果有不解或需要帮助的,欢迎讨论!文章来源地址https://www.toymoban.com/news/detail-454807.html

到了这里,关于数据分类分级 数据识别-excel分类分级模版文件导入、解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue+xlsx实现前端模版下载、导入和导出excel文件

    产品需求:后端不想写下载,导入和导出的接口,让我们前端自己实现。 这里我们就可以用xlsx插件来实现,我们不多说了,先放一下实现的图片,下面我们分别把模版下载、导入和导出的代码放上来,想用的话,直接复制粘贴即可! 模版下载图片 导出图片: 好了,下面我

    2024年02月13日
    浏览(61)
  • 如何使用Vue实现Excel表格数据的导入,在前端实现Excel表格文件的上传和解析,并使用Table组件将解析出来的数据展示在前端页面上

    随着互联网的发展和社会的进步,各个行业的数据量越来越大,对于数据的处理变得越来越重要。其中,Excel表格是一种重要的数据处理工具。在前后端项目中,实现Excel表格的导入和导出功能也愈加常见。这篇文章将介绍如何使用Vue实现Excel表格数据的导入。 在开始介绍实现

    2024年02月11日
    浏览(66)
  • 直接发文!1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序!Excel导入,直接运行

    ​适用平台:Matlab2023版本及以上 本程序同时结合两篇国内顶级EI的方法:提出1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序! ①中文EI期刊《电力自动化设备》12月29号网络首发文献:《基于格拉姆角场与并行CNN的并网逆变器开关管健康诊断》; ②中文EI期刊《电

    2024年01月20日
    浏览(62)
  • 账户风险监测系统精准识别可疑情形 账户分类分级管理保障安全

    近年来,不法分子利用银行机构的网络安全漏洞批量开立个人Ⅱ、Ⅲ类虚假账户,并以虚假账户为鉴权源,在其他银行机构继续开立Ⅱ、Ⅲ类虚假账户,利用所开立的虚假账户从事“薅羊毛”“假冒客户登录并盗取第三方支付平台资金”“兜售虚假账户信息”“诈骗”“洗钱

    2024年04月11日
    浏览(44)
  • 数据治理:数据的分类分级指南

    — 01  —    什么是数据分类分级? 数据分类分级是数据安全治理领域的一个专业名词,从名字上就能看出这个名词其实包含了两部分的内容: 第一,数据分类 数据分类是数据资产管理的第一步 ,不论是对数据资产进行编目、标准化,还是数据的确权、管理,亦或是提供数

    2024年02月15日
    浏览(46)
  • 【转】数据的分类分级简介

    原文链接:https://blog.csdn.net/watson2017/article/details/126388340 1、数据分类分级实施标准 2021年12月31号,全国信息安全标准化技术委员会秘书处发布了《网络安全标准实践指南——网络数据分类分级指引》,给出了数据分类分级的原则、框架和方法。 2、数据分类分级定义 数据分类

    2024年02月15日
    浏览(43)
  • 数据分类分级产品,一文详解

    前言 1、产品介绍 2、技术原理 3、业务流程 4、部署方式   4.1常规部署   4.2docker镜像部署 5、产品主要功能   5.1数据资产扫描   5.2敏感数据自动发现   5.3数据分类分级管理   5.4分类分级结果导出 6、产品价值 7、安全服务 8、技术发展趋势   8.1具备机器学习和数据挖掘技术

    2024年02月09日
    浏览(47)
  • 【转】数据分类分级产品工具

    原文链接:https://blog.csdn.net/weixin_52069830/article/details/124553895 前言 数据分类分级,作为数据安全治理的基础和首要工作,重要性无需赘言,关于数据分类分级的解决方案请看金融数据安全分类分级解决方案,可以了解下整体思路和基本概念。 《数据安全法》、《个人信息保护

    2024年02月03日
    浏览(34)
  • 大数据的分类分级管理

            为了公司给的师带徒,为培训写点材料。让徒弟做事情要有章法,有行业视野,知道方向和资料从哪里去找。         要管理企业的大数据,从什么地方开始呢?首先应该完成企业数据的分类、分级,或者参考分类去找出企业相关的数据条目。         作为工业企

    2024年03月14日
    浏览(119)
  • 什么是数据分类分级?

    自《数据安全法》明确对数据实行分类分级保护后,国家和地方都在加紧该项工作的进行。据行业专家透露,目前国家标准《信息安全技术重要数据识别指南》已经到送审稿阶段,而国标《信息安全技术重要数据处理安全要求》也已完成草稿,正在立项过程之中。梳理发现,

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包