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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ICTCLAS用的字Lucene4.9捆绑

    ICTCLAS用的字Lucene4.9捆绑

    2022年1月1日
    49
  • 苹果 find my 原理_find区别

    苹果 find my 原理_find区别什么是查我网络?2021年4月21日的苹果发布会发布了一款新的产品:AirTag,防丢器。使用的是BLE+UWB的技术。BLE通过FindMy网络解决了GPS定位的问题;而UWB解决了室内的、厘米级的精准定位问题。二者相互补充,实现了比较精准的定位,为用户提供优秀的物品防丢体验。查我网络(FindMyNetwork)是苹果公司发布的一项应用技术。这项技术比较神奇的一点是,支持这项技术的苹果设备(iPhone,iPad,AirPods,AirTag等),即使本身没有GPS

    2025年8月23日
    3
  • Spring过滤器和拦截器的区别[通俗易懂]

    Spring过滤器和拦截器的区别[通俗易懂]Spring过滤器和拦截器的区别 两者的作用 过滤器:是在javaweb中,你传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符…

    2022年8月23日
    6
  • python格式化输出之format用法

    python格式化输出之format用法format用法相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’使用方法由两种:b

    2022年7月3日
    26
  • C语言 条件运算符(? : )的用法[通俗易懂]

    C语言 条件运算符(? : )的用法[通俗易懂]条件运算符(?:)是一个三目运算符,即有三个操作数。使用条件运算符(?:)可以实现IfElse的功能,其一般形式为:          表达式1?表达式2:表达式3其意思是:如果表达式1为真,则运算表达式2,整个条件表达式的值为表达式2的值;反之,则运算表达式3,整个条件表达式的值为表达式3的值。

    2022年10月2日
    2
  • lspci命令详解无网卡信息_linux系统安装图形化界面

    lspci命令详解无网卡信息_linux系统安装图形化界面说明:lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。参数:-v使得lspci以冗余模式显示所有设备的详细信息。-vv使得lspci以过冗余模式显示更详细的信息(事实上是PCI设备能给出的所有东西)。这些数据的确切意义没有在此手册页中解释,如果你想知道更多,请参照/usr/include/linux/pci.h或者P

    2022年9月10日
    4

发表回复

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

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