Go问答 一个自己实现的 Excel as relate db 读取库 go-excel

yhf_szb · 2017年09月18日 · 最后由 xuri 回复于 2020年10月12日 · 332 次阅读

在复杂的系统中(例如游戏),有时候为了便于非专业人员(策划)设置一些配置,会使用 Excel 作为一种轻量级的关系数据库或者配置文件,毕竟对于很多非开发人员来说,配个 Excel 要比写 json 或者 yaml 什么简单得多。

而且 Excel 可以写入各种格式和字体标红单元格,维护成本大大降低。

这种场景下,读取特定格式(符合关系数据库特点的表格)的数据会比各种花式写入 Excel 的功能更重要,毕竟从编辑上来说微软提供的 Excel 本身功能就非常强大了,而现在我找到的 Excel 库的功能都过于强大了,用起来有点浪费,于是写了这个简化库。

这个库的工作参考了 tealeg/xlsx 的部分实现和读取逻辑。

假设有一个 xlsx 文件,里边有个 Sheet 叫 “Standard”,它的数据结构如下:

ID NameOf Age Slice UnmarshalString
1 Andy 1 1\ 2
2 Leo 2 2\ 3\
3 Ben 3 3\ 4\
4 Ming 4 1 {"Foo":"Ming"}
  • 第 0 行是标题行。
  • 第 1 行开始是数据行。

以下是最简单的写法

// defined a struct
type Standard struct {
    // use field name as default column name
    ID            int
    // column means to map the column name
    Name      string `xlsx:"column(NameOf)"`
    // you can map a column into more than one field
    NamePtr *string `xlsx:"column(NameOf)"`
    // omit `column` if only want to map to column name, it's equal to `column(AgeOf)`
    Age         int     `xlsx:"AgeOf"`
    // split means to split the string into slice by the `|`
    Slice       []int `xlsx:"split(|)"`
    // *Temp implement the `encoding.BinaryUnmarshaler`
    Temp      *Temp `xlsx:"column(UnmarshalString)"`
    // use '-' to ignore.
    Ignored   string `xlsx:"-"`
}

// func (this Standard) GetXLSXSheetName() string {
//  return "Some other sheet name if need"
// }

type Temp struct {
    Foo string
}

// self define a unmarshal interface to unmarshal string.
func (this *Temp) UnmarshalBinary(d []byte) error {
    return json.Unmarshal(d, this)
}

func main() {
    // will assume the sheet name as "Standard" from the struct name.
    var stdList []Standard
    err := excel.UnmarshalXLSX("./testdata/simple.xlsx", &stdList)
    if err != nil {
        panic(err)
    }
}

提供一些更复杂的读取逻辑,详细看文档:https://github.com/szyhf/go-excel

时间关系,可能看 test 目录里的代码更好理解……

> 欢迎捉虫提 bug。

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

推荐一个功能丰富、兼容性好、高性能的 Excel 文档基础库:https://github.com/xuri/excelize

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册