[Go] Excel 處理

程式語言:Go
Package:github.com/tealeg/xlsx
官方 Github
官方文件

功能:處理 excel,只能對 xlsx 處理
提醒:有時因網頁產生的 xlsx 並非正式格式,會導致處理錯誤,可用 office Excel 重新存檔即可

讀寫檔
package main

import (
    "fmt"

    "github.com/tealeg/xlsx"
)

type dataStruct struct {
    C1 string `xlsx:"0"`
    C2 bool   `xlsx:"1"`
    C3 int    `xlsx:"2"`
}

func main() {
    path := `D:\test.xlsx`
    fmt.Println("write...")
    writeFile(path)
    fmt.Println("read...")
    readFile(path)
}

func readFile(path string) {
    var err error

    xlFile, err := xlsx.OpenFile(path)
    if err != nil {
        panic("Open file Error")
    }

    // 列印所有數值
    for _, sheet := range xlFile.Sheets {
        for _, row := range sheet.Rows {
            for _, cell := range row.Cells {
                text := cell.String()
                fmt.Printf("%s\t", text)
            }
            fmt.Printf("\n")
        }
    }

    var sheet *xlsx.Sheet
    var row *xlsx.Row
    var cell *xlsx.Cell

    sheet = xlFile.Sheets[0]

    // 讀取所有值到 slice
    var dataSlice [][][]string
    dataSlice, err = xlsx.FileToSlice(path)
    fmt.Printf("%v\n", dataSlice)

    // 在 R2 讀取一行 row
    readRow(sheet, 1)

    // 讀取 R3C2 位置
    cell = sheet.Cell(2, 1)
    fmt.Println(cell.Value)

    // 讀取第五行到 struct
    data := dataStruct{}
    row = sheet.Rows[4]
    row.ReadStruct(&data)
    fmt.Printf("%v", data)
}

func readRow(sheet *xlsx.Sheet, n int) {
    // 確認有足夠的 rows
    if len(sheet.Rows) < n {
        fmt.Println("")
    }

    var row = sheet.Rows[n]
    fmt.Printf("%v\n", row.Cells)
}

func writeFile(path string) {
    var file *xlsx.File
    var sheet *xlsx.Sheet
    var row *xlsx.Row
    var cell *xlsx.Cell
    var err error

    // 新增檔案
    file = xlsx.NewFile()
    sheet, err = file.AddSheet("Sheet123")
    if err != nil {
        fmt.Printf(err.Error())
    }

    // 在 R2 插入一行 row
    insertRow(sheet, 1)

    // 寫入 R3C2 位置
    cell = sheet.Cell(2, 1)
    cell.Value = "R3C2"

    // 寫入 slice
    row = sheet.AddRow()
    row.WriteSlice(&[]int{1, 2, 3}, -1)

    // 寫入 struct
    data := dataStruct{
        C1: "C1",
        C2: true,
        C3: 3,
    }
    row = sheet.AddRow()
    row.WriteStruct(&data, -1)

    // 存檔
    err = file.Save(path)
    if err != nil {
        fmt.Printf(err.Error())
    }
}

func insertRow(sheet *xlsx.Sheet, n int) {
    // 確認有足夠的 rows
    for ; len(sheet.Rows) < n; sheet.AddRow() {

    }

    var row = xlsx.Row{Sheet: sheet}
    rear := append([]*xlsx.Row{}, sheet.Rows[n:]...)
    sheet.Rows = append(sheet.Rows[:n], &row)
    sheet.Rows = append(sheet.Rows, rear...)
    cell := row.AddCell()
    cell.Value = fmt.Sprintf("R%d 插入一行 row", n+1)
}

參考

替代方案 excelize

留言