go压缩文件导入及数据库写入

//zip导入
func (c *UserManageController) Import2() {
	if c.Ctx.Request.Method == "POST" {
		c.Import2Save()
	}
	c.setTpl("usermanage/import2.html", "shared/layout_pullbox.html")
	c.LayoutSections = make(map[string]string)
	c.LayoutSections["footerjs"] = "usermanage/import2_footerjs.html"
}
func (c *UserManageController) Unzip(fileName string) ([]string, string, error) {
	var imgGt2m = []string{}
	var excelFileName = ""
	/******/
	zipFile, err := zip.OpenReader(fileName)
	if err != nil {
		utils.LogError(fmt.Sprintln("Openfile Error: ", err))
	}
	defer zipFile.Close()
	//fmt.Println("zipFile :", zipFile)
	//fmt.Println("zipFile.File :", zipFile.File)
	for _, innerFile := range zipFile.File {
		//fmt.Println("innerFile name :", innerFile.Name)
		fmt.Println("innerFile flag :", innerFile.Flags)
		//gbk转码
		html := string(innerFile.Name)
		enc := mahonia.NewDecoder("gbk")
		strName := enc.ConvertString(html)
		fmt.Println("strName:", strName)
		//创建解压文件夹dir
		info := innerFile.FileInfo()
		if info.IsDir() {
			err = os.MkdirAll("static/users/"+strName, os.ModePerm)
			if err != nil {
				utils.LogError(fmt.Sprintln("info.IsDir->Unzip File Error : ", err))
				fmt.Println("Unzip File Error : " + err.Error())
				break
			}
		}
		//解压文件file
		srcFile, err := innerFile.Open()
		fmt.Println("srcFile :", srcFile)
		if err != nil {
			utils.LogError(fmt.Sprintln("innerFile.Open->Unzip File Error : ", err))
			fmt.Println("Unzip File Error : " + err.Error())
		}
		defer srcFile.Close()
		newFile, err := os.Create("static/users/" + strName)
		if err != nil {
			utils.LogError(fmt.Sprintln("os.Create->Unzip File Error : ", err))
			fmt.Println("Unzip File Error : " + err.Error())
		}
		io.Copy(newFile, srcFile)
		defer newFile.Close()
		//获取照片大小,大于2M写入imgGt2m做入库比对
		if path.Ext(strName) != ".xlsx" && path.Ext(strName) != ".txt" {
			filesize := innerFile.FileInfo().Size()
			//fmt.Println("filesize:",filesize)
			if filesize > 2*1024*1024 {
				imgGt2mTemp := strings.Split(strName, "/")[1]
				//imgGt2m = imgGt2mTemp
				imgGt2m = append(imgGt2m, imgGt2mTemp)
				utils.LogError(fmt.Sprintln("imgGt2m : ", imgGt2m))
			}
		}
		if path.Ext(strName) == ".xlsx" {
			excelFileName = "static/users/" + strName
		}
	}
	return imgGt2m, excelFileName, err
}
func (c *UserManageController) ExcelToSql(excelFileName string, imgGt2m []string) (int, int, string, error) {
	var succNum = 0
	var failNum = 0
	var fail = ""
	//判断文件类型 xlsx,写入数据库操作

	/*xlsx处理*/
	xlFile, err := xlsx.OpenFile(excelFileName)
	//defer os.Remove(excelFileName)
	if err != nil {
		fmt.Printf("open failed: %s\n", err)
		utils.LogError(fmt.Sprintln("Openfile Error : ", err))
	}
	qs := orm.NewOrm().QueryTable(models.UserManageTBName())
	i, _ := qs.PrepareInsert()
	defer i.Close();
	os.Remove(excelFileName)
	for _, sheet := range xlFile.Sheets {
		//fmt.Printf("Sheet Name: %s\n", sheet.Name)
		if sheet.Name == "sheet" {
			fmt.Printf("Sheet len: %v\n", len(sheet.Rows)) //len = 1 无数据
			if len(sheet.Rows) <= 1 {
				failNum += 1
				fail += "Excel表行内容为空."
				continue
			}
			for j := 1; j < len(sheet.Rows); j++ { //忽略标题行
				data := models.UserManage{}
				data.Name = fmt.Sprintf("%s", sheet.Rows[j].Cells[0])
				data.Pin = fmt.Sprintf("%s", sheet.Rows[j].Cells[1])
				data.Photo = "/static/users/images/" + fmt.Sprintf("%s", sheet.Rows[j].Cells[2])	//先赋值,以免imgGt2m为空
				var isStop = ""
				for _, val := range imgGt2m {
					if val == fmt.Sprintf("%s", sheet.Rows[j].Cells[2]) {
						failNum += 1
						fail += val + "大于2M."
						isStop = "stop"
					} else {
						data.Photo = "/static/users/images/" + fmt.Sprintf("%s", sheet.Rows[j].Cells[2])
					}
				}
				if isStop == "stop" {
					continue
				}
				data.Cardid = fmt.Sprintf("%s", sheet.Rows[j].Cells[3])
				data.OrgName = fmt.Sprintf("%s", sheet.Rows[j].Cells[4])
				data.Creator = &c.curUser
				//是否存在部门
				org := make([]*models.Organization, 0)
				hasOrg, _ := orm.NewOrm().QueryTable(models.OrganizationTBName()).Filter("name", data.OrgName).All(&org)
				if data.Name == "" || data.Pin == "" {
					failNum += 1
					fail += "姓名、人员编号不能为空."
					continue
				} else if hasOrg == 0 {
					failNum += 1
					fail += "不存在部门:" + data.OrgName + "."
					continue
				} else {
					userData := models.UserManage{Pin: data.Pin}
					hasUser := orm.NewOrm().Read(&userData, "pin")
					if hasUser != nil {
						/******/
						succNum += 1
						//fmt.Println("查询不到")//插入表
						id, _ := i.Insert(&data)
						fmt.Printf("id :%v \n", id)
					} else {
						failNum += 1
						fail += "人员编号:" + data.Pin + "已存在."
						continue
					}
				}
			}
		} else {
			c.jsonResult(enums.JRCodeFailed, "excel工作表须为 'sheet'", 0)
		}
	}
	return succNum, failNum, fail, err
}
func (c *UserManageController) Import2Save() {
	//获取上传url
	str := c.GetString("Url")
	fmt.Println("Url:", str)
	fileName := "static/users/" + str
	if path.Ext(fileName) != ".zip" {
		c.jsonResult(enums.JRCodeFailed, "文件类型错误,请选择 *.zip 文件 !", 0)
	}
	imgGt2m, excelFileName, errUnzip := c.Unzip(fileName)
	if errUnzip != nil {
		c.jsonResult(enums.JRCodeFailed, "解压文件打开失败!", 0)
	}
	succNum, failNum, fail, errExcelToSql := c.ExcelToSql(excelFileName, imgGt2m)
	if errExcelToSql != nil {
		c.jsonResult(enums.JRCodeFailed, "*.xlsx文件打开失败!", 0)
	}
	/******/
	if succNum > 0 && failNum > 0 {
		c.jsonResult(enums.JRCodeSucc, "成功数量: "+strconv.Itoa(succNum)+",失败数量: "+strconv.Itoa(failNum)+";原因: "+fail, 0)
	} else if succNum > 0 && failNum == 0 {
		c.jsonResult(enums.JRCodeSucc, "成功数量: "+strconv.Itoa(succNum), 0)
	} else {
		c.jsonResult(enums.JRCodeFailed, "失败数量: "+strconv.Itoa(failNum)+";原因: "+fail, 0)
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值