-
创建一个流式的写入器
func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error) -
按行写入
func (sw *StreamWriter) SetRow(axis string, values []interface{}, opts ...RowOpts) error -
添加表格
func (*excelize.StreamWriter).AddTable(hcell string, vcell string, format string) error -
合并单元格
func (*excelize.StreamWriter).MergeCell(hcell string, vcell string) error -
结束流式写入
func (*excelize.StreamWriter).Flush() error -
设置列宽
func (*excelize.StreamWriter).SetColWidth(min int, max int, width float64) error
流式写入 和 普通写入的区别
流式写入整行 数据 func (sw *StreamWriter) SetRow(axis string, values []interface{}, opts ...RowOpts) error
参数 values 可以是只有值的 切片,也可以是 excelize.Cell 结构体类型的切片
普通写入整行 func (*excelize.File).SetSheetRow(sheet string, axis string, slice interface{}) error
参数只能是值类型的切片,如果是结构体类型的,就会按打印的方式赋值给单元格
流式写入 添加表格时,如果第三个参数为空,就不会创建表格
普通的创建表格,如果第三个参数是空,只会在第一行添加上筛选
示例文件 main.go
package main
import (
"fmt"
"math/rand"
"github.com/bxcodec/faker/v3"
"github.com/xuri/excelize/v2"
)
func main() {
wb := excelize.NewFile()
wb.Path = "../excel_files/TMP_07.xlsx"
sheetName := wb.GetSheetName(wb.GetActiveSheetIndex())
// 生成流写入对象
streamSheet, err := wb.NewStreamWriter(sheetName)
if err != nil {
fmt.Println(err)
}
// 设置一整行的值 只有值
// 先构造数据
// 姓名 年龄 性别 工资
// 使用faker 模块构造测试数据
for i := 0; i < 10; i++ { // 行
var row = make([]interface{}, 4)
row[0] = faker.Name()
row[1] = rand.Intn(100)
row[2] = faker.Gender()
row[3] = rand.Intn(10000) / 100
streamSheet.SetRow(fmt.Sprintf("A%d", i), row)
}
// 值 + 样式
// 先定义样式
sty_idx1, err := wb.NewStyle(`{"alignment":{
"horizontal":"center",
"vertical":"center"
},"number_format":0
,"fill":{
"type":"pattern",
"color":["#FF00FF"],
"pattern":1
}}`)
if err != nil {
fmt.Println(err)
}
sty_idx2, _ := wb.NewStyle(`{"alignment":{
"horizontal":"center",
"vertical":"center"
},"number_format":1}`)
sty_idx3, _ := wb.NewStyle(`{"alignment":{
"horizontal":"center",
"vertical":"center"
},"number_format":2}`)
// 直接用excelize.Cell 结构体创建单元格,然后添加
for i := 0; i < 10; i++ { // 行
var row = make([]interface{}, 4)
row[0] = excelize.Cell{StyleID: sty_idx1, Value: faker.Name()}
row[1] = excelize.Cell{StyleID: sty_idx2, Value: rand.Intn(100)}
row[2] = excelize.Cell{StyleID: sty_idx1, Value: faker.Gender()}
row[3] = excelize.Cell{StyleID: sty_idx3, Value: rand.Intn(10000) / 100}
streamSheet.SetRow(fmt.Sprintf("A%d", i+15), row)
}
// 流式添加表格 好像没有作用
if err := streamSheet.AddTable("A1", "D10", ``); err != nil {
fmt.Println(err)
}
// 带样式的
if err := streamSheet.AddTable("AA1", "Ak6", `{
"table_name":"table",
"table_style":"TableStyleMedium3",
"show_row_stripes":true
}`); err != nil {
fmt.Println(err)
}
// 设置列宽
if err := streamSheet.SetColWidth(1, 4, 18); err != nil {
fmt.Println(err)
}
// 合并单元格
if err := streamSheet.MergeCell("F1", "F10"); err != nil {
fmt.Println(err)
}
// 执行了 flush 才算是写进去了
streamSheet.Flush()
// 非流式写入整行数据
// 构造数据
sheet_idx := wb.NewSheet("Sheet2")
sheetName2 := wb.GetSheetName(sheet_idx)
// 先设置表头 最后一个参数是指针
if err := wb.SetSheetRow(sheetName2, "A1", &[]string{"NAME", "AGE", "GENDER", "PRICE"}); err != nil {
fmt.Println(err)
}
if err := wb.SetSheetRow(sheetName2, "A2", &[]string{"姓名", "年龄", "性别", "工资"}); err != nil {
fmt.Println(err)
}
// 构造数据并整行插入数据 不支持excelize.Cell对象的方式
for i := 0; i < 10; i++ {
var row = make([]interface{}, 4)
for j := 0; j < len(row); j++ {
switch j {
case 0:
row[j] = faker.Name()
case 1:
row[j] = rand.Intn(100)
case 2:
row[j] = faker.Gender()
case 3:
row[j] = rand.Intn(10000) / 100
}
}
if err := wb.SetSheetRow(sheetName2, fmt.Sprintf("A%d", i+3), &row); err != nil {
fmt.Println(err)
}
}
wb.Save()
}
更多内容去到大佬的文档或者视频
作者大佬的文档 : https://xuri.me/excelize/zh-hans/
作者大佬的视频 : https://www.bilibili.com/video/BV1hU4y1F7wQ



