16
03月
2022
废话不多说 直接上代码
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
"github.com/gin-gonic/gin"
"github.com/tealeg/xlsx"
"os"
"path"
"strconv"
)
var (
inFile = "./study.xlsx"
outFile = "./out_student.xlsx"
)
type Student struct {
Name string
age int
Phone string
Gender string
Mail string
}
func Export() {
file := xlsx.NewFile()
sheet, err := file.AddSheet("student_list")
if err != nil {
fmt.Printf(err.Error())
}
stus := getStudents()
//填充数据
for _, stu := range stus {
row := sheet.AddRow() //创建一行元素
nameCell := row.AddCell() //创建一格
nameCell.Value = stu.Name
ageCell := row.AddCell()
ageCell.Value = strconv.Itoa(stu.age)
phoneCell := row.AddCell()
phoneCell.Value = stu.Phone
genderCell := row.AddCell()
genderCell.Value = stu.Gender
mailCell := row.AddCell()
mailCell.Value = stu.Mail
}
err = file.Save(outFile)
if err != nil {
fmt.Printf(err.Error())
}
fmt.Println("\n\nexport success")
}
func getStudents() []Student {
students := make([]Student, 0)
for i := 0; i < 10; i++ {
stu := Student{}
stu.Name = "name" + strconv.Itoa(i+1)
stu.Mail = stu.Name + "@qq.com"
stu.Phone = "00000000" + strconv.Itoa(i)
stu.age = 20
stu.Gender = "男"
students = append(students, stu)
}
return students
}
func Import(c *gin.Context) {
// 获取上传文件
files, _ := c.FormFile("file")
// 设置文件需要保存的指定位置并设置保存的文件名字
dst := path.Join("../upload", files.Filename)
// 上传文件到指定的路径
a := c.SaveUploadedFile(files, dst)
if a != nil {
c.JSON(200, gin.H{"shuju": a})
}
xlsx, err := excelize.OpenFile(dst)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 获取excel中具体的列的值
rows, _ := xlsx.GetRows("Sheet" + "1")
// 循环刚刚获取到的表中的值
for key, row := range rows {
// 去掉标题行
if key > 0 {
// 循环每一个列的值
// for _, colCell := range row {
// fmt.Print(colCell , "\t")
// }
// User 是对应users表中字段的struct, 这里就是定义对应字段的值
user := User{Username: row[0], Password: row[1], Nickname: row[2], Address: row[3], Sex: row[4], Age: row[5], Headphoto: row[6]}
// Db.GetDB()这个是我自己封装的gorm方法,大家可以按照gorm使用方法
Db.GetDB().Create(&user)
//fmt.Println(row)
}
}
}
func main() {
Export()
}
还有一个支持修改样式
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
var myTableName = "练习"
//1.创建一个文件Excel文件
f := excelize.NewFile()
//2.创建一个工作表,表名为myTableName的内容
index := f.NewSheet(myTableName)
//3.设置第一个样式
style, err := f.NewStyle(`
{
"border":[
{
"type":"left",
"color":"000000",
"style":1
},
{
"type":"top",
"color":"000000",
"style":1
},
{
"type":"bottom",
"color":"000000",
"style":1
},
{
"type":"right",
"color":"000000",
"style":1
}
]
}
`)
//3.1.设置第二个样式,fill的颜色如果两个都是一样的,就是纯色了,type查看文档可以调出很多渐变样式
style2, err := f.NewStyle(`
{
"alignment":{
"horizontal":"center"
},
"border":[
{
"type":"left",
"color":"000000",
"style":1
},
{
"type":"top",
"color":"000000",
"style":1
},
{
"type":"bottom",
"color":"000000",
"style":1
},
{
"type":"right",
"color":"000000",
"style":1
}
],
"fill":{
"type":"gradient",
"color":[
"#FFFFFF",
"#FF4040"
],
"shading":0
}
}
`)
if err != nil {
fmt.Println(err)
return
}
//将第一个样式给行A1到C1,你也可以设置A1 A10这样,看需求
f.SetCellStyle(myTableName, "A1", "C1", style)
f.SetCellValue(myTableName, "A1", "员工工号")
f.SetCellValue(myTableName, "B1", "员工姓名")
//合并单元格
f.MergeCell(myTableName, "D1", "E1")
f.SetCellValue(myTableName, "D1", "合并的单元格")
//设置合并单元格,每一格宽度是10,D+E=20
f.SetColWidth(myTableName, "D", "E", 10)
//设置C单元格20的宽度
f.SetColWidth(myTableName, "C", "C", 20)
//将第一行设置为20高度
f.SetRowHeight(myTableName, 1, 20)
//将第一个样式给行A2到C2,你也可以设置A1 A10这样,看需求
f.SetCellStyle(myTableName, "A2", "C2", style)
//将第二个样式给行A2到C2,你也可以设置A1 A10这样,看需求,从这里可以看出,可以设置多个style组合,以便少定义一些样式
f.SetCellStyle(myTableName, "A2", "C2", style2)
f.SetCellValue(myTableName, "A2", "XC10746")
f.SetCellValue(myTableName, "B2", "春卷虎")
f.SetCellValue(myTableName, "C2", "表头都没有")
//4.设置当前索引的工作表为默认显示
f.SetActiveSheet(index)
//将文件另存为myTableName名.xlsx
if err := f.SaveAs(myTableName + ".xlsx"); err != nil {
println(err.Error())
}
}