设计excel导入的思考

news2024/10/23 19:21:41

excel导入就是将excel里面的数据转换组织形式,对数据库表进行映射更改

导入的开始——内容读取与解析

重点看解析,解析的关键在于如何找到所需要的字段内容,可以通过以下方法

  • 表头名:通过表头名定位字段数据所在
  • 位置:事先确定好每个字段所在的位置

个人更为倾向于通过位置的方式。位置不需要考虑表头名的格式处理,而且更为清晰与明确,比表头名更加稳定。表头名可能被被改,而位置即使被改,也很容易调整回来


用户侧,应提供Excel内容映射对象。这样的对象既可以以结构体形式展现,也可以以位置、表头名映射阐明

事先正确性校验

在开始导入之前必须确定excel各行各列与预期数据类型、范围、必要性吻合

分类来说,对于通用型校验,比如对于年龄,那就是应该是数字;对于邮箱,那应该就要符合邮箱格式。那么对这些通用型,可以通过比如tag指明存在的校验方法

而对于特殊业务类的,便提供相应切面,让用户注册校验方法

开发者视角——excel即二维数组

二维数组能构建什么关系呢?

  • 一组无关联关系的一维数组
  • 树结构

一般而言就是一维数组与树

关系如何映射

一维数组

从一组一维数组的角度出发,最简单的情况其实是excel与数据表的一一对应

当然,实际情况很少有这么简单的,总是会存在

  • excel多些字段:直接忽略多的就好
  • 要自动生成内容的情况:按照情况生成
  • excel与数据库表并不一一对应:为每一行定义行类型,根据行类型进行导入
  • 与其他Excel存在关联关系:创建唯一id进行匹配关联
树结构

树必须要考虑到数据表的树实现

  • 邻接表模型:通过父节点id进行关联
  • 路径枚举:将所有路径,比如1/5/9全部记录下来
  • 嵌套集合:类似于线段树,每个节点记录其范围。比如lft、rgt记录范围,只要在这个范围的就是该节点的子节点
  • 闭包表模型:使用一个辅助表来记录节点之间的所有祖先-后代关系

一般而言只有临接表模型,因此本设计暂只考虑该模型

基于临接表模型的Excel形式可以有以下几种

  • 与临接表模型一致对应:这种最简单的,最多处理下唯一键转为数据库表id

  • 列出所有路径:每一列对应树的一层,通过节点或者节点路径去唯一确定。

    一般由上至下进行导入

  • 列出所有父子关系:就是一列父节点,一列子节点,然后列举出所有这种父子关系

    1. 获取所有节点
    2. 根据父子关系,将子节点加入到父节点中
    3. 当所有父子关系都完成之后,树也建立完成
  • 嵌套集合:一般也不会用这种格式的,但这种格式的好处就是不需要额外多余的父关系

    1. 按节点start升序,节点end降序排序。那么这样保证了父节点一定在子节点前面
    2. 建立虚拟根节点,并加入栈中
    3. 遍历排序后的节点,若当前节点不在不在栈顶的节点范围内,说明栈顶元素不再有子节点了,出栈
    4. 将当前节点作为当前栈顶节点的子节点
    5. 入栈当前节点
  • 模拟树形:就是在Excel中模拟树的结构

    按照层级一层层进行构建


总而言之,无论是一维数组,还是树的导入,都是将excel形式转为为抽象数据结构的过程

导入——用户侧的实现

从用户侧来看,框架开放Excel解析、校验、处理之后的导入点,那么用户可在该导入点进行数据转换与实质导入工作。

比如在传入Excel映射对象,之后用户侧切入点便将之转换为数据库表对象,然后新增到数据库中

事后正确性校验

对于一个框架能做的有

对于数据增减

  • 数据数量增减差异检验
  • 偏移量部分数据校验

对于数据更新

  • 根据主键部分数据校验

对于关联型校验

  • 简单资源管理型:即资源管理表直接连接多具体资源表

    需要校验的:是否能连接到对应具体资源表、资源表数量是否正确

  • 简单树型:即内容挂在叶节点上

    需要检验的:叶节点下是否含有目标内容

当然更关键的是对excel生产格式进行规范,使尽可能将格式更适合于导入

中间件

考虑到实际场景

  • 导入输出依然Excel
  • 导入输出为sql文件

那么便可以在框架上支持中间件功能,那么就可以支持多样化的场景需要

具体而言,中间件可提供以下切面

  • 校验之后,导入之前
  • 单行、单节点数据导入之后
  • 全部数据导入之后

例如对于输出sql文件的中间件,便可以在单行、单节点数据导入之后,使用方便可传输转换之后的表结构,然后交予中间件去生成sql语句。在全部数据导入之后,将所有生成的sql语句写入文件中

特性

对于excel导入框架存在一些应该本身具有的特性,那么这些特性是可以直接配置是否使用、如何使用

比如

  • 批量导入
  • 并发导入
  • 输出进度
  • 存在部分可跳过行数据

在实现上,仍然可以利用中间件的接口,在各个切面支撑功能

例如对于进度输出特性,便可以在校验之后,导入之前获取总数据量,然后单行、单节点数据导入之后汇报当前进度信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 设置网页的背景图片

背景 最近正好在写一个个人博客网站“小石潭记”,需要一张有水,有鱼的图片。正好玩原神遇到了类似场景,于是截图保存,添加到网站里面。以下是效果图: css 写个class,加到整个网页的body上 .bodyBg {ba…

接口测试 —— 如何测试加密接口?

接口加密是指在网络传输过程中,将数据进行加密,以保护数据的安全性。接口加密可以采用多种加密算法,如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。以下是一些详细的测试方法和注意事项: 接口加密字…

A-【项目开发知识管理】Android AIDL跨进程通信

Android AIDL跨进程通信 文章目录 Android AIDL跨进程通信0.我为啥要写这篇文章1.AIDL是干啥的?1.1简述1.2官方话 2.在AndroidStudio中怎么干?2.1准备工作2.2在项目A中创建AIDL文件夹2.3在项目A中创建一个aidl文件2.4将项目A进行一次Rebuild操作2.5在项目…

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中,如何规划自己的学习路线,才能在毕业时脱颖而出,成为行业的佼佼者呢? 第一学年:基础知识的奠基 1.1 课程安排 在大学的第一年,重…

超详解C++类与对象(下)

目录 1. 初始化列表 1.1. 定义 2.2. 注意 2. 隐式类型转换 2.1. 内置类型 2.2. 自定义类型 2.3. explicit关键字 3.类的静态成员 2.1. 定义 2.2. 注意 4.const成员函数 5. 友元 5. 1友元函数 5.2. 友元类 6. 内部类 6.1. 定义 6.2. 注意 7. 匿名对象 7…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长,话来说长。前些天我投了一些日常实习的简历,结果足足等了两个礼拜才收到面试通知,看来如今的行情确实是挺紧张的。当时我是满怀信心去的,心想这次一定要好好拷打面试官一番,结果没想到,自我…

一、python基础

python基础 认识Python1. Python介绍1.1 为什么学习Python1.2 Python发展历史 2. 语言分类简介2.1 编译型2.2 解释型 Python环境搭建1. Python 解释器1.1 Python解释器下载1.2 Python解释器安装 2. 解释器运行Python脚本2.1 演练步骤 PyCharm1. PyCharm介绍2. PyCharm安装3. Py…

15分钟学Go 第6天:变量与常量

第6天:变量与常量 在Go语言中,变量和常量是编程的基础概念。理解如何定义和使用它们不仅能帮助我们管理数据,还能增强代码的可读性和可维护性。在本章中,我们将详细探讨Go语言中的变量和常量,涵盖它们的定义、使用、作…

机器学习建模分析

机器学习 5.1 机器学习概述5.1.1 机器学习与人工智能5.1.2 python机器学习方法库 5.2 回归分析5.2.1 回归分析原理5.2.2 回归分析实现 5.3 分类分析5.3.1 分类学习原理5.3.2 决策树5.5.3 支持向量机 5.4 聚类分析5.4.1 聚类任务5.4.2 K-means算法 5.5 神经网络和深度学习5.5.1神…

python配合yolov11开发分类训练软件

上一篇文件写了用yolo分类模型开发分类软件,这边文章在上个分类软件的基础上加入训练功能环境配置:pycharm,PySide6 6.6.1 ,PySide6-Addons 6.6.1,PySide6-Essentials 6.6.1,torch 2.3.1cu121,torchaudio 2…

dynadot设置域名动态DNS(DDNS)

需求:本地测试代理,代理需要绑定IP或者域名,本地IP是动态变化的,解决办法就是给域名设置动态DNS 1.dynadot设置 开启动态DNS选项会显示动态DNS密码,该密码后续将会用在DDNS-GO工具上 2.DDNS-GO设置 GitHub介绍页面&a…

WIFI、NBIOT、4G模块调试AT指令连接华为云物联网服务器(MQTT协议)

一、前言 随着物联网(IoT)技术的飞速发展,越来越多的设备开始连接到互联网,形成了一个万物互联的世界。在这个背景下,设备与云端之间的通讯变得尤为重要。 本文将探讨几种常见的无线通信模块——EC20-4G、Air724ug-4…

每天花2分钟学数字化转型,第四讲:数字化转型

一文看懂:数字化转型是什么?以及数字化转型的根本任务与核心路径。 定义:数字化是人类社会的进化,绝不仅仅是一个企业的问题,也不是某一项技术的问题,而是时代的变迁。数字化转型指的是从当前信息化环境下…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…

企业级 接口自动化测试框架:Pytest+Allure+Excel

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…

MySQL 【日期】函数大全(七)

目录 1、UNIX_TIMESTAMP() 将指定的日期/日期时间转为 UNIX 时间戳值。 2、WEEK() 返回给定日期位于当年的第几周。 3、WEEKDAY() 返回给定日期的工作日编号。 4、WEEKOFYEAR() 返回给定日期位于当年的第几周 5、YEAR() 提取日期的年份部分并作为数字返回。 6、YEARWEEK()…

Jmeter 实战 JDBC配置

​ JDBC JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API。通过这个API,可以直接连接并执行SQL脚本,与数据库进行交互。 使用JMeter压力测试时,操作数据库的场景 在使用JMeter进行接口压力测试时…

Gin 协程mysql客户端

一、Gin框架 mysql配置 这里选择yaml文件配置 二、配置读取 viper 读取yaml文件中对应配置 三、mysql 的协程客户端 文件位置 package databaseimport ("database/sql""fmt""github.com/spf13/viper""log""net/http"&quo…

JavaWeb 25.Vite

目录 一、Vite的介绍 二、Vite创建Vue3工程化项目 ViteVue3项目的创建、启动、停止 创建 启动 停止 干净感来源于对自我的驯服 —— 24.10.23 一、Vite的介绍 在浏览器支持 ES 模块之前,JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们…

Missing classes detected while running R8报错解决方案

Android 打包release版本时报错如下: > Task :printlib:minifyReleaseWithR8 FAILED AGPBI: {"kind":"error","text":"Missing classes detected while running R8. Please add the missing classes or apply additional ke…