? ? 用python寫了個(gè) excel轉(zhuǎn)換成json的工具凡辱,
? ? 界面如下:
源碼如下:
'''
@author ghf054@163.com
@time 2020/10/20
excel轉(zhuǎn)換成json文件的工具 支持文件格式*.xlsx 和 *.xls 導(dǎo)出文件為utf-8編碼
1.里面每一個(gè)工作表代表一張配表,格式是中文解釋|配表名稱 比如:商店道具|Shop?
2.配表格式前四行有固定格式谅将,
第一行 代表配表里面的名字(程序用,采用駝峰命名方式寻定,第一個(gè)單詞小寫推沸,接第二個(gè)單詞的時(shí)候首字母大寫)
第二行 類型(int、string嚼贡、number、int[]同诫、string[]粤策、number[]、)? 误窖、
第三行 前后端標(biāo)識-只有前端用c 只有后端用s 前后端都用 cs 例如:c 或s 或cs
第四行 注釋
3.第五行開始為配表數(shù)據(jù)叮盘,首列定義為int、id 并且id自增格式霹俺。
4.int類型只能為整數(shù)(沒有小數(shù))柔吼,number類型為浮點(diǎn)數(shù),可以有小數(shù)丙唧,string可以有中文英文數(shù)字愈魏,數(shù)組類型 int[]、number[]想际、string[]分別對應(yīng)整數(shù)數(shù)組培漏、浮點(diǎn)數(shù)數(shù)組、字符串?dāng)?shù)組沼琉,用英文逗號分開
比如:int型數(shù)組(int[] ):1,2,3
浮點(diǎn)型數(shù)組(number[]):1.222,3.222
字符串?dāng)?shù)組(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
# 導(dǎo)出文件的目錄默認(rèn)當(dāng)前目錄
outDirector = '.'
# 根據(jù)類型解析數(shù)據(jù)
# 支持?jǐn)?shù)據(jù)類型 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:
# 解析數(shù)組
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("解析結(jié)果:",result)
return str(result)
# 解析表單
# sheet 表單
# @flg 標(biāo)識 c 客戶端 s 服務(wù)器
def readSheet(sheet,flg):
# 解析表名稱
nameArray = sheet.name.split("|")
if(len(nameArray)==2):
fileName = nameArray[1]
fileContent = "{\n"
print(" ")
print("開始解析表格:",fileName)
print("? ? ? ? ? ? ? ? ? ")
# 字段類型
types = []
# 字段名稱
valueKey = []
# 前后端標(biāo)識
flgKey = []
for i in range(sheet.nrows):
# 每一行的數(shù)據(jù)
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]
# 字段數(shù)值
value = row[j]
# 字段解析后的數(shù)據(jù)
keyContent = jiexi(keyType,value)
# print("***",j,keyType,value,keyContent)
# 最后一項(xiàng)不要逗號
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("------------- 解析一行結(jié)束------",blockItem)
# fileContent = fileContent + "}"
# print(">>",i,row)
# 去掉最后兩個(gè)字符
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("導(dǎo)出成功北苟。")
# print("生成配表:",fileContent)
else:
print(nameArray,"error")
# 執(zhí)行轉(zhuǎn)換
def doExcel2Json(file):
# book = xlrd.open_workbook("./data.xlsx")
book = xlrd.open_workbook(file)
# 導(dǎo)出服務(wù)器配表復(fù)選框
global serverFlg
# 導(dǎo)出客戶端配表復(fù)選框
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轉(zhuǎn)換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)
# 選擇導(dǎo)出文件夾名稱
def selectOutDirFun():
global outDirector
outDirector = filedialog.askdirectory()
if outDirector:
log("導(dǎo)出到目錄:"+outDirector)
else:
outDirector = "."
log("沒有選擇目錄桩匪,默認(rèn)導(dǎo)出到當(dāng)前目錄")
# 選擇要轉(zhuǎn)換的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("無法轉(zhuǎn)換此類文件")
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 名字 數(shù)組int 名稱數(shù)組 數(shù)量 金錢數(shù)量 攻擊值 |
|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? ? 名字? ? 數(shù)組int 名稱數(shù)組? 數(shù)量? ? 金錢數(shù)量? 攻擊值 \n
# 1? ? ? 大豆1? 1,0? 老王? ? ? 25? ? ? 1.33? ? ? 2356 \n
# 2? ? ? 大豆2? 1,2? ? a,b? ? ? 26? ? 3.88,2.33? 25 \n
#? ''')
# UI布局左側(cè)距離
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="服務(wù)器",variable=serverFlg)
checkServer.place(x=margetLeft+margetItem,y=10)
# checkServer.grid(row=0,column=1)
# checkServer.pack()
b = Button(window,text='選擇導(dǎo)出目錄',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
第一步:點(diǎn)擊 【選擇導(dǎo)出目錄】 按鈕,選擇json文件存儲位置\n
第二步:點(diǎn)擊 【選擇excel文件】按鈕,選擇要轉(zhuǎn)換的excel文件\n
選中復(fù)選框 【客戶端】 可導(dǎo)出excel表格里flag配有c的字段打瘪,并且保存到目標(biāo)目錄下的client目錄里 \n
選中復(fù)選框 【服務(wù)器】 可導(dǎo)出excel表格里flag配有s的字段,并且保存到目標(biāo)目錄下的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))
項(xiàng)目地址:https://gitee.com/fengfengaihuohuo/excel2-json
說明文檔:README.md
exe地址:excel2json.exe
有需要的同學(xué)直接拿走,如果覺得對自己有用闺骚,可以給作者個(gè)贊彩扔,謝謝大家。