当前位置:网站首页>使用go语言读取txt文件写入excel中

使用go语言读取txt文件写入excel中

2022-07-05 07:25:00 幽默的荆轲君

package main

// usage:
// go mod init
// go mod tidy
// go env -w GO111MODULE=on
// go env -w GOPROXY=https://goproxy.cn,direct
// go get github.com/sirupsen/logrus
// go get github.com/xuri/excelize/v2
// go build

import (
	"flag"
	"fmt"
	"github.com/sirupsen/logrus"
	"github.com/xuri/excelize/v2"
	"io/ioutil"
	"log"
	"os"
	"strconv"
	"strings"
	"time"
)

func getData(filepath string) [][]string {
    
	logrus.Info("this function is used to getData,filepath is -->>", filepath)
	content, err := ioutil.ReadFile(filepath)
	var target [][]string
	if err != nil {
    
		panic(err)
	}
	contentList := strings.Split(strings.TrimSpace(string(content)), "\r\n")
	for _, val := range contentList {
    
		target = append(target, strings.Split(val, " "))
	}
	return target
}

func writeData(f *excelize.File, sheetName string, number int, cellList [][]string) bool {
    
	logrus.Info("this function is used to writeData")
	for i, line := range cellList {
    
		tmp := "B" + strconv.Itoa(i+number)
		if err := f.SetSheetRow(sheetName, tmp, &line); err != nil {
    
			logrus.Println("写入行单元格失败", err)
			return false
		}
	}
	return true
}

func getFilePath() (dirname, filepath string) {
    
	/* 定义变量接收控制台参数 */

	 文件夹名
	//var dirname string
	//
	 文件名
	//var path string

	flag.StringVar(&dirname, "d", "", "存放文件的文件夹名 默认为空")
	flag.StringVar(&filepath, "f", "", "按特定顺序写的文件列表名,默认为空")
	flag.Parse()
	return dirname, filepath
}

func main() {
    
	var filePathList []string
	sheetName := "Sheet1"
	if dirname, filepath := getFilePath(); dirname == "" && filepath == "" {
    
		logrus.Info("执行./main -h 查看用法")
		os.Exit(-1)
	} else {
    
		if dirname != "" {
    
			logrus.Info("dirname不为空")
			//获取文件或目录相关信息
			fileInfoList, err := ioutil.ReadDir(dirname)
			if err != nil {
    
				log.Fatal(err)
			}
			fmt.Println(len(fileInfoList))
			for i := range fileInfoList {
    
				filePathList = append(filePathList, dirname+"/"+fileInfoList[i].Name())
			}
			logrus.Info(filePathList, "case1")
		} else {
    
			logrus.Info("文件列表名不为空")
			content, err := ioutil.ReadFile(filepath)
			if err != nil {
    
				panic(err)
			}
			filePathList = strings.Split(strings.TrimSpace(string(content)), "\r\n")
			logrus.Info(filePathList, "case2")
		}
	}

	f := excelize.NewFile()
	logrus.Info("this function is used to getData")
	start := 0
	for _, filePath := range filePathList {
    
		// step1: get data
		logrus.Info(filePath)
		target := getData(filePath)
		logrus.Info(target, len(target))

		titleTmp := "A" + strconv.Itoa(start+1)
		if err := f.SetCellDefault(sheetName, titleTmp, filePath); err != nil {
    
			logrus.Println(err, "err")
			return
		}
		// step2: 写入单元格
		if res := writeData(f, sheetName, start+1, target); res != true {
    
			logrus.Println(res, "err")
			return
		}
		// step3: 合并单元格
		firstString := "A" + strconv.Itoa(start+1)
		start += len(target)
		endString := "A" + strconv.Itoa(start)
		logrus.Println(firstString, endString)
		if err := f.MergeCell(sheetName, firstString, endString); err != nil {
    
			logrus.Println("合并单元格失败", err)
			return
		}

		// step4: 加颜色
		// 表格填充颜色
		style, err := f.NewStyle(&excelize.Style{
    
			Alignment: &excelize.Alignment{
    Horizontal: "center", Vertical: "center"},
			Fill:      excelize.Fill{
    Type: "pattern", Color: []string{
    "#FFFF00"}, Pattern: 1},
		})

		if err != nil {
    
			logrus.Println(err)
			return
		}

		err = f.SetCellStyle(sheetName, "A1", endString, style)
		if err := f.SetColWidth(sheetName, "A", "A", 75); err != nil {
    
			logrus.Println(err)
			return
		}
	}
	// 根据指定路径保存文件
	now := time.Now() //获取当前时间
	timeString := now.Format("2006_01_02_15_04")
	if err := f.SaveAs("target1_" + timeString + ".xlsx"); err != nil {
    
		logrus.Println("保存Book1.xlsx失败", err)
		return
	}
}

参考:

https://xuri.me/excelize/zh-hans/sheet.html

原网站

版权声明
本文为[幽默的荆轲君]所创,转载请带上原文链接,感谢
https://guowenjia.blog.csdn.net/article/details/125590880