//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)
}
}