前言
本文主要讲解在 Golang 中实现将 excel 转csv,以方便程序读取或导入其他之类的操作。
模拟数据
首先准备一个 excel 文件,随便填一些模拟数据,示例如下:
id | name | age | address |
---|---|---|---|
1 | 张三 | 18 | 北京市 xxx 区 001 号 |
2 | 李四 | 19 | 北京市 xxx 区 002 号 |
3 | 王五 | 20 | 北京市 xxx 区 003 号 |
读取文件
接下来我们要通过 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 成功!")
}