导出excel 代码,可以模仿写


package main

import (
	"encoding/json"
	"fmt"
	"github.com/sirupsen/logrus"
	"github.com/spf13/cobra"
	"github.com/xuri/excelize/v2"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"log"
	"time"
)

type Questionnaire struct {
	OrgName    string         `gorm:"column:org_name"`
	Name       string         `gorm:"column:name"`
	Department string         `gorm:"column:department"`
	Position   string         `gorm:"column:position"`
	Email      string         `gorm:"column:email"`
	Tel        string         `gorm:"column:tel"`
	Result     string         `gorm:"column:result"`
	Id         int            `gorm:"column:id;primaryKey"`
	CreatedAt  time.Time      `gorm:"column:created_at;<-:false"`
	UpdatedAt  time.Time      `gorm:"column:updated_at;<-:false"`
	DeletedAt  gorm.DeletedAt `gorm:"column:deleted_at"`
}

type Question struct {
	Name   string   `json:"name"`
	Answer []string `json:"answer"`
}

type QuestionnairePart struct {
	PartName string     `json:"partName"`
	Result   []Question `json:"result"`
}

func (*Questionnaire) TableName() string {
	return "test.questionnaire"
}

var env string

var cmd = &cobra.Command{
	Use:     "exporter-excel",
	Short:   "e",
	Version: "v0.1",
	Run: func(cmd *cobra.Command, args []string) {
		exportData(env)
	},
}

func main() {
	if err := cmd.Execute(); err != nil {
		logrus.Fatal(err)
	}
}

func init() {
	cobra.OnInitialize(initLog)
	cmd.PersistentFlags().StringVar(&env, "env", "dev", "environment")
}

func initLog() {

	logrus.SetFormatter(&logrus.TextFormatter{
		FullTimestamp:   true,
		TimestampFormat: "2006-01-02 15:04:05",
	})
}

func exportData(env string) {
	dsn := ""
	if env == "prod" {
		dsn = "postgresql://root:prod@prod:5432/prod?TimeZone=Asia/Shanghai"
	} else if env == "test" {
		dsn = "postgresql://test:test@test:5432/test?TimeZone=Asia/Shanghai"
	} else {
		dsn = "postgresql://root:dev@dev/dev?TimeZone=Asia/Shanghai"
	}

	var err error
	db, err := gorm.Open(postgres.Open(dsn))
	if err != nil {
		log.Fatalf("init test db failed %v", err)
	}
	var qn []Questionnaire
	db.Order("created_at desc").Find(&qn)
	file := excelize.NewFile()
	//设置表名
	file.SetSheetName("Sheet1", "表1")
	//t := true
	//f := float64(30)
	//file.SetSheetProps("表1", &excelize.SheetPropsOptions{CustomHeight: &t, DefaultRowHeight: &f, FitToPage: &t})
	index, _ := file.NewStyle(&excelize.Style{
		Border: []excelize.Border{
			{Type: "bottom", Color: "#fff600", Style: 1},
		},
		Fill: excelize.Fill{
			Type: "gradient", Color: []string{"#FFFFFF", "#E0EBF5"}, Shading: 0,
		},

		Alignment: &excelize.Alignment{
			Horizontal: "justify",
			Vertical:   "top",
		},
	})
	index2, _ := file.NewStyle(&excelize.Style{
		Border: []excelize.Border{
			{Type: "bottom", Color: "#fff600", Style: 0},
			{Type: "top", Color: "#fff600", Style: 0},
			{Type: "left", Color: "#fff600", Style: 0},
			{Type: "right", Color: "#fff600", Style: 0},
		},
		Fill: excelize.Fill{
			Type: "gradient", Color: []string{"#fff600", "#fff600"}, Shading: 0,
		},

		Alignment: &excelize.Alignment{
			Horizontal: "justify",
			Vertical:   "top",
		},
	})

	index3, _ := file.NewStyle(&excelize.Style{
		Alignment: &excelize.Alignment{
			Horizontal: "justify",
			Vertical:   "top",
		},
	})
	//
	//err = file.SetRowStyle("表1", 1, len(qn), index)
	//if err != nil {
	//	fmt.Println(err)
	//}

	//创建流式写入
	writer, err := file.NewStreamWriter("表1")
	//修改列宽
	writer.SetColWidth(1, 7, 25)
	writer.SetColWidth(8, 35, 50)

	//设置表头
	writer.SetRow("A1", []interface{}{excelize.Cell{StyleID: index, Value: "名称"}, excelize.Cell{StyleID: index, Value: "姓名"}, excelize.Cell{StyleID: index, Value: "部门"}, excelize.Cell{StyleID: index, Value: "职务", excelize.RowOpts{Height: 45, OutlineLevel: 1})
	if err != nil {
		return
	}
	for i := 1; i <= len(qn); i++ {
		//索引转单元格坐标
		cell, _ := excelize.CoordinatesToCellName(1, i+1)
		//添加的数据
		questionnaire := []QuestionnairePart{}
		err = json.Unmarshal([]byte(qn[i-1].Result), &questionnaire)
		if err != nil {
			fmt.Println(err)
			continue
		}
		cellValue := make([]interface{}, 0)

		if qn[i-1].CreatedAt.Format("2006/01/02") == time.Now().AddDate(0, 0, -1).Format("2006/01/02") {
			cellValue = append(cellValue, excelize.Cell{StyleID: index2, Value: qn[i-1].OrgName}, excelize.Cell{StyleID: index2, Value: qn[i-1].Name}, excelize.Cell{StyleID: index2, Value: qn[i-1].Department}, excelize.Cell{StyleID: index2, Value: qn[i-1].Position}, excelize.Cell{StyleID: index2, Value: qn[i-1].Email}, excelize.Cell{StyleID: index2, Value: qn[i-1].Tel})
			cellValue = append(cellValue, excelize.Cell{StyleID: index2, Value: qn[i-1].CreatedAt.Format("2006/01/02")})
			for j := 0; j < len(questionnaire); j++ {
				for k := 0; k < len(questionnaire[j].Result); k++ {
					cellValue = append(cellValue, excelize.Cell{StyleID: index2, Value: questionnaire[j].Result[k].Answer})
				}
			}

		} else {
			cellValue = append(cellValue, excelize.Cell{StyleID: index3, Value: qn[i-1].OrgName}, excelize.Cell{StyleID: index3, Value: qn[i-1].Name}, excelize.Cell{StyleID: index3, Value: qn[i-1].Department}, excelize.Cell{StyleID: index3, Value: qn[i-1].Position}, excelize.Cell{StyleID: index3, Value: qn[i-1].Email}, excelize.Cell{StyleID: index3, Value: qn[i-1].Tel})
			cellValue = append(cellValue, excelize.Cell{StyleID: index3, Value: qn[i-1].CreatedAt.Format("2006/01/02")})
			for j := 0; j < len(questionnaire); j++ {
				for k := 0; k < len(questionnaire[j].Result); k++ {
					cellValue = append(cellValue, excelize.Cell{StyleID: index3, Value: questionnaire[j].Result[k].Answer})
				}
			}
		}

		writer.SetRow(cell, cellValue, excelize.RowOpts{Height: 65, OutlineLevel: 1})

	}
	//结束流式写入
	writer.Flush()

	name := "问卷导出数据" + time.Now().Format("20060102") + ".xlsx"

	file.SaveAs(name)
}