@IT·互联网

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

2020-10-20  本文已影响0人  勇于改变

    用python写了个 excel转换成json的工具,源码如下:

'''

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 *

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('400x300')

# 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)

clientFlg = IntVar()

serverFlg = IntVar()

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

checkClient.select()

checkClient.pack()

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

checkServer.pack()

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

b.place(y=10)

b.pack()

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

w.pack()

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

c.pack()

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

w.pack()

show_str = StringVar(window)

show_str.set("使用说明:第一步:点击【选择导出目录】按钮选择json文件存储位置\n 第二步:点击【选择excel文件】按钮,选择要转换的excel文件\n 第三步:导出成功")

ww = tk.Label(window,textvariable=show_str)

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

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

ww.pack()

window.mainloop()

# print(dir(tk))

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

说明文档:README.md

exe地址:excel2json.exe

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

上一篇下一篇

猜你喜欢

热点阅读