需求

最近有一个需求,要实现一个无限级结构的树型菜单,差不多长下面这个样子

我们知道无限级实现思路都是用一个parent_id将各种层级串联起来,顶级的parent_id为0,例如如下层级的菜单

例如

菜单一
菜单二
菜单三
菜单四
菜单五
菜单六
菜单七
菜单八

在数据库中的存储一般是如下形式



会记录每一个菜单的父级ID(parent_id)和层级(level)

问题来了,一般这样的结果要是一条一条插入,再用parent_id串起来,太反人类了,低效!

产品会让工程师通过表格导入这样的数据,表格差不多都长如下这个样子

我们需要用过代码来实现生成上面数据库的结果,talk is cheap, show you the code

实现

func ImportMenus() (res interface{}, err error) {
columns := 5 //支持的无限级菜单数量,想支持多少级写多少
templateFile := "/Users/chenqionghe/Downloads/menus.xlsx" //导入的表格路径
f, err := excelize.OpenFile(templateFile) //读取表格
if err != nil {
return nil, err
}
rows, err := f.GetRows("Sheet1")
if err != nil {
return nil, err
}
var allRowIds = make([][]int, len(rows)) //初始化保存ID的数组,通过下标定位对应菜单生成的ID
for i, _ := range rows {
allRowIds[i] = make([]int, columns)
}
var parentId int
tx := db.DB().Begin()
exception.Block{
Try: func() {
for i, row := range rows {
if i == 0 { //表头跳过
continue
}
//构造无限级菜单
for j := 0; j < columns; j++ {
if row[j] == "" { //空值不操作
continue
}
if j == 0 && row[j] != "" { //顶级按钮父级ID是0
parentId = 0
}
if j > 0 { //非顶级,向前或向上寻找最近的父级ID
if allRowIds[i][j-1] != 0 {
parentId = allRowIds[i][j-1] //向前找ID作为父级ID
} else {
for z := i - 1; z > 0; z-- {
if allRowIds[z][j-1] != 0 {
parentId = allRowIds[z][j-1] //向上找ID作为父级ID
break
}
}
}
}
newData := &model.Menu{Name: row[j], ParentID: parentId, Level: j + 1}
if err = tx.Save(newData).Error; err != nil { //菜单插入数据库
panic(err)
} allRowIds[i][j] = newData.ID //保存当ID到数组对应数组下标中,供后续菜单作为父级ID使用
}
}
tx.Commit()
err = nil
},
Catch: func(e interface{}) {
tx.Rollback()
err = fmt.Errorf("err: %v", e)
},
}.Do()
return allRowIds, err
}

测试

简单例子

我们来测试一下导入上面的表格

运行结果如下



可以看到,结果和我们设想的数据库结果完全一样!

复杂例子

好,我们再一测试一个更复杂的例子,表格模板如下



导入的结果如下

这样就用Go实现了一个支持无限级菜单的表格导入,以上代码由chenqionghe提供,转载请标明出处,giao~

Go语言实现excel导入无限级菜单结构的更多相关文章

  1. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  2. window、linux安装jdk,excel 导入oracle,WebService,window 端口查看,svn服务安装,oracle用户解锁

    内存泄露分析插件http://download.eclipse.org/mat/1.3/update-site/birt插件http://download.eclipse.org//birt/upda ...

  3. 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

    做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...

  4. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

  5. (转)高效的将excel导入sqlserver中

    大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了.很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClie ...

  6. 安全的将excel导入sqlite3的解决方案

    最近在做一个小项目时,需要把一个excel中的数据保存到sqlite3数据库中以备后用,表中有字符也有数字,要用到特定的数据类型方便后续使用,参照网上的方法,将excel文件转换为csv文件后,在导入 ...

  7. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  8. SNF开发平台WinForm之十-Excel导入-SNF快速开发平台3.3-Spring.Net.Framework

    7.1运行效果: 2.Excel导入开发实现 2.1. 创建窗体,修改命名空间 新增的窗体命名“FrmImport表名”,这个导入窗口比较其它窗口会特殊一些,需要继承BaseFormImport父级窗 ...

  9. 将excel导入mysql(使用navicat)

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

随机推荐

  1. 笔记之Utility.DataAccess

    挤出时间看了一些代码,做一些笔记,备忘!!! 现在ORM随处可见,为什么不要已有的ORM而要手动写SQL呢?这肯定是有因为滴,存在必合理嘛! 自认为关于性能.维护.Maybe还有其他的,欢迎大家拍砖! ...

  2. C# 面试前的准备_基础知识点的回顾_02

    1.数据库的范式 这算入门问题了吧,但凡是个数据库类的,都得问吧, 但我们在回答的时候开始背书啦 第一范式(1NF)无重复的列 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 第三范 ...

  3. npm install各种命令模式

    npm install 几种命令模式: npm install moduleName 安装模块到项目目录下 npm install -g moduleName npm install -g 将模块安装 ...

  4. 简单又强大的pandas爬虫 利用pandas库的read_html()方法爬取网页表格型数据

    文章目录 一.简介 二.原理 三.爬取实战 实例1 实例2 一.简介 一般的爬虫套路无非是发送请求.获取响应.解析网页.提取数据.保存数据等步骤.构造请求主要用到requests库,定位提取数据用的比 ...

  5. 分布式文件存储数据库 MongoDB

    MongoDB 简介 Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的:庞大的)一词. MongoDB 是一个基于分布式文件存储的 NoSQL 数据库.由 C++ 语言编 ...

  6. 一文带你趟过mac搭建appium测试环境的遇到的坑

    做UI自动化,最难的一步就是在环境搭建上,怎么去搭建一个UI自动化测试的环境,会难住很多人,在Mac上搭建appium如何搭建呢,本文带着大家去领略如何在mac上搭建appium测试环境.下面就是详细 ...

  7. 深信服edr 2020HW行动0day 漏洞细节

    漏洞1 一下4个漏洞触发都在其他文件,这里只进行漏洞点的分析. 漏洞点tool\log\c.php 启动c.php大约140行-148行 这里执行了两个方法 show_form 与main 这里追踪s ...

  8. LinkedHashMap 实现LRU缓存

    date: 2020-07-09 13:52:00 updated: 2020-07-21 17:40:00 LinkedHashMap 实现LRU缓存 参考 LinkedHashMap是HashMa ...

  9. this.getResolve is not a function VUE中使用sass

    1. 安装以下依赖 npm install node-sass --save-dev //安装node-sass npm install sass-loader --save-dev //安装sass ...

  10. eclipse之SSH配置struts2【一】 (使用版本 2.3.24.1)

    eclipse创建Dynamic web project,勾选生成web.xml,创建index.jsp页面,tomcat部署能正常运行.进行下一步struts配置. web.xml中添加配置,配置在 ...