Go日常食用之将Excel转换为CSV|Go主题月

2,731 阅读2分钟

前言

在日常的开发中某些场景下,我们需要将表格转换为csv的格式,以方便程序读取或导入其他之类的操作,那么我们应该如何用Golang来实现这一功能呢?本篇文章我们就来小试一下!

模拟数据

首先,我们需要一份excel文件,这里我们随便指定一份表格,例如:

idnameageaddress
1会员118北京市xxx区001号
2会员219北京市xxx区002号
3会员320北京市xxx区003号
4会员421北京市xxx区004号
5会员522北京市xxx区005号
6会员623北京市xxx区006号
7会员724北京市xxx区007号
8会员825北京市xxx区008号
9会员926北京市xxx区009号
10会员1027北京市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的程序简易方法,当然还有一些特殊情况没有涉及到,例如单元格中有换行的字符处理等等,最后,感谢您的阅读!