GO Excel 转 JSON (完整代码)[通俗易懂]

GO Excel 转 JSON (完整代码)[通俗易懂]packagemainimport( “fmt” “github.com/xuri/excelize/v2” “io/ioutil” “os” “path/filepath”)funcinit(){}//配置文件目录varconfigPathstring=”../../Configs”varoutjsonPathstring=”./json/”funcgetFileList(pathstring)[]string{ varall_f.

大家好,又见面了,我是你们的朋友全栈君。

package main

import (
	"fmt"
	"github.com/xuri/excelize/v2"
	"io/ioutil"
	"os"
	"path/filepath"
)

func init() {

}

// 配置文件目录
var configPath string = "../../Configs"
var outjsonPath string = "./json/"

func getFileList(path string) []string {
	var all_file []string
	finfo, _ := ioutil.ReadDir(path)
	for _, info := range finfo {
		if filepath.Ext(info.Name())==".xlsx"{
			real_path := path + "/" + info.Name()
			if info.IsDir() {
				//all_file = append(all_file, getFileList(real_path)...)
			} else {
				all_file = append(all_file, real_path)
			}
		}
	}

	return all_file
}

type meta struct {
	Key string
	Idx int
	Typ string
}

type rowdata []interface{}


func parseFile(file string) {

	fmt.Println("\n\n\n\n", file)

	xlsx, err := excelize.OpenFile(file)
	if err != nil {
		panic(err.Error())
	}
	//[line][colidx][data]

	sheets := xlsx.GetSheetList()
	for _, s := range sheets{
		rows, err := xlsx.GetRows(s)
		if err != nil {
			return
		}
		if len(rows) < 5 {
			return
		}

		colNum := len(rows[1])
		fmt.Println("col num:", colNum)
		metaList := make([]*meta, 0, colNum)
		dataList := make([]rowdata, 0, len(rows)-4)


		for line, row := range rows {
			switch line {
			case 0:	// sheet 名
			case 1:	// col name

				for idx, colname := range row{
					fmt.Println(idx, colname, len(metaList))

					metaList = append(metaList, &meta{Key: colname, Idx: idx})
				}
			case 2:	// data type

				fmt.Println("meta cot:%d, rol cot:%d", len(metaList), len(row))
				for idx, typ := range row {
					metaList[idx].Typ=typ
				}
			case 3:	// desc

			default: //>= 4 row data
				data := make(rowdata, colNum)

				for k:=0;k<colNum;k++{
					if k < len(row){
						data[k] = row[k]
					}
				}

				dataList = append(dataList, data)
			}
		}

		//sheetName := xlsx.GetSheetName(idx)
		// to json, save
		filename := filepath.Base(file)
		suf := filepath.Ext(filename)
		jsonFile := fmt.Sprintf("%s.json", filename[:(len(filename)-len(suf))])
		err = output(jsonFile, toJson(dataList, metaList))
		if err != nil {
			fmt.Println(err)
		}
		//fmt.Println(toJson(dataList, metaList))

	}

}

func toJson(datarows []rowdata, metalist []*meta) string {
	ret := "["

	for _, row := range(datarows) {
		ret += "\n\t{"
		for idx, meta := range(metalist) {
			ret += fmt.Sprintf("\n\t\t\"%s\":", meta.Key)
			if meta.Typ == "string" {
				if row[idx] == nil {
					ret += "\"\""
				} else {
					ret += fmt.Sprintf("\"%s\"", row[idx])
				}
			} else {
				if row[idx] == nil || row[idx] == ""{
					ret += "0"
				} else {
					ret += fmt.Sprintf("%s", row[idx])
				}
			}
			ret += ","
		}
		ret = ret[:len(ret)-1]

		ret += "\n\t},"
	}
	ret = ret[:len(ret)-1]

	ret += "\n]"
	return ret
}

func output(filename string, str string) error {

	f, err := os.OpenFile(outjsonPath+filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
	if err != nil {
		return err
	}
	defer f.Close()

	_, err = f.WriteString(str)
	if err != nil {
		return err
	}

	return nil
}



func main() {

	//flag.StringVar()

	filelist := getFileList(configPath)
	fmt.Println(filelist)

	for _, file := range(filelist) {
		parseFile(file)
	}

}

对应的excel格式如下

GO Excel 转 JSON (完整代码)[通俗易懂]

如表格式有差异,可调整解析 switch line中代码

数字类型和字符类型, 表格中为空则json默认补充填0或“”

就分享到这里吧,欢迎留言交流讨论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140996.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华中农业大学python实验题

    华中农业大学python实验题华中农业大学Python部分实验题,旨在为大家提供思路,希望大家抱着借鉴的心理来学习,不要直接抄袭。

    2022年7月11日
    9
  • 简述python变量的命名规则_Python 变量命名规则

    简述python变量的命名规则_Python 变量命名规则Python变量命名规则python是动态编译语言,不用事先声明类型,赋值即声明。1.要具有描述性2.变量名只能是:数字,字母组成,不可以是空格或特殊字符,如:(#?。,¥$*~!&)等3.不能是中文4.不能以数字开头5.保留字符是不能被使用,如下:[‘and’,’as’,’assert’,’break’,’class’,’continue’,’def’,’del’,’eli…

    2022年6月6日
    30
  • 解决Win键不能用的问题[通俗易懂]

    解决Win键不能用的问题[通俗易懂]问题描述:突然有一次,乱按了一通键盘,突然win键就不能使用了;win键既可以启动开始界面,同时又是win自带的快捷键的关键按键,比较重要。解决方法:发现自己的问题就是:按fn+F12(他会带一个小锁的键)就是锁定Win键;我解决的办法就是:按fn+Prtsc(他会带一个小钥匙的键)这样就可以使用Win键了;可能是以为电脑而异吧,多试一下上面的按键…

    2022年6月3日
    33
  • IT技术开发人员获得成功的六大步骤

    IT技术开发人士成功的6大步骤一个前辈在移民加拿大后写的文章,写得不错,值得借鉴,转来给大家看看,也给自己序言:经过001多年的洗礼,认识了这里这么多的JJMMGGDD,前几天刚得到签证,无限感慨

    2021年12月25日
    33
  • SQL server分页的四种方法(算很全面了)

    SQL server分页的四种方法(算很全面了)  这篇博客讲的是SQLserver的分页方法,用的SQLserver2012版本。下面都用pageIndex表示页数,pageSize表示一页包含的记录。并且下面涉及到具体例子的,设定查询第2页,每页含10条记录。  首先说一下SQLserver的分页与MySQL的分页的不同,mysql的分页直接是用limit(pageIndex-1),pageSize就可以完成,但是SQLse…

    2022年6月14日
    33
  • C语言int的取值范围_c语言int表示范围

    C语言int的取值范围_c语言int表示范围C语言int的取值范围我们常常看到int取值范围为-32768~32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,取值范围为前面所说的-32768~32767(-2^16~2^16-1)。而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-2^32~2^32-1)。ISO/ANSIC规定,int类型的最小范围为……

    2022年8月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号