前言
在日常的开发中某些场景下,我们需要将表格转换为csv的格式,以方便程序读取或导入其他之类的操作,那么我们应该如何用Golang来实现这一功能呢?本篇文章我们就来小试一下!
模拟数据
首先,我们需要一份excel文件,这里我们随便指定一份表格,例如:
id | name | age | address |
---|---|---|---|
1 | 会员1 | 18 | 北京市xxx区001号 |
2 | 会员2 | 19 | 北京市xxx区002号 |
3 | 会员3 | 20 | 北京市xxx区003号 |
4 | 会员4 | 21 | 北京市xxx区004号 |
5 | 会员5 | 22 | 北京市xxx区005号 |
6 | 会员6 | 23 | 北京市xxx区006号 |
7 | 会员7 | 24 | 北京市xxx区007号 |
8 | 会员8 | 25 | 北京市xxx区008号 |
9 | 会员9 | 26 | 北京市xxx区009号 |
10 | 会员10 | 27 | 北京市xxx区010号 |
读取文件
模拟数据我们有了,那么我们就要通过golang读取这份excel文件,这里我们需要使用到一个依赖 github.com/tealeg/xlsx ,将它引入到我们工程中, 然后获取所有的sheet:
func readExcelFile(path string) (f *xlsx.File) { f, err := xlsx.OpenFile(path) if err != nil { fmt.Println("excel文件读取错误") panic(err) } return }
读取数据
上面我们将文件读取出来了,接着我们要分析sheet,获取最大行和最大列,然后再通过行/列索引来获取对应的单元格的数据:
rows := sheet.MaxRow for i := 0; i < rows; i++ { cols := sheet.MaxCol for j := 0; j < cols; j++ { cell := sheet.Cell(i, j) //通过行、列索引来获取对应的单元格 val := cell.Value fmt.Println(val) //单元格数据 } }
然后我们需要定义一个buffer将单元格数据写入进去,这里我们以制表符号作为csv的分隔符,最终再使用golang的ioutil.WriteFile
将数据写入到文件中去:
func parseSheetToCSV(sheet *xlsx.Sheet, toFile string) (err error) { b := &bytes.Buffer{} rows := sheet.MaxRow for i := 0; i < rows; i++ { cols := sheet.MaxCol for j := 0; j < cols; j++ { cell := sheet.Cell(i, j) val := cell.Value fmt.Println(val) b.WriteString(val) b.WriteString("\t") } b.WriteString("\r\n") } //写入数据到文件 err = ioutil.WriteFile(toFile, b.Bytes(), os.ModePerm) return }
执行
本程序所需要的核心方法都定义好了,接下来我们写main方法进行调用,这里我们以解析第一个sheet为例:
func main() { path, err := os.Getwd() if err != nil { panic(err) } file := readExcelFile(path + "/data.xlsx") err = parseSheetToCSV(file.Sheets[0], path+"/data.csv") if err != nil { panic(err) } fmt.Println("Excel转换CSV成功!") }
后记
最开始学习golang的时候,经常写转换工具来进行练习技术,本次为大家介绍了excel转csv的程序简易方法,当然还有一些特殊情况没有涉及到,例如单元格中有换行的字符处理等等,最后,感谢您的阅读!