流式寫入

StreamWriter 用於定義流式寫入器的資料類別。

type StreamWriter struct {
    File    *File
    Sheet   string
    SheetID int
    // 還包含其他已過濾或未導出的欄位
}

CellStreamWriter.SetRow 中使用,用於指定存儲格的值、公式和樣式。

type Cell struct {
    StyleID int
    Formula string
    Value   interface{}
}

RowOptsStreamWriter.SetRow 中使用,用於設定列樣式。

type RowOpts struct {
    Height       float64
    Hidden       bool
    StyleID      int
    OutlineLevel int
}

獲取流式寫入器

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

NewStreamWriter 透過給定的工作表名稱返回流式寫入器,用於向已存在的空白工作表寫入大規模數據。請注意透過此方法按列向工作表寫入資料後,必須調用 Flush 函式來結束流式寫入過程,並需要確保所寫入的列號是遞增的,普通函式不能與流式函式混合使用在工作表中寫入資料。寫入過程中內存資料超過 16MB 時,流寫入器將嘗試使用磁盤上的臨時文件來減少內存使用,此時您無法獲取存儲格值。例如,向工作表流式按列寫入 102400 列 x 50 欄帶有樣式的資料:

f := excelize.NewFile()
defer func() {
    if err := f.Close(); err != nil {
        fmt.Println(err)
    }
}()
sw, err := f.NewStreamWriter("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
styleID, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "777777"}})
if err != nil {
    fmt.Println(err)
    return
}
if err := sw.SetRow("A1",
    []interface{}{
        excelize.Cell{StyleID: styleID, Value: "Data"},
        []excelize.RichTextRun{
            {Text: "Rich ", Font: &excelize.Font{Color: "2354e8"}},
            {Text: "Text", Font: &excelize.Font{Color: "e83723"}},
        },
    },
    excelize.RowOpts{Height: 45, Hidden: false}); err != nil {
    fmt.Println(err)
    return
}
for rowID := 2; rowID <= 102400; rowID++ {
    row := make([]interface{}, 50)
    for colID := 0; colID < 50; colID++ {
        row[colID] = rand.Intn(640000)
    }
    cell, err := excelize.CoordinatesToCellName(1, rowID)
    if err != nil {
        fmt.Println(err)
        break
    }
    if err := sw.SetRow(cell, row); err != nil {
        fmt.Println(err)
        break
    }
}
if err := sw.Flush(); err != nil {
    fmt.Println(err)
    return
}
if err := f.SaveAs("Book1.xlsx"); err != nil {
    fmt.Println(err)
}

流式設定存儲格的公式和值:

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

流式設定存儲格的值和列樣式:

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

流式設定存儲格的值和列的分級顯示:

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

按行流式寫入工作表

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

SetRow 透過給定的起始坐標和指向數組類別「切片」的指針將資料按行流式寫入工作表中。請注意,在設定行之後,必須調用 Flush 函式來結束流式寫入過程,並需要確所保寫入的列號是遞增的。

流式創建表格

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

根據給定的存儲格坐標區域和條件式格式流式創建表格。

例1,在 A1:D5 區域流式創建表格:

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

例2,在工作表 F2:H6 區域創建帶有條件式格式的表格:

disable := false
err := sw.AddTable(&excelize.Table{
    Range:             "F2:H6",
    Name:              "table",
    StyleName:         "TableStyleMedium2",
    ShowFirstColumn:   true,
    ShowLastColumn:    true,
    ShowRowStripes:    &disable,
    ShowColumnStripes: true,
})

注意,表格坐標區域至少需要包含兩列:字符型的標題列和內容列。每欄標題列的字符需保證是唯一的,當前僅支援在每個工作表中流式創建一張表格,並且必須在調用該函式前透過 SetRow 流式設定表格的標題列數據。支援的表格樣式與非流式創建表格 AddTable 相同。

流式插入分頁符

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

根據給定的儲存格坐標插入分頁符。分頁符是將工作表分成單獨的頁面以便列印的分隔線。

流式设定窗格

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

透過給定的窗格樣式參數流式設定凍結窗格,必須在調用 SetRow 之前調用該函式設定窗格。

流式合併存儲格

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

透過給定的存儲格坐標區域流式合併存儲格,當前僅支援合併非交疊區域存儲格。

流式設定欄寬度

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

根據給定的欄範圍和寬度值設定單個或多個欄的寬度,必須在調用 SetRow 之前調用該函式設定欄寬度。例如設定工作表上 BC 欄的寬度為 20

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

結束流式寫入

func (sw *StreamWriter) Flush() error

Flush 用於結束流式寫入過程。

results matching ""

    No results matching ""