Go日常食用之将Excel转换为CSV

664次阅读
没有评论

前言

在日常的开发中某些场景下,我们需要将表格转换为 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 的程序简易方法,当然还有一些特殊情况没有涉及到,例如单元格中有换行的字符处理等等,最后,感谢您的阅读!

1
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy2021-03-22发表,共计1515字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码
载入中...