Excel2Json 工具 可以區(qū)分客戶端和服務(wù)器導(dǎo)出JSON文件

? ? 用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è)彩扔,謝謝大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僻爽,一起剝皮案震驚了整個(gè)濱河市虫碉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胸梆,老刑警劉巖敦捧,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碰镜,居然都是意外死亡兢卵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門绪颖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秽荤,“玉大人,你說我怎么就攤上這事柠横∏钥睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵牍氛,是天一觀的道長晨继。 經(jīng)常有香客問我,道長糜俗,這世上最難降的妖魔是什么踱稍? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮悠抹,結(jié)果婚禮上珠月,老公的妹妹穿的比我還像新娘。我一直安慰自己楔敌,他們只是感情好啤挎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卵凑,像睡著了一般庆聘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勺卢,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天伙判,我揣著相機(jī)與錄音,去河邊找鬼黑忱。 笑死宴抚,一個(gè)胖子當(dāng)著我的面吹牛勒魔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菇曲,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冠绢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了常潮?” 一聲冷哼從身側(cè)響起弟胀,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喊式,沒想到半個(gè)月后孵户,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岔留,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年延届,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸诚。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡方庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酱固,到底是詐尸還是另有隱情械念,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布运悲,位于F島的核電站龄减,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏班眯。R本人自食惡果不足惜希停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望署隘。 院中可真熱鬧宠能,春花似錦、人聲如沸磁餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诊霹。三九已至羞延,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脾还,已是汗流浹背伴箩。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鄙漏,地道東北人嗤谚。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓砂客,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呵恢。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354