Excel2Json 工具 可以区分客户端和服务器导出JSON文件

    用python写了个 excel转换成json的工具,

    界面如下:

源码如下:

'''

@author ghf054@163.com

@time 2020/10/20

excel转换成json文件的工具 支持文件格式*.xlsx 和 *.xls 导出文件为utf-8编码

1.里面每一个工作表代表一张配表,格式是中文解释|配表名称 比如:商店道具|Shop 

2.配表格式前四行有固定格式,

第一行 代表配表里面的名字(程序用,采用驼峰命名方式,第一个单词小写,接第二个单词的时候首字母大写)

第二行 类型(int、string、number、int[]、string[]、number[]、)  、

第三行 前后端标识-只有前端用c 只有后端用s 前后端都用 cs 例如:c 或s 或cs

第四行 注释

3.第五行开始为配表数据,首列定义为int、id 并且id自增格式。

4.int类型只能为整数(没有小数),number类型为浮点数,可以有小数,string可以有中文英文数字,数组类型 int[]、number[]、string[]分别对应整数数组、浮点数数组、字符串数组,用英文逗号分开

比如:int型数组(int[] ):1,2,3

浮点型数组(number[]):1.222,3.222

字符串数组(string[]):大牛,二狗

'''

import tkinter as tk

from tkinter import filedialog

from tkinter import Button

from tkinter import StringVar

from tkinter import Checkbutton

from tkinter import IntVar

from tkinter import messagebox

# from tkinter import *

import xlrd

import os

# 导出文件的目录默认当前目录

outDirector = '.'

# 根据类型解析数据

# 支持数据类型 int,number,string,int[],number[],string[]

def jiexi(ktype,value):

# print("> 解析字段:",ktype,value)

result = ""

if ktype == "int":

result = str(value).split(".")[0]

elif ktype == "string":

result = '\"'+value+'\"'

elif ktype == "number":

result = value

else:

# 解析数组

if ktype.find("[]") >-1:

arrKey = ktype.split("[]")

valueArr = str(value).split(",")

# print("arrKey",arrKey,valueArr)

result = "["

for k in range(len(valueArr)):

result = result+jiexi(arrKey[0],valueArr[k])+","

result = result[0:-1]

result = result+"]"

# print("reuslt:",result)

else:

print("## error key",ktype)

# print("解析结果:",result)

return str(result)

# 解析表单

# sheet 表单

# @flg 标识 c 客户端 s 服务器

def readSheet(sheet,flg):

# 解析表名称

nameArray = sheet.name.split("|")

if(len(nameArray)==2):

fileName = nameArray[1]

fileContent = "{\n"

print(" ")

print("开始解析表格:",fileName)

print("                  ")

# 字段类型

types = []

# 字段名称

valueKey = []

# 前后端标识

flgKey = []

for i in range(sheet.nrows):

# 每一行的数据

row = sheet.row_values(i)

if(i!=3):

if(i == 1):

types = row

elif(i == 2):

flgKey = row

elif(i == 0):

valueKey = row

else:

# print("解析:",row)

blockItem = ""

for j in range(len(types)):

# print("*",j)

if j== 0:

value = row[j]

# 每一行唯一索引

blockItem = ' \"'+jiexi("int",row[0])+'\":{\n'

# print("**",value)

else:

if(flgKey[j].find(flg) == -1):

continue

# 字段类型

keyType = types[j]

# 字段数值

value = row[j]

# 字段解析后的数据

keyContent = jiexi(keyType,value)

# print("***",j,keyType,value,keyContent)

# 最后一项不要逗号

dohao = ","

if(j == len(types)-1):

dohao = ""

blockItem = blockItem+' \"'+valueKey[j]+'\":'+keyContent+dohao+"\n\n"

blockItem = blockItem[0:-1]

blockItem = blockItem+" },\n"

fileContent = fileContent+blockItem

# print("------------- 解析一行结束------",blockItem)

# fileContent = fileContent + "}"

# print(">>",i,row)

# 去掉最后两个字符

fileContent = fileContent[0:-2]

fileContent = fileContent+"\n}"

print("save file:",'\n'+fileContent)

# 保存文件

global outDirector

flagDir = "client"

if flg == "s":

flagDir = "server"

outpath = outDirector+"/"+flagDir

if(not os.path.exists(outpath)):

os.makedirs(outpath)

outpath = outpath+"/"+fileName+".json"

# log("savefile:"+outpath)

fp = open(outpath,"w",encoding='utf-8')

fp.write(fileContent)

fp.close()

log("导出成功。")

# print("生成配表:",fileContent)

else:

print(nameArray,"error")

# 执行转换

def doExcel2Json(file):

# book = xlrd.open_workbook("./data.xlsx")

book = xlrd.open_workbook(file)

# 导出服务器配表复选框

global serverFlg

# 导出客户端配表复选框

global clientFlg

# 获取工作表名称

for sheet in book.sheets():

# print("ggg",sheet.name)

if clientFlg.get()==1:

readSheet(sheet,"c")

if serverFlg.get()==1:

readSheet(sheet,"s")

# doExcel2Json("./data.xlsx")

# 打开文件选择对话框

window = tk.Tk()

window.title("excel转换json工具")

window.geometry('600x300')

# window.withdraw()

# 打印信息到窗口

def log(str):

global show_str

show_str.set(str)

# w = tk.Label(window, text=str)

# w.pack()

# global text

# text.insert(tk.INSERT,str+"\r\n")

# text.pack()

# window.mainloop()

# print(str)

# 选择导出文件夹名称

def selectOutDirFun():

global outDirector

outDirector = filedialog.askdirectory()

if outDirector:

log("导出到目录:"+outDirector)

else:

outDirector = "."

log("没有选择目录,默认导出到当前目录")

# 选择要转换的excel文件

def selectExcelFileFun():

filePath = filedialog.askopenfilename()

if filePath:

if filePath.find(".xlsx")>-1:

doExcel2Json(filePath)

print("ok")

elif filePath.find(".xls")>-1:

doExcel2Json(filePath)

print("ok1")

else:

print("无法转换此类文件")

print("打开文件:",filePath)

def showDemoFun():

global show_str

show_str.set('''

_____________________________________________________________________________

|#Name name counts names count gold attack |

|#Type string int[] string[] number number[] int |

|#Flag c cs s s c cs |

|#ID 名字 数组int 名称数组 数量 金钱数量 攻击值 |

|1 大豆1 1,0 老王 25 1.33 2356 |

|2 大豆2 1,2 a,b 26 3.88,2.33 25 |

|____________________________________________________________________________

''')

# messagebox.showinfo('demo','''

# #Name  name    counts  names    count  gold      attack \n

# #Type  string  int[]  string[]  number number[]  int \n

# #Flag  c      cs      s        s      c          cs \n

# #ID    名字    数组int 名称数组  数量    金钱数量  攻击值 \n

# 1      大豆1  1,0  老王      25      1.33      2356 \n

# 2      大豆2  1,2    a,b      26    3.88,2.33  25 \n

#  ''')

# UI布局左侧距离

margetLeft = 50

margetItem = 100

clientFlg = IntVar()

serverFlg = IntVar()

checkClient = Checkbutton(window,text="客户端",variable=clientFlg)

checkClient.place(x=margetLeft,y=10)

# checkClient.grid(row=0,column=0)

checkClient.select()

# checkClient.pack()

checkServer = Checkbutton(window,text="服务器",variable=serverFlg)

checkServer.place(x=margetLeft+margetItem,y=10)

# checkServer.grid(row=0,column=1)

# checkServer.pack()

b = Button(window,text='选择导出目录',command=selectOutDirFun)

b.place(x=margetLeft,y=50)

# b.grid(row=1,column=0)

# b.pack()

c = Button(window,text="选择excel文件",command=selectExcelFileFun)

c.place(x=margetLeft+margetItem,y=50)

# c.grid(row=1,column=1)

# c.pack()

d = Button(window,text="excel示例",command=showDemoFun)

d.place(x=margetLeft+margetItem*3,y=10)

# b.place(y=10)

# d.grid(row=2,column=0)

# d.pack()

# w = tk.Label(window, text="")

# w.pack()

show_str = StringVar(window)

show_str.set('''

说明:\n

第一步:点击 【选择导出目录】 按钮,选择json文件存储位置\n

第二步:点击 【选择excel文件】按钮,选择要转换的excel文件\n

选中复选框 【客户端】 可导出excel表格里flag配有c的字段,并且保存到目标目录下的client目录里 \n

选中复选框 【服务器】 可导出excel表格里flag配有s的字段,并且保存到目标目录下的server目录里''')

ww = tk.Label(window,textvariable=show_str,justify='left')

ww.place(x=0,y=100)

# ww.grid(row = 3,column=0)

# cc= tk.Label(window, textvariable=show_str)

# ww.place(x=0,y=30)

# ww.pack()

window.mainloop()

# print(dir(tk))

# print(dir(Checkbutton))

项目地址:https://gitee.com/fengfengaihuohuo/excel2-json

说明文档:README.md

exe地址:excel2json.exe

有需要的同学直接拿走,如果觉得对自己有用,可以给作者个,谢谢大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343