当前位置:网站首页>使用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
边栏推荐
- [OBS] x264 Code: "buffer_size“
- (tool use) how to make the system automatically match and associate to database fields by importing MySQL from idea and writing SQL statements
- 苏打粉是什么?
- Miracast技术详解(一):Wi-Fi Display
- C learning notes
- Simple operation of running water lamp (keil5)
- Altimeter data knowledge point 2
- Matrix and TMB package version issues in R
- When jupyter notebook is encountered, erroe appears in the name and is not output after running, but an empty line of code is added downward, and [] is empty
- Basic series of SHEL script (II) syntax + operation + judgment
猜你喜欢
Hdu1231 maximum continuous subsequence (divide and conquer or dynamic gauge or double pointer)
DataGrid offline installation of database driver
docker安装mysql并使用navicat连接
Rough notes of C language (1)
并查集理论讲解和代码实现
M2DGR 多源多场景 地面机器人SLAM数据集
Hdu1232 unimpeded project (and collection)
Word import literature -mendeley
Light up the running light, rough notes for beginners (1)
【idea】Could not autowire. No beans of xxx type found
随机推荐
Solve tensorfow GPU modulenotfounderror: no module named 'tensorflow_ core. estimator‘
IPage can display data normally, but total is always equal to 0
玩转gRPC—深入概念与原理
DelayQueue延迟队列的使用和场景
Three body goal management notes
Today, share the wonderful and beautiful theme of idea + website address
Application of MATLAB in Linear Algebra (4): similar matrix and quadratic form
【无标题】
Simple use of timeunit
list. files: List the Files in a Directory/Folder
HDU1231 最大连续子序列(分治or动规or双指针)
第 2 章:小试牛刀,实现一个简单的Bean容器
M2dgr slam data set of multi-source and multi scene ground robot
Hdu1232 unimpeded project (and collection)
When jupyter notebook is encountered, erroe appears in the name and is not output after running, but an empty line of code is added downward, and [] is empty
[untitled]
C#学习笔记
Don't confuse the use difference between series / and / *
Literacy Ethernet MII interface types Daquan MII, RMII, smii, gmii, rgmii, sgmii, XGMII, XAUI, rxaui
Altimeter data knowledge point 2