go版本Excel导入脚本
追风骚年 · · 2518 次点击 · · 开始浏览一直挺想用 go 的,但是没想到能干啥,前段时间正好有个任务导入 Excel 到后台数据库,用 Python 的话我可能分分钟就写好了,但是作死的我就想试下 go,因为 go 可以打包成可执行程序包,然后就可以不依赖 go 的环境。
直接编码
使用 flag 获取终端参数解析
path := flag.String("path", "", "excel 路径")
url := flag.String("url", "**", "服务器地址")
flag.Parse()
这里定义了 path 路径和服务器地址 url,唯一需要注意的是,这里变量返回都是指针。flag 有个好处,他的参数都是形如(key,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 就是优秀!
参考
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
一直挺想用 go 的,但是没想到能干啥,前段时间正好有个任务导入 Excel 到后台数据库,用 Python 的话我可能分分钟就写好了,但是作死的我就想试下 go,因为 go 可以打包成可执行程序包,然后就可以不依赖 go 的环境。
直接编码
使用 flag 获取终端参数解析
path := flag.String("path", "", "excel 路径")
url := flag.String("url", "**", "服务器地址")
flag.Parse()
这里定义了 path 路径和服务器地址 url,唯一需要注意的是,这里变量返回都是指针。flag 有个好处,他的参数都是形如(key,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 就是优秀!