Go语言向excel写入1千万数据

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。

安装

go get github.com/xuri/excelize/v2

测试(流式写入1千万)

func testExcel() io.Reader {
	file := excelize.NewFile()
	//设置表名
	file.SetSheetName("Sheet1", "表1")
	//创建流式写入
	writer, err := file.NewStreamWriter("表1")
	//修改列宽
	writer.SetColWidth(1, 15, 12)
	//设置表头
	writer.SetRow("A1", []interface{}{"测试列名1", "测试列名2", "测试列名3", "测试列名4", "测试列名5", "测试列名6", "测试列名7", "测试列名8", "测试列名9", "测试列名10", "测试列名11", "测试列名12", "测试列名13", "测试列名14", "测试列名15"})
	if err != nil {
		return
	}
	for i := 1; i <= 10000000; i++ {
		//索引转单元格坐标
		cell, _ := excelize.CoordinatesToCellName(1, i+1)
		//添加的数据
		writer.SetRow(cell, []interface{}{"测试数据1", "测试数据2", "测试数据3", "测试数据4", "测试数据5", "测试数据6", "测试数据7", "测试数据8", "测试数据9", "测试数据10", "测试数据11", "测试数据12", "测试数据13", "测试数据14", "测试数据15"})
	}
	//结束流式写入
	writer.Flush()
    file.SaveAs("测试01.xlsx")
}
1千万消耗的时间

对比(非流式写入1百万)

func testExcel() {
	file := excelize.NewFile()
	//设置表名
	file.SetSheetName("Sheet1", "表1")
	//修改列宽
	file.SetColWidth("表1", "A", "O", 12)
	//设置表头
	file.SetSheetRow("表1", "A1", &[]interface{}{"测试列名1", "测试列名2", "测试列名3", "测试列名4", "测试列名5", "测试列名6", "测试列名7", "测试列名8", "测试列名9", "测试列名10", "测试列名11", "测试列名12", "测试列名13", "测试列名14", "测试列名15"})
	for i := 1; i <= 1000000; i++ {
		//索引转单元格坐标
		cell, _ := excelize.CoordinatesToCellName(1, i+1)
		//添加的数据
		file.SetSheetRow("表1", cell, &[]interface{}{"测试数据1", "测试数据2", "测试数据3", "测试数据4", "测试数据5", "测试数据6", "测试数据7", "测试数据8", "测试数据9", "测试数据10", "测试数据11", "测试数据12", "测试数据13", "测试数据14", "测试数据15"})
	}
	//保存文件
	file.SaveAs("测试01.xlsx")
}
1百万耗费的时间

流式写入的相关函数

  • 获取流式写入器

func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error)

 NewStreamWriter 通过给定的工作表名称返回流式写入器,用于生成包含大规模数据的工作表。请注意通过此方法按行向工作表写入数据后,必须调用 Flush 函数来结束流式写入过程,并需要确所保写入的行号是递增的,普通 API 不能与流式 API 混合使用在工作表中写入数据。

  • 按行流式写入工作表

func (sw *StreamWriter) SetRow(axis string, slice interface{}) error

 SetRow 通过给定的起始坐标和指向数组类型“切片”的指针将数据按行流式写入工作表中。

  • 流式创建表格

func (sw *StreamWriter) AddTable(hCell, vCell, format string) error

 根据给定的单元格坐标区域和条件格式流式创建表格。

  • 流式合并单元格

func (sw *StreamWriter) MergeCell(hCell, vCell string) error

 通过给定的单元格坐标区域流式合并单元格,当前仅支持合并非交叠区域单元格。

  • 流式设置列宽度

func (sw *StreamWriter) SetColWidth(min, max int, width float64) error

 根据给定的列范围和宽度值设置单个或多个列的宽度,必须在调用 SetRow 之前调用该函数设置列宽度。

  • 结束流式写入

func (sw *StreamWriter) Flush() error

 Flush 用于结束流式写入过程。

常用的函数

  • 创建工作簿

func NewFile() *File

 使用 NewFile 新建 Excel 工作薄,新创建的工作簿中会默认包含一个名为 Sheet1 的工作表。

  • 打开工作簿

func OpenFile(filename string, opt ...Options) (*File, error)

 使用 OpenFile 打开已有 Excel 文档。

  • 打开带密码的工作簿

file, _ := excelize.OpenFile("Book1.xlsx", excelize.Options{Password: "123456"})
  • 保存

func (f *File) Save(opts ...Options) error

 使用 Save 保存对 Excel 文档的编辑。

  • 新建工作表

func (f *File) NewSheet(sheet string) int

 根据给定的工作表名称来创建新工作表,并返回工作表在工作簿中的索引。请注意,在创建新的工作簿时,将包含名为 Sheet1 的默认工作表。

  • 设置工作表名称

func (f *File) SetSheetName(oldName, newName string)

 根据给定的新旧工作表名称重命名工作表。工作表名称最多允许使用 31 个字符,此功能仅更改工作表的名称,而不会更新与单元格关联的公式或引用中的工作表名称。因此使用此功能重命名工作表后可能导致公式错误或参考引用问题。

  • 复制行

func (f *File) DuplicateRowTo(sheet string, row, row2 int) error

 根据给定的工作表名称和行号,在指定行后复制该行。

  • 插入列

func (f *File) InsertCols(sheet, col string, n int) error

 根据给定的工作表名称、列名称和要插入的列数,在指定列前插入空白列。

  • 插入行

func (f *File) InsertRows(sheet string, row, n int) error

 根据给定的工作表名称、行号和要插入的行数,在指定行前插入空白行。

  • 设置列宽度

func (f *File) SetColWidth(sheet, startCol, endCol string, width float64) error

 根据给定的工作表和列名获取工作表中指定列的宽度。

  • 设置行高度

func (f *File) SetRowHeight(sheet string, row int, height float64) error

 根据给定的工作表名称和行号获取工作表中指定行的高度。

  • 插入列

func (f *File) InsertCols(sheet, col string, n int) error

根据给定的工作表名称、列名称和要插入的列数,在指定列前插入空白列。

  • 插入行

func (f *File) InsertRows(sheet string, row, n int) error

 根据给定的工作表名称、行号和要插入的行数,在指定行前插入空白行。

  • 保护工作表

func (f *File) ProtectSheet(sheet string, settings *FormatSheetProtection) error

err := f.ProtectSheet("表1", &excelize.FormatSheetProtection{
    AlgorithmName: "SHA-512",
    Password:      "123456789",
    EditScenarios: false,
})

type FormatSheetProtection struct {
    AlgorithmName       string
    Password            string
    EditScenarios       bool
    AutoFilter          bool
    DeleteColumns       bool
    DeleteRows          bool
    EditObjects         bool
    FormatCells         bool
    FormatColumns       bool
    FormatRows          bool
    InsertColumns       bool
    InsertHyperlinks    bool
    InsertRows          bool
    PivotTables         bool
    SelectLockedCells   bool
    SelectUnlockedCells bool
    Sort                bool
}
  • 取消保护工作表

func (f *File) UnprotectSheet(sheet string, password ...string) error

根据给定的工作表名称取消保护该工作表,指定第二个可选密码参数以通过密码验证来取消工作表保护。 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lo浅安灬时光ve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值