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


相关推荐

  • Oracle数据库存储number类型数据「建议收藏」

    Oracle数据库存储number类型数据「建议收藏」转载自初一七月Oracle数据类型之numberoracle的number类型是oracle的内置类型之一,是oracle的最基础数值数据类型。在9iR2及其以前的版本中只支持一种适合存储数值数据的固有数据类型,在10g以后,才出现了两种新的数值类型,即推出本地浮点数据类型(NativeFloating-PointDataTypes):BINARY_FLOAT(单精度32位)和BINAR…

    2022年7月24日
  • linux nohup命令输出日志_nohup运行sh文件

    linux nohup命令输出日志_nohup运行sh文件(一)前言因为经常使用Xshell进行服务器代码的运行,但是每次到关机后,或者是关掉Xshell连接窗口,在服务器上的命令,操作也就断掉了。这不得不找到了一个Linux命令:nohup(二)基本用法nohupcommand[arg…][&amp;]拿pythontest.py为例子一般我们运行命令是直接:pythontest.py,但是在xshel…

    2022年8月29日
  • W3C标准与规范「建议收藏」

    W3C标准与规范「建议收藏」W3C标准,即一系列标准的集合,他的本质是结构标准语言。就像平时使用的HTML、CSS等都需要遵守这些标准。万维网联盟创建于1994年,是web技术领域最具权威和影响力的国际中立性技术标准机构。它有效促进了web技术相互之间的兼容。就像网页是由三部分组成:结构、表现和行为。那么他对应的标准也分三方面:1.结构化标准语言:HTML。可扩展标记语言(XML):最初设计目的是弥补HTML的不

    2022年9月17日
  • RPC接口简介「建议收藏」

    RPC接口简介「建议收藏」什么是RPCRPC(RemoteProcedureCallProtocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC的特点:RPC是协议。只是协议,而非实现。RPC实现包括:Dubbo、Thri…

    2022年10月13日
  • sqlSessionFactory创建

    sqlSessionFactory创建前言分析上篇文章的整合的配置文件,我们可以知道配置的bean是成树状结构的,而在树的最顶层是类型为org.mybatis.Spring.SqlSessionFactoryBean的bean,它将其他相关的bean组装在了一起,那么我们的分析就从此类开始。sqlSessionFactory创建对于配置文件的读取,Spring是通过org.mybatis.Spring.SqlSessi…

    2022年5月27日
  • MQTT协议,终于有人讲清楚了[通俗易懂]

    MQTT协议,终于有人讲清楚了[通俗易懂]大家好,我是小麦,最近做了一个物联网的项目,顺便总结一下MQTT协议。大家都知道,MQTT协议在物联网中很常用,如果你对此还不是很了解,相信这篇文章可以带你入门。mqtt协议1MQTT协…

    2022年6月25日

发表回复

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

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