利用golang生成.csv文件(需加BOM表头,避免excel打开.csv文件中文乱码)

注意:
生成.csv文件时,需写入UTF-8 BOM表头,避免使用excel软件打开.csv文件出现中文乱码

writer.WriteString("\xEF\xBB\xBF")
package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
	"strings"
)

// GenerateCsvFile 通过网络下载原.csv文件,将经过筛选后的行记录(比如去除包含"黑名单"字样的记录),导出到一个新的.csv文件
func GenerateCsvFile(url string) {
    fmt.Println("开始导出...")

	// csv下载文件示例链接:http://xxx.com/downloads/test.csv
	// 下载的csv如果用 ioutil.ReadAll() 读出并转为字符串后,打开后每行单元格间默认是按英文逗号分隔开的txt文本
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("http.Get err: ", err)
		return
	}
	defer resp.Body.Close()

	// 读取下载好的csv文件数据流
	byteData, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("ioutil.ReadAll err: ", err)
		return
	}

	// 将csv文件按行分割
	rowDataArr := strings.Split(string(byteData), "\n")
	if len(rowDataArr) <= 1 {
		fmt.Println("仅有表头数据不导出,跳过...")
		return
	}

	// 默认创建.csv格式的文件,体积小,可以直接用excel打开(需要加BOM表头)
	file, err := os.OpenFile("./test.csv", os.O_CREATE|os.O_RDWR, 0666)
	if err != nil {
		fmt.Println("os.OpenFile err: ", err)
		return
	}
	defer file.Close()

	// 写入UTF-8 BOM头,避免使用excel软件打开.csv文件出现中文乱码
	writer := bufio.NewWriter(file)
	writer.WriteString("\xEF\xBB\xBF")

	// 遍历文件并循环写入(不适用于大文件,一次性读取操作很占用内存)
	for i := 0; i < len(rowDataArr); i++ {
		if strings.Contains(rowDataArr[i], "") { // 示例:去除包含"黑名单"字样的记录
			continue
		}
		writer.WriteString(rowDataArr[i] + "\n")
		writer.Flush()
	}

    fmt.Println("导出成功...")
}

func main() {
	GenerateCsvFile("http://xxx.com/downloads/xxx.csv") // url示例:xxx.csv
	return
}

你可能感兴趣的:(Golang,excel,golang,BOM)