流式写入

《Excelize 权威指南》图书出版,网上购买方式:人民邮电出版社 |异步社区 |天猫 |京东 |当当 |微店 |抖音 |拼多多

StreamWriter 用于定义流式写入器的数据类型。

  1. type StreamWriter struct {
  2. File *File
  3. Sheet string
  4. SheetID int
  5. // 还包含其他已过滤或未导出的字段
  6. }

CellStreamWriter.SetRow 中使用,用于指定单元格的值、公式和样式。

  1. type Cell struct {
  2. StyleID int
  3. Formula string
  4. Value interface{}
  5. }

RowOptsStreamWriter.SetRow 中使用,用于设置行样式。

  1. type RowOpts struct {
  2. Height float64
  3. Hidden bool
  4. StyleID int
  5. OutlineLevel int
  6. }

获取流式写入器

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

NewStreamWriter 通过给定的工作表名称返回流式写入器,用于向已存在的空白工作表写入大规模数据。请注意通过此方法按行向工作表写入数据后,必须调用 Flush 函数来结束流式写入过程,并需要确保所写入的行号是递增的,普通函数不能与流式函数混合使用在工作表中写入数据。写入过程中内存数据超过 16MB 时,流写入器将尝试使用磁盘上的临时文件来减少内存使用,此时您无法获取单元格值。例如,向工作表流式按行写入 102400 行 x 50 列带有样式的数据:

  1. f := excelize.NewFile()
  2. defer func() {
  3. if err := f.Close(); err != nil {
  4. fmt.Println(err)
  5. }
  6. }()
  7. sw, err := f.NewStreamWriter("Sheet1")
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }
  12. styleID, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "777777"}})
  13. if err != nil {
  14. fmt.Println(err)
  15. return
  16. }
  17. if err := sw.SetRow("A1",
  18. []interface{}{
  19. excelize.Cell{StyleID: styleID, Value: "Data"},
  20. []excelize.RichTextRun{
  21. {Text: "Rich ", Font: &excelize.Font{Color: "2354e8"}},
  22. {Text: "Text", Font: &excelize.Font{Color: "e83723"}},
  23. },
  24. },
  25. excelize.RowOpts{Height: 45, Hidden: false}); err != nil {
  26. fmt.Println(err)
  27. return
  28. }
  29. for rowID := 2; rowID <= 102400; rowID++ {
  30. row := make([]interface{}, 50)
  31. for colID := 0; colID < 50; colID++ {
  32. row[colID] = rand.Intn(640000)
  33. }
  34. cell, err := excelize.CoordinatesToCellName(1, rowID)
  35. if err != nil {
  36. fmt.Println(err)
  37. break
  38. }
  39. if err := sw.SetRow(cell, row); err != nil {
  40. fmt.Println(err)
  41. break
  42. }
  43. }
  44. if err := sw.Flush(); err != nil {
  45. fmt.Println(err)
  46. return
  47. }
  48. if err := f.SaveAs("Book1.xlsx"); err != nil {
  49. fmt.Println(err)
  50. }

流式设置单元格的公式和值:

  1. err := sw.SetRow("A1", []interface{}{
  2. excelize.Cell{Value: 1},
  3. excelize.Cell{Value: 2},
  4. excelize.Cell{Formula: "SUM(A1,B1)"}})

流式设置单元格的值和行样式:

  1. err := sw.SetRow("A1", []interface{}{
  2. excelize.Cell{Value: 1}},
  3. excelize.RowOpts{StyleID: styleID, Height: 20, Hidden: false})

流式设置单元格的值和行的分级显示:

  1. err := sw.SetRow("A1", []interface{}{
  2. excelize.Cell{Value: 1}}, excelize.RowOpts{OutlineLevel: 1})

按行流式写入工作表

  1. func (sw *StreamWriter) SetRow(cell string, values []interface{}, opts ...RowOpts) error

SetRow 通过给定的起始坐标和指向数组类型“切片”的指针将数据按行流式写入工作表中。请注意,在设置行之后,必须调用 Flush 函数来结束流式写入过程,并需要确所保写入的行号是递增的。

流式创建表格

  1. func (sw *StreamWriter) AddTable(table *Table) error

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

例1,在 A1:D5 区域流式创建表格:

  1. err := sw.AddTable(&excelize.Table{Range: "A1:D5"})

例2,在工作表 F2:H6 区域创建带有条件格式的表格:

  1. disable := false
  2. err := sw.AddTable(&excelize.Table{
  3. Range: "F2:H6",
  4. Name: "table",
  5. StyleName: "TableStyleMedium2",
  6. ShowFirstColumn: true,
  7. ShowLastColumn: true,
  8. ShowRowStripes: &disable,
  9. ShowColumnStripes: true,
  10. })

注意,表格坐标区域至少需要包含两行:字符型的标题行和内容行。每列标题行的字符需保证是唯一的,当前仅支持在每个工作表中流式创建一张表格,并且必须在调用该函数前通过 SetRow 流式设置表格的标题行数据。支持的表格样式与非流式创建表格 AddTable 相同。

流式插入分页符

  1. func (sw *StreamWriter) InsertPageBreak(cell string) error

根据给定的单元格坐标流式插入分页符。分页符是将工作表分成单独的页面以便打印的分隔线。

流式设置窗格

  1. func (sw *StreamWriter) SetPanes(panes *Panes) error

通过给定的窗格样式参数流式设置冻结窗格,必须在调用 SetRow 之前调用该函数设置窗格。

流式合并单元格

  1. func (sw *StreamWriter) MergeCell(topLeftCell, bottomRightCell string) error

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

流式设置列宽度

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

根据给定的列范围和宽度值设置单个或多个列的宽度,必须在调用 SetRow 之前调用该函数设置列宽度。例如设置工作表上 BC 列的宽度为 20

  1. err := sw.SetColWidth(2, 3, 20)

结束流式写入

  1. func (sw *StreamWriter) Flush() error

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