-
导入包:
-
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 写篇文章备注下
【GO】上传Excel并批量保存入库(Gin,Gorm,Excelize)
最新推荐文章于 2024-02-26 11:32:05 发布