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

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

导入包:
import (
   "github.com/360EntSecGroup-Skylar/excelize"
   "github.com/gin-gonic/gin" 
)
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  写篇文章备注下

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存