51

go版本Excel导入脚本

 5 years ago
source link: https://studygolang.com/articles/17019?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一直挺想用 go 的,但是没想到能干啥,前段时间正好有个任务导入 Excel 到后台数据库,用 Python 的话我可能分分钟就写好了,但是作死的我就想试下 go,因为 go 可以打包成可执行程序包,然后就可以不依赖 go 的环境。

直接编码

使用 flag 获取终端参数解析

path := flag.String("path", "", "excel 路径")
url := flag.String("url", "**", "服务器地址")
flag.Parse()

这里定义了 path 路径和服务器地址 url,唯一需要注意的是,这里变量返回都是指针。flag 有个好处,他的参数都是形如( math defaultValue,$description),所以在执行 -h 的时候,都会返回 key 以及对应的 description。

使用 Luxurioust/excelize 读取Excel文件

xlsx, err := excelize.OpenFile(*path)
rows := xlsx.GetRows("Sheet1")
for r, row := range rows {
    fmt.Println(r)
    for c, col := range row {
        fmt.Println(c)
        fmt.Println(col)
    }
}

这个包用起来还是很舒服,唯一一点只支持 xlsx 格式,对于老版本的 xls 格式可能需要先转化了才能使用。rows 为一个二维数组,参数为 sheet 名称,默认的名称都是 Sheet1

使用自带的 net/http 发送请求

str, _ := json.Marshal(data)
resp, err := http.Post(url,
    "application/json",
    strings.NewReader(string(str)))
if err != nil {
    fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
fmt.Println(string(body))

go 自带的的 http 就是这么好用,post 形式发送了一个 json 包,这个 jsonEncode 用起来稍微有点不爽但是也还好。

打包程序

$ go build  main.go

就可以将这个脚本打包成一个可执行文件了,但是发现文件还挺大的,我以为只有几百 k 呢,都 8m 多了

压缩程序

$ brew install upx
$ upx main

upx 是一个专门的压缩打包可执行文件的程序,可以优化包体积。

这里压缩过的包不能使用了,暂时没有深究什么原因。所以寻找其他方式

再次优化

$ go build -ldflags -w main.go

发现这样弄就可以减少 1m 的体积,还是挺可观的,现在有一个可执行文件了,不用对方有 golang 环境,拿过去直接可以运行跑起来。go 就是优秀!

参考


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK