用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
有需要的同学直接拿走,如果觉得对自己有用,可以给作者个赞,谢谢大家。