安装
go get github.com/360EntSecGroup-Skylar/excelize/v2
单行写入
package excelize
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"testing"
)
// 表格写入(单个赋值)
func TestWriteExcelBySetCellValue(t *testing.T) {
excel := excelize.NewFile()
// 创建一个工作表
sheet := excel.NewSheet("学校")
// 设置新建工作表(学校)的内容
_ = excel.SetCellValue("学校", "A2", "北京大学")
_ = excel.SetCellValue("学校", "A3", "南京大学")
// 设置sheet1的内容(默认创建)
excel.SetCellValue("Sheet1","A1","张三")
excel.SetCellValue("Sheet1","A2","小明")
// 设置默认工作表
excel.SetActiveSheet(sheet)
// 保存表格
if err := excel.SaveAs("../../tmp/test.xlsx");err != nil {
t.Error(err)
return
}
fmt.Println("执行完成")
}
按行赋值写入
// 表格写入(按行写入)
func TestWriteByLine(t *testing.T) {
excel := excelize.NewFile()
// 写入标题
titleSlice := []interface{}{"序号", "姓名", "年龄", "性别"}
_ = excel.SetSheetRow("Sheet1", "A1", &titleSlice)
data := []interface{}{
[]interface{}{1, "张三", 19, "男"},
[]interface{}{2, "小丽", 18, "女"},
[]interface{}{3, "小明", 20, "男"},
}
// 遍历写入数据
for key, datum := range data {
axis := fmt.Sprintf("A%d", key+2)
// 利用断言,转换类型
tmp,_ := datum.([]interface{})
_ = excel.SetSheetRow("Sheet1", axis, &tmp)
}
// 保存表格
if err := excel.SaveAs("../../tmp/line.xlsx"); err != nil {
t.Error(err)
return
}
fmt.Println("执行完成")
}
当写入表格的内容很大时,推荐使用流式写入,可以有效防止内存溢出。
// 表格写入(按行流式写入)
func TestWriteByStream(t *testing.T) {
excel := excelize.NewFile()
// 获取流式写入器
streamWriter, err := excel.NewStreamWriter("Sheet1")
if err != nil {
t.Error("获取流式写入器失败: " + err.Error())
return
}
// 按行写入
if err := streamWriter.SetRow("A1", []interface{}{"序号", "商品码", "价格"}); err != nil {
t.Error("获取流式写入器失败: " + err.Error())
return
}
// 制作数据
// 设置随机因子
rand.Seed(time.Now().Unix())
for i := 2; i < 500000; i++ {
tmp := []interface{}{
i,
fmt.Sprintf("P-%d", rand.Intn(100000000)),
fmt.Sprintf("%.2f", float64(rand.Intn(10))+rand.Float64()),
}
_ = streamWriter.SetRow("A"+strconv.Itoa(i), tmp)
}
// 调用 Flush 函数来结束流式写入过程
if err = streamWriter.Flush(); err != nil {
t.Error("结束流式写入失败: " + err.Error())
return
}
// 保存表格
if err := excel.SaveAs("../../tmp/stream.xlsx"); err != nil {
t.Error(err)
return
}
fmt.Println("执行完成")
}
读取
// 读取表格
func TestRead(t *testing.T) {
// 打开表格文件
openFile, err := excelize.OpenFile("../../tmp/line.xlsx")
if err != nil {
t.Error("打开表格文件失败: " + err.Error())
return
}
// 读取指定工作表所有数据
rows, err := openFile.GetRows("Sheet1")
if err != nil {
t.Error("读取失败: " + err.Error())
return
}
for _, row := range rows {
fmt.Printf("%+v\n",row)
}
fmt.Println("执行完成!")
}