作者 tangxvhui

提交

... ... @@ -9,6 +9,7 @@ import (
serveaudit "oppmg/services/audit"
servecommon "oppmg/services/common"
serverbac "oppmg/services/rbac"
"oppmg/utils/exceltool"
"strconv"
"time"
)
... ... @@ -370,3 +371,55 @@ func (c *AuditController) ChanceStoreChange() {
msg = protocol.NewReturnResponse(nil, nil)
return
}
//ChanceDataExcel 机会列表数据导出为excel
//@router /v1/chance/export_chance_list
func (c *AuditController) ChanceDataExcel() {
var (
param protocol.RequestAuditList
msg *protocol.ResponseMessage
)
param.Status = -1
param.ReviewStatus = -1
param.PublishStatus = -1
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
log.Error("json 解析失败", err)
msg = protocol.BadRequestParam("1")
c.ResposeJson(msg)
return
}
beginTime, err := time.ParseInLocation("2006-01-02", param.CreateTimeBeginS, time.Local)
if err == nil && len(param.CreateTimeBeginS) > 0 {
param.CreateTimeBegin = beginTime.Unix()
}
endTime, err := time.ParseInLocation("2006-01-02", param.CreateTimeEndS, time.Local)
if err == nil && len(param.CreateTimeEndS) > 0 {
param.CreateTimeEnd = endTime.Unix() + 86399
}
fmt.Println(err, param.CreateTimeBegin, param.CreateTimeEnd)
if len(param.StatusS) > 0 {
param.Status, _ = strconv.Atoi(param.StatusS)
}
if len(param.ReviewStatusS) > 0 {
param.ReviewStatus, _ = strconv.Atoi(param.ReviewStatusS)
}
if len(param.PublishStatusS) > 0 {
param.PublishStatus, _ = strconv.Atoi(param.PublishStatusS)
}
uid := c.GetUserId()
companyId := c.GetCompanyId()
param.PageIndex = 1
param.PageIndex = 10
sourceData, excelHead := serveaudit.GetAuditListForExcel(param, companyId, uid)
xlsMaker := exceltool.NewExcelMaker()
xlsMaker.SetListHead(excelHead)
xlsMaker.MakeListExcelForBeego(sourceData)
err = xlsMaker.Xlsx.Write(c.Ctx.Output.Context.ResponseWriter)
if err != nil {
msg = protocol.BadRequestParam("1")
c.ResposeJson(msg)
return
}
c.ResponseExcelByFile(c.Ctx, xlsMaker)
return
}
... ...
... ... @@ -108,7 +108,7 @@ func (this *BaseController) Valid(obj interface{}) (result bool, msg *protocol.R
}
func (this *BaseController) ResponseExcelByFile(ctx *context.Context, excelMaker *exceltool.ExcelMaker) error {
ctx.Output.Header("Content-Disposition", "attachment; filename="+excelMaker.FileName)
ctx.Output.Header("Content-Disposition", "attachment; filename="+excelMaker.GetFileName())
ctx.Output.Header("Content-Description", "File Transfer")
ctx.Output.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
ctx.Output.Header("Content-Transfer-Encoding", "binary")
... ...
... ... @@ -75,15 +75,6 @@ func DeleteChanceType(id int) (err error) {
return
}
func GetChanceTypeAll() (v []*ChanceType, err error) {
o := orm.NewOrm()
sql := "select * from chance_type "
if _, err = o.Raw(sql).QueryRows(&v); err == nil {
return
}
return
}
func GetChanceTypeByCompany(companyId int) (v []*ChanceType, err error) {
o := orm.NewOrm()
sql := "select * from chance_type where company_id=? order by sort_num"
... ...
... ... @@ -116,6 +116,7 @@ func init() {
beego.NSRouter("/reserve_type/delete", &controllers.AuditController{}, "post:DeleteReserveType"),
beego.NSRouter("/reserve_type/edit", &controllers.AuditController{}, "post:EditReserveType"),
beego.NSRouter("/store/change", &controllers.AuditController{}, "post:ChanceStoreChange"),
beego.NSRouter("/export_chance_list", &controllers.AuditController{}, "post:ChanceDataExcel"),
),
beego.NSNamespace("/rank",
beego.NSRouter("/type/list", &controllers.RankController{}, "post:GetRankType"),
... ...
... ... @@ -139,51 +139,17 @@ func buildSqlForAuditList(usercompanyid int64, companyid int64, userid int64) st
return fmt.Sprintf(allsql, strings.Join(sqlslice, " UNION "))
}
func GetAuditList(param protocol.RequestAuditList, companyid int64, userid int64) (protocol.ResponseAuditList, error) {
type SqlData struct {
Id int64 `orm:"column(id)"`
UserId int64 `orm:"column(user_id)"`
NickName string `orm:"column(nick_name)"`
DepartmentId int64 `orm:"column(department_id)"`
AuditTemplateId int64 `orm:"column(audit_template_id)"`
ChanceTypeId int `orm:"column(chance_type_id)"`
PublishStatus int `orm:"column(publish_status)"`
CreateAt string `orm:"column(create_at)"`
ReviewStatus int8 `orm:"column(review_status)"`
Status int8 `orm:"column(status)"`
DiscoveryScore string `orm:"column(discovery_score)"`
CommentTotal string `orm:"column(comment_total)"`
Code string `orm:"column(code)"`
StoreType int8 `orm:"column(type)"`
ReserveTypeId int `orm:"column(reserve_type_id)"`
}
func GetAuditListSql(param protocol.RequestAuditList, companyid int64, userid int64, ucompanyid int64) (coutsql string,
datasql string, cond []interface{}) {
var (
datasql = strings.Builder{}
countsql = strings.Builder{}
data []SqlData
cnt int
err error
cond []interface{}
datasqlBuild = strings.Builder{}
countsqlBuild = strings.Builder{}
sqlFromPermission string
)
returnData := protocol.ResponseAuditList{
ResponsePageInfo: protocol.ResponsePageInfo{
TotalPage: 0,
CurrentPage: param.PageIndex,
},
List: make([]protocol.RspAuditList, 0),
}
usercompany, err := models.GetUserCompanyBy(userid, companyid)
if err != nil {
log.Error("GetUserCompanyBy(userid, companyid) err:%s", err)
return returnData, protocol.NewErrWithMessage("1")
}
s1 := `SELECT a.id,a.department_id,a.audit_template_id,a.chance_type_id
,a.publish_status,a.create_at,a.review_status,a.status
,a.discovery_score,a.comment_total ,a.code,d.nick_name,d.id as user_id
,a.type,a.reserve_type_id
,a.type,a.reserve_type_id,a.source_content
FROM chance AS a
JOIN user_company AS c ON c.id = a.user_id
JOIN user AS d ON c.user_id = d.id
... ... @@ -197,7 +163,7 @@ func GetAuditList(param protocol.RequestAuditList, companyid int64, userid int64
if companyinfo, err := models.GetCompanyById(companyid); err == nil {
//非主管进行权限过滤
if companyinfo.AdminId != userid {
sqlFromPermission = buildSqlForAuditList(usercompany.Id, usercompany.CompanyId, usercompany.UserId)
sqlFromPermission = buildSqlForAuditList(ucompanyid, companyid, userid)
}
}
if len(sqlFromPermission) > 0 {
... ... @@ -208,90 +174,134 @@ func GetAuditList(param protocol.RequestAuditList, companyid int64, userid int64
s1 = fmt.Sprintf(s1, "")
s2 = fmt.Sprintf(s2, "")
}
datasql.WriteString(s1)
countsql.WriteString(s2)
datasqlBuild.WriteString(s1)
countsqlBuild.WriteString(s2)
cond = append(cond, companyid)
if param.ChanceTypeId > 0 {
//一级分类过滤
cond = append(cond, param.ChanceTypeId)
s := ` And a.chance_type_id=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.TempalteId > 0 {
cond = append(cond, param.TempalteId)
s := ` AND a.audit_template_id=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.PublishStatus >= 0 {
cond = append(cond, param.PublishStatus)
s := ` And a.publish_status=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.Status >= 0 {
cond = append(cond, param.Status)
s := ` AND a.status=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.ReviewStatus >= 0 {
cond = append(cond, param.ReviewStatus)
s := ` AND a.review_status=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.CreateTimeBegin > 0 {
cond = append(cond, param.CreateTimeBegin)
s := ` AND UNIX_TIMESTAMP(a.create_at)>=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.CreateTimeEnd > 0 {
cond = append(cond, param.CreateTimeEnd)
s := ` AND UNIX_TIMESTAMP(a.create_at)<=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if len(param.Code) > 0 {
cond = append(cond, "%"+param.Code+"%")
s := ` And a.code like ? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if len(param.UserName) > 0 {
cond = append(cond, "%"+param.UserName+"%")
s := ` And d.nick_name like ? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.DepartmentID > 0 {
//提交的部门
cond = append(cond, param.DepartmentID)
s := ` And a.department_id=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if param.ReserveType > 0 {
cond = append(cond, param.ReserveType)
s := ` And a.reserve_type_id=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
if len(param.StoreType) > 0 {
storeType, _ := strconv.Atoi(param.StoreType)
if storeType >= 0 {
cond = append(cond, storeType)
s := ` And a.type=? `
datasql.WriteString(s)
countsql.WriteString(s)
datasqlBuild.WriteString(s)
countsqlBuild.WriteString(s)
}
}
dataStart := (param.PageIndex - 1) * param.PageSize
datasql.WriteString(fmt.Sprintf(` ORDER BY a.create_at DESC limit %d,%d `, dataStart, param.PageSize))
err = utils.ExecuteQueryOne(&cnt, countsql.String(), cond...)
datasqlBuild.WriteString(fmt.Sprintf(` ORDER BY a.create_at DESC limit %d,%d `, dataStart, param.PageSize))
return countsqlBuild.String(), datasqlBuild.String(), cond
}
func GetAuditList(param protocol.RequestAuditList, companyid int64, userid int64) (protocol.ResponseAuditList, error) {
type SqlData struct {
Id int64 `orm:"column(id)"`
UserId int64 `orm:"column(user_id)"`
NickName string `orm:"column(nick_name)"`
DepartmentId int64 `orm:"column(department_id)"`
AuditTemplateId int64 `orm:"column(audit_template_id)"`
ChanceTypeId int `orm:"column(chance_type_id)"`
PublishStatus int `orm:"column(publish_status)"`
CreateAt string `orm:"column(create_at)"`
ReviewStatus int8 `orm:"column(review_status)"`
Status int8 `orm:"column(status)"`
DiscoveryScore string `orm:"column(discovery_score)"`
CommentTotal string `orm:"column(comment_total)"`
Code string `orm:"column(code)"`
StoreType int8 `orm:"column(type)"`
ReserveTypeId int `orm:"column(reserve_type_id)"`
}
var (
datasql string
countsql string
data []SqlData
cnt int
err error
cond []interface{}
)
returnData := protocol.ResponseAuditList{
ResponsePageInfo: protocol.ResponsePageInfo{
TotalPage: 0,
CurrentPage: param.PageIndex,
},
List: make([]protocol.RspAuditList, 0),
}
usercompany, err := models.GetUserCompanyBy(userid, companyid)
if err != nil {
log.Error("GetUserCompanyBy(userid, companyid) err:%s", err)
return returnData, protocol.NewErrWithMessage("1")
}
countsql, datasql, cond = GetAuditListSql(param, companyid, userid, usercompany.Id)
err = utils.ExecuteQueryOne(&cnt, countsql, cond...)
if err != nil {
log.Error("EXCUTE SQL ERR:%s", err)
return returnData, nil
... ... @@ -299,7 +309,7 @@ func GetAuditList(param protocol.RequestAuditList, companyid int64, userid int64
if cnt <= 0 {
return returnData, nil
}
err = utils.ExecuteQueryAll(&data, datasql.String(), cond...)
err = utils.ExecuteQueryAll(&data, datasql, cond...)
if err != nil {
log.Error("EXCUTE SQL ERR:%s", err)
return returnData, nil
... ...
package audit
import (
"encoding/json"
"fmt"
"oppmg/common/log"
"oppmg/models"
"oppmg/protocol"
"oppmg/utils/exceltool"
"strconv"
"strings"
"github.com/astaxie/beego/orm"
)
func GetAuditListForExcel(param protocol.RequestAuditList, companyid int64, userid int64) ([]orm.Params, []exceltool.ExcelHead) {
usercompany, err := models.GetUserCompanyBy(userid, companyid)
if err != nil {
log.Error("GetUserCompanyBy(userid, companyid) err:%s", err)
return nil, nil
}
datasql, _, cond := GetAuditListSql(param, companyid, userid, usercompany.Id)
var soureData []orm.Params
o := orm.NewOrm()
_, err = o.Raw(datasql, cond...).Values(&soureData)
if err != nil {
log.Error("获取机会数据失败err:%s", err)
return nil, nil
}
//https://web-open.fjmaimaimai.com/#/ 生产
// mmm-web-open-test.fjmaimaimai.com/
// SELECT a.id,a.department_id,a.audit_template_id,a.chance_type_id
// ,a.publish_status,a.create_at,a.review_status,a.status
// ,a.discovery_score,a.comment_total ,a.code,d.nick_name,d.id as user_id
// ,a.type,a.reserve_type_id
// FROM chance AS a
// JOIN user_company AS c ON c.id = a.user_id
// JOIN user AS d ON c.user_id = d.id
//进行数据整理
var (
reserveTypeCache map[string]*models.ChanceReserveType
chanceTypeCache map[string]*models.ChanceType
auditTemplateCache map[string]*models.AuditTemplate
departmentCache map[string]*models.Department
)
for i := range soureData {
storeTypeS := fmt.Sprint(soureData[i]["type"])
storeType, _ := strconv.ParseInt(storeTypeS, 10, 8)
soureData[i]["type"] = models.ChanceStoreTypeMap[int8(storeType)]
reserveTypeIdS := fmt.Sprint(soureData[i]["reserve_type_id"])
soureData[i]["reserve_type"] = ""
if reserveType, ok := reserveTypeCache[reserveTypeIdS]; ok {
soureData[i]["reserve_type"] = reserveType.Name
} else {
reserveTypeId, _ := strconv.Atoi(reserveTypeIdS)
reserveType, err := models.GetChanceReserveTypeById(reserveTypeId)
if err == nil {
reserveTypeCache[reserveTypeIdS] = reserveType
soureData[i]["reserve_type"] = reserveType.Name
}
}
chanceTypeIdS := fmt.Sprint(soureData[i]["chance_type_id"])
soureData[i]["chance_type"] = ""
if chanceType, ok := chanceTypeCache[chanceTypeIdS]; ok {
soureData[i]["chance_type"] = chanceType.Name
} else {
chanceTypeId, _ := strconv.Atoi(chanceTypeIdS)
chanceType, err := models.GetChanceTypeById(chanceTypeId)
if err == nil {
chanceTypeCache[chanceTypeIdS] = chanceType
soureData[i]["chance_type"] = chanceType.Name
}
}
auditTemplateIdS := fmt.Sprint(soureData[i]["audit_template_id"])
soureData[i]["audit_template"] = ""
if auditTempalte, ok := auditTemplateCache[auditTemplateIdS]; ok {
soureData[i]["audit_template"] = auditTempalte.Name
} else {
auditTemplateId, _ := strconv.ParseInt(auditTemplateIdS, 10, 64)
auditTempalte, err := models.GetAuditTemplateById(auditTemplateId)
if err == nil {
auditTemplateCache[auditTemplateIdS] = auditTempalte
soureData[i]["audit_template"] = auditTempalte.Name
}
}
departmentIdS := fmt.Sprint(soureData[i]["department_id"])
if department, ok := departmentCache[departmentIdS]; ok {
soureData[i]["department"] = department.Name
} else {
departmentId, _ := strconv.ParseInt(departmentIdS, 10, 64)
department, err := models.GetDepartmentById(departmentId)
if err == nil {
departmentCache[departmentIdS] = department
soureData[i]["department"] = department.Name
}
}
reviewStatusS := fmt.Sprint(soureData[i]["review_status"])
reviewStatus, _ := strconv.ParseInt(reviewStatusS, 10, 8)
soureData[i]["review_status"] = models.ChanceReviewStatusMap[int8(reviewStatus)]
statusS := fmt.Sprint(soureData[i]["status"])
status, _ := strconv.ParseInt(statusS, 10, 8)
soureData[i]["status"] = models.ChanceStatusMap[int8(status)]
publishStatusS := fmt.Sprint(soureData[i]["publish_status"])
publishStatus, _ := strconv.Atoi(publishStatusS)
soureData[i]["publish_status"] = models.ChancePublishStatusMap[publishStatus]
soureContentJson := fmt.Sprint(soureData[i]["soure_content"])
var (
soureContentData []protocol.InputElement
soureContentText strings.Builder
)
err := json.Unmarshal([]byte(soureContentJson), &soureContentData)
if err == nil {
for ii := range soureContentData {
soureContentText.WriteString(soureContentData[ii].Label + ":" + soureContentData[ii].CurrentValue + ",")
}
}
soureData[i]["soure_content"] = soureContentText.String()
soureData[i]["media"] = fmt.Sprintf("chance_id=%v&check_sum=%s", soureData[i]["id"], "xx")
}
excelhead := []exceltool.ExcelHead{
exceltool.ExcelHead{Key: "type", Name: "类型"},
exceltool.ExcelHead{Key: "reserve_type", Name: "储备池分类"},
exceltool.ExcelHead{Key: "code", Name: "机会编码"},
exceltool.ExcelHead{Key: "chance_type", Name: "一级分类"},
exceltool.ExcelHead{Key: "audit_template", Name: "二级分类"},
exceltool.ExcelHead{Key: "nick_name", Name: "提交人"},
exceltool.ExcelHead{Key: "department_id", Name: "提交部门"},
exceltool.ExcelHead{Key: "create_at", Name: "提交时间"},
exceltool.ExcelHead{Key: "publish_status", Name: "公开状态"},
exceltool.ExcelHead{Key: "review_status", Name: "审核状态"},
exceltool.ExcelHead{Key: "status", Name: "关闭状态"},
exceltool.ExcelHead{Key: "soure_content", Name: "内容"},
exceltool.ExcelHead{Key: "media", Name: "视频/图片/语音"},
exceltool.ExcelHead{Key: "discovery_score", Name: "得分"},
}
return soureData, excelhead
}
... ...
... ... @@ -564,11 +564,12 @@ func ExportFeedBacks(companyId int64, request *protocol.ExportFeedBacksRequest)
return
}
excel = exceltool.NewExcelMaker()
headTitle := [][]string{
[]string{"time", "时间"},
[]string{"name", "姓名"},
[]string{"content", "选项"},
headTitle := []exceltool.ExcelHead{
exceltool.ExcelHead{Key: "time", Name: "时间"},
exceltool.ExcelHead{Key: "name", Name: "姓名"},
exceltool.ExcelHead{Key: "content", Name: "选项"},
}
excel.SetListHead(headTitle)
for i := range feedbackRsp.List {
item := feedbackRsp.List[i]
row := make(map[string]string)
... ... @@ -577,7 +578,7 @@ func ExportFeedBacks(companyId int64, request *protocol.ExportFeedBacksRequest)
row["content"] = item.Content
sourceData = append(sourceData, row)
}
if err = excel.MakeListExcel(sourceData, headTitle); err != nil {
if err = excel.MakeListExcel(sourceData); err != nil {
log.Error(err.Error())
return
}
... ...
... ... @@ -10,10 +10,16 @@ import (
"github.com/astaxie/beego/orm"
)
//(新)ExcelMaker 构建excel文档
type ExcelHead struct {
Name string
Key string
}
//ExcelMaker 构建excel文档
type ExcelMaker struct {
Xlsx *excelize.File
FileName string
fileName string
header []ExcelHead
}
//NewExcelMaker ....
... ... @@ -23,22 +29,30 @@ func NewExcelMaker() *ExcelMaker {
}
}
func (e *ExcelMaker) SetListHead(h []ExcelHead) {
e.header = h
}
func (e *ExcelMaker) SetFileName(n string) {
e.fileName = n
}
func (e *ExcelMaker) GetFileName() string {
return e.fileName
}
//MakeListExcel 根据列表形式的数据创建excel文档
//@sourData []map[string]string; 原始数据,要输入excel文档的数据
//@xlsxHeader [][]string{ {"数据字段英文名",""excel字段中文描述"},{"数据字段英文名",""excel字段中文描述"} }
func (e *ExcelMaker) MakeListExcel(sourData []map[string]string, xlsxHeader [][]string) (err error) {
if len(xlsxHeader) == 0 {
func (e *ExcelMaker) MakeListExcel(sourData []map[string]string) (err error) {
if len(e.header) == 0 {
return errors.New("xlsHeader 数据格式错误")
}
headEn := []string{} //数据字段英文名
headCn := []string{} //excel字段中文描述
alphaSlice := []string{} //excel列字母索引
for key, val := range xlsxHeader {
if len(val) != 2 {
return errors.New("xlsHeader 数据格式错误")
}
headEn = append(headEn, xlsxHeader[key][0])
headCn = append(headCn, xlsxHeader[key][1])
for key, val := range e.header {
headEn = append(headEn, val.Key)
headCn = append(headCn, val.Name)
//alpha, err := excelize.ColumnNumberToName(key)
//if err != nil {
// return err
... ... @@ -48,39 +62,35 @@ func (e *ExcelMaker) MakeListExcel(sourData []map[string]string, xlsxHeader [][]
}
//设置excel文档第一行的字段中文描述
for index, _ := range headCn {
for index := range headCn {
//索引转列名,索引从0开始
cellAlpha := fmt.Sprintf("%s%d", alphaSlice[index], 1) // 单元格行坐标从1开始,如:a1,指第一行a列。
e.Xlsx.SetCellStr("Sheet1", cellAlpha, headCn[index])
}
//从excel第二行开始设置实际数据的值
for key1, _ := range sourData {
for key1 := range sourData {
for i := 0; i < len(headEn); i++ {
cellAlpha := fmt.Sprintf("%s%d", alphaSlice[i], key1+2) // 单元格行坐标从1开始,如:a1,指第一行a列。
e.Xlsx.SetCellStr("Sheet1", cellAlpha, sourData[key1][headEn[i]])
}
}
e.FileName = GetRandomString(8) + ".xlsx"
e.fileName = GetRandomString(8) + ".xlsx"
return nil
}
//MakeListExcel 根据数据创建列表形式的excel文档
//MakeListExcelForBeego 根据数据创建列表形式的excel文档
//@sourData []orm.Params; 原始数据,要输入excel文档的数据
//@xlsxHeader [][]string{ {"数据字段英文名",""excel字段中文描述"},{"数据字段英文名",""excel字段中文描述"} }
func (e *ExcelMaker) MakeListExcelForBeego(sourData []orm.Params, xlsxHeader [][]string) (err error) {
if len(xlsxHeader) == 0 {
func (e *ExcelMaker) MakeListExcelForBeego(sourData []orm.Params) (err error) {
if len(e.header) == 0 {
return errors.New("xlsHeader 数据格式错误")
}
headEn := []string{} //数据字段英文名
headCn := []string{} //excel字段中文描述
alphaSlice := []string{} //excel列字母索引
for key, val := range xlsxHeader {
if len(val) != 2 {
return errors.New("xlsHeader 数据格式错误")
}
headEn = append(headEn, xlsxHeader[key][0])
headCn = append(headCn, xlsxHeader[key][1])
for key, val := range e.header {
headEn = append(headEn, val.Key)
headCn = append(headCn, val.Name)
alpha, err := excelize.ColumnNumberToName(key)
if err != nil {
return err
... ... @@ -89,14 +99,14 @@ func (e *ExcelMaker) MakeListExcelForBeego(sourData []orm.Params, xlsxHeader [][
}
//设置excel文档第一行的字段中文描述
for index, _ := range headCn {
for index := range headCn {
//索引转列名,索引从0开始
cellAlpha := fmt.Sprintf("%s%d", alphaSlice[index], 1) // 单元格行坐标从1开始,如:a1,指第一行a列。
e.Xlsx.SetCellStr("Sheet1", cellAlpha, headCn[index])
}
//从excel第二行开始设置实际数据的值
for key1, _ := range sourData {
for key1 := range sourData {
for i := 0; i < len(headEn); i++ {
cellAlpha := fmt.Sprintf("%s%d", alphaSlice[i], key1+2) // 单元格行坐标从1开始,如:a1,指第一行a列。
if sourData[key1][headEn[i]] == nil {
... ... @@ -105,11 +115,13 @@ func (e *ExcelMaker) MakeListExcelForBeego(sourData []orm.Params, xlsxHeader [][
e.Xlsx.SetCellStr("Sheet1", cellAlpha, fmt.Sprintf("%s", sourData[key1][headEn[i]]))
}
}
e.FileName = GetRandomString(8) + ".xlsx"
if len(e.fileName) == 0 {
e.fileName = GetRandomString(8) + ".xlsx"
}
return nil
}
//生成随机字符串
//GetRandomString 生成随机字符串
func GetRandomString(lenght int) string {
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
bytes := []byte(str)
... ...
package signature
... ...