ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go语言学习之-带分割符的文件转excel

2021-09-23 14:35:05  阅读:126  来源: 互联网

标签:分割 log err splitor fmt excel filename Println Go


package main

import (
	"bufio"
	"errors"
	"flag"
	"fmt"
	"github.com/axgle/mahonia"
	"github.com/xuri/excelize/v2"
	"log"
	"os"
	"path"
	"path/filepath"
	"strings"
)

var splitor = ""
func splt(c rune) bool {
	//c = ''
	if c == rune(splitor[0]) {
		return true
	} else {
		return false
	}
}

func ToAlphaString(value int) string {
	if value < 0 {
		return ""
	}
	var ans string
	i := value + 1
	for i > 0 {
		ans = string((i-1)%26+65) + ans
		i = (i - 1) / 26
	}
	return ans
}

func main() {
	var enc mahonia.Decoder
	enc = mahonia.NewDecoder("gbk")
	//filename := "C:\\Users\\Downloads\\111.del"
	var filename string
	if len(os.Args)>1{
		flag.ErrHelp=errors.New("")
		flag.StringVar(&filename,"filename","111.dat","--filename 文件名【可以把文件拖放在此处】")
		flag.StringVar(&splitor,"splitor","\u0003","--splitor [,  \u0008 \u0003  ]  分割符,一般为\u0003或者逗号等可见字符单字符")
		flag.Parse()
		//rune(splitor)
		fmt.Println("filename:"+filename)
		//fmt.Println([]rune(splitor))
		fmt.Println("splitor:"+string(splitor))
		//return
	}else{
		fmt.Println("请输入文件名,可以直接把用鼠标点击文件拖入到此:")
		fmt.Scan(&filename)
	}


	if len(filename)<5{
		tmpstr:=fmt.Sprintf("输入的文件名[%s]长度好像不够5位,是否有问题?",filename)
		panic(errors.New(tmpstr))
	}
	paths,basefile:=filepath.Split(filename)
	filesuffix:=path.Ext(basefile)
	newbasename:=paths+basefile[0:len(basefile) - len(filesuffix)]
	xlsfilename:=newbasename+".xlsx"
	logfilename:=newbasename+".log"

	logFile,err:=os.OpenFile(logfilename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("open log file failed, err:", err)
		return
	}
	log.SetOutput(logFile)
	log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate)
	log.Printf("日志文件:[%s]\n",logfilename)
	log.Printf("目标文件[%s]\n",xlsfilename)
	fmt.Printf("目标文件路径为:[%s]\n",xlsfilename)
	fmt.Printf("目标日志路径为:[%s]\n",logfilename)
	fp1, err := os.Open(filename)
	if err != nil {
		tmpstr := fmt.Sprintf("%s文件打开错误!", filename)
		log.Println(tmpstr)
		panic(err)
	}
	defer fp1.Close()

	fs := bufio.NewScanner(fp1)
	var rowno = 2
	//xlsfilename := "1122221.xlsx"
	f := excelize.NewFile()
	f.SaveAs(xlsfilename)
	file1, err := excelize.OpenFile(xlsfilename)
	if err != nil {
		log.Println(err)
	}

	streamWriter,err:=file1.NewStreamWriter("Sheet1")
	if err != nil {
		log.Println(err)
	}

	defer func() {
		if err := recover();err!=nil{
			streamWriter.Flush()
			f.SaveAs(xlsfilename)
			file1.Save()
			log.Printf("recover:%v",err)
		}
	}()

	//defer f.SaveAs(xlsfilename)
	//index:=f.NewSheet("data")
	//f.SetActiveSheet(index)
	for fs.Scan() {
		splitstrLine := fs.Text()
		//fildstr := strings.FieldsFunc(splitstrLine, splt)
		fildstr := strings.Split(splitstrLine, splitor)
		//log.Printf("fildstr:%v",fildstr)
		colcnt:=len(fildstr)
		//log.Printf("pos:%d-->colcnt:[%d]\n",rowno,colcnt)
		row:=make([]interface{},colcnt)
		for colno := 0; colno < colcnt; colno++ {
			if fildstr[colno]!="" {
				row[colno]=enc.ConvertString(fildstr[colno])
			}else {
				row[colno]=""
			}
		}
		cell,_:=excelize.CoordinatesToCellName(1,rowno)
		if err:=streamWriter.SetRow(cell,row);err!=nil{
			log.Println(err)
		}
		if rowno%30000 == 0 {
			log.Printf("-----已写入[%d]行------\n", rowno)
		}

		if rowno > excelize.TotalRows{
			panic(errors.New("rows number exceeds maximum limit"))
		}


		//if rowno >= 20000 {
		//	break
		//}

		rowno++
	}
	if err:=streamWriter.Flush();err!=nil{
		log.Println(err)
		//return
	}

	if err:=file1.Save();err!=nil{
		log.Println(err)
	}
	//println(fp1)
	log.Println("完成!")
	os.Exit(0)
}

标签:分割,log,err,splitor,fmt,excel,filename,Println,Go
来源: https://www.cnblogs.com/silencemaker/p/15324040.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有