【GO】上传Excel并批量保存入库(Gin,Gorm,Excelize)

  1. 导入包:

    1. import (
         "github.com/360EntSecGroup-Skylar/excelize"
         "github.com/gin-gonic/gin" 
      )
  2. control层:
    func exportLxProduct(c *gin.Context) {
    	file, _, err := c.Request.FormFile("file")
    	if err != nil {
    		baseReturn(c, -1, "上传文件出错")
    		return
    	}
    	//读excel流
    	xlsx, err := excelize.OpenReader(file)
    	if err != nil {
    		Logger.Error("open excel error:[%s]", err.Error())
    		baseReturn(c, 0, "读取excel文件失败")
    		return
    	}
    	//解析excel的数据
    	lxProducts, lxRrr := readExcel(xlsx)
    	if lxRrr != nil {
    		Logger.Error("read excel error:[%s]", lxRrr.Error())
    		baseReturn(c, 0, "解析excel文件失败")
    		return
    	}
    
    	lxService := LxProductService{}
    	errCode := lxService.ExportLxProduct(lxProducts)
    	baseReturn(c, errCode, len(lxProducts))
    }
    
    //ReadExcel .读取excel 转成切片
    func readExcel(xlsx *excelize.File) ([]LxProduct, error) {
    	//根据名字获取cells的内容,返回的是一个[][]string
    	rows := xlsx.GetRows(xlsx.GetSheetName(xlsx.GetActiveSheetIndex()))
    	//声明一个数组
    	var lxProducts []LxProduct
    	for i, row := range rows {
    		// 去掉第一行是excel表头部分
    		if i == 0 {
    			continue
    		}
    		var data LxProduct
    		for k, v := range row {
    			// 第一列是展示位名称
    			if k == 0 {
    				data.TypeName = v
    			}
    			// 第二列是产品主标题
    			if k == 1 {
    				data.ProductMasterTitle = v
    			}
    			// 第三列是产品副标题
    			if k == 2 {
    				data.ProductSlaveTitle = v
    			}
    		}
    		//将数据追加到集合中
    		lxProducts = append(lxProducts, data)
    	}
    	return lxProducts, nil
    }

    3. service层代码

    func (LxProductService) ExportLxProduct(lxProducts []LxProduct) int {
    	timeUnix := time.Now().Unix()
    	strInt64 := strconv.FormatInt(timeUnix, 10)
    	createTime, _ := strconv.Atoi(strInt64)
    	for i := range lxProducts {
    		lxProducts[i].ProductType = getProductTypeByName(lxProducts[i].TypeName)
    		lxProducts[i].ProductNo = i + 1
    		lxProducts[i].CreateTime = createTime
    	}
    	lxProductDao := LxProductDao{}
    	err := lxProductDao.BatchInsertData(lxProducts)
    	if err != nil {
    		return ErrDBError
    	}
    	return ErrOk
    }

    4. dao层代码

    unc (LxProductDao) BatchInsertData(products []LxProduct) error {
    	var buffer bytes.Buffer
    	//清空表数据
    	GetSoDbInstance().Exec("delete from `study_abroad_product`")
    	sql := "insert into `study_abroad_product` (`product_type`,`type_name`,`product_master_title`,`product_slave_title`,`product_no`,`create_time`) values"
    	if _, err := buffer.WriteString(sql); err != nil {
    		return err
    	}
    	for i := range products {
    		if i == len(products)-1 {
    			buffer.WriteString(fmt.Sprintf("('%d','%v','%v','%v','%d','%d');", products[i].ProductType, products[i].TypeName, products[i].ProductMasterTitle, products[i].ProductSlaveTitle, products[i].ProductNo, products[i].CreateTime))
    		} else {
    			buffer.WriteString(fmt.Sprintf("('%d','%v','%v','%v','%d','%d'),", products[i].ProductType, products[i].TypeName, products[i].ProductMasterTitle, products[i].ProductSlaveTitle, products[i].ProductNo, products[i].CreateTime))
    		}
    	}
    	return GetSoDbInstance().Exec(buffer.String()).Error
    
    }

    5.建表语句

    #新增留学产品表
    CREATE TABLE `study_abroad_product` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `product_type` int(2) NOT NULL DEFAULT '0' COMMENT '产品类型(1推荐 2美国 3英国 4加拿大 5澳大利亚 6新西兰 7日本',
      `type_name` varchar(20) NOT NULL DEFAULT '0' COMMENT '类型名称',
      `product_master_title` varchar(100) NOT NULL DEFAULT '0' COMMENT '产品主标题',
      `product_slave_title` varchar(200) NOT NULL DEFAULT '0' COMMENT '产品副标题',
      `product_no` int(2) DEFAULT '0' COMMENT '产品编号(保证导入的顺序',
      `create_time` int(10) NOT NULL DEFAULT '0' COMMENT '添加时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='留学产品表';

    6. excel文件模板:

     7.数据库表最终效果:

     因为公司需要,刚从Java转到Go  写篇文章备注下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值