Excel2Json

###  说明文档
#    重要写在开头  文件必须为.xlsx 后缀    需引用openpyxl第三方模块
#    将Excel文件转换为Json和C# Code
#    第一行为中文名   人物编号   人物名称     人物年龄     人物简介     _性别
#    第二行为英文名  personID  personName  personAge  personIntro     sex
#    第三行字段类型    int      string       int       string         int
#                    1        hyrule       20       I am hyrule      1
#                    2        link         20       I am link        1
#
#    PS: 第一行描述前加上下划线表示忽略当前列的字段例如:  _性别  列 会被忽略不生成代码和Json
#    PS: 第一行描述后加上#表示默认值 例如 人物年龄#18  则表示若当前列下的单元格为空则设置为默认值
#    PS: SheetName后面加上#表示该表在生成Code的时候是需要序列化的
###

import os
from openpyxl import Workbook
from openpyxl import load_workbook

isCreateCode = True     #是否生成C# 代码文件
isCreateJson = True     #是否生成Json 文件

quotation = "\""        #双引号 单引号 , 表示json文件中字符串表示形式
projectParentPath = ""  #工程所在路径,如果指定则追加,不指定则默认为当前py脚本所在的项目
excelDirPath = "D:/art" #指定Excel所在路径,不指定则默认为当前py脚本位置
codePath = "/Assets/Scripts/Code"
jsonPath = "/Assets/Resources/Json"

stripstr = '\r\n\t '
####################### FUNC Create CODE ##########################
def CreateCodeFile(titleName,lstCs,lstEs,lstTs):
    if not os.path.exists(codePath):
        os.makedirs(codePath)  #创建目标文件夹
    
    splitTitleName = titleName.split('#')
    sheetName = splitTitleName[0]

    if len(splitTitleName)>1:    #表示存在#则需要被序列化
        codeContent = "using System;\n\n[Serializable]\npublic class "+sheetName
    else:
        codeContent = "public class "+sheetName

    codeContent += "\n{\n"
    
    for i in range(len(lstTs)):
        codeContent += "\t//"+lstCs[i]+"\n"
        codeContent += "\tpublic "+lstTs[i]+" "+lstEs[i]+";\n\n"
    codeContent += "}"  
    
    fileName = codePath+"/"+sheetName+".cs"

    with open(fileName,'w',encoding='utf_8') as f:
        f.write(codeContent)
    
    print("Create "+sheetName+".cs OK!!!")
    
####################### FUNC Create JSON ##########################
def CreateJsonFile(titleName,lstEs,lstTs,lstallR):
    if not os.path.exists(jsonPath):
        os.makedirs(jsonPath)  #创建目标文件夹
    
    jsonContent = "["

    splitTitleName = titleName.split('#')
    sheetName = splitTitleName[0]

    #增加元素
    for row in lstallR:
        jsonContent += "{"
        for i,t in enumerate(lstTs):           
            if t in ('float','int','double','long'):
                jsonContent += quotation + lstEs[i] + quotation + ":"+str(row[i])+","
            else:
                jsonContent += quotation + lstEs[i] + quotation + ":"+quotation + str(row[i])+ quotation +","
        jsonContent = jsonContent.strip(',')
        jsonContent += "},"
    jsonContent = jsonContent.strip(',')   
    jsonContent += "]"
    jsonContent = jsonContent.replace('\r','').replace('\n','')
    fileName = jsonPath+"/"+sheetName+".json"

    with open(fileName,'w',encoding='utf_8') as f:
        f.write(jsonContent)
    
    print("Create "+sheetName+".json OK!!!")

def SetPath():
    global codePath,jsonPath,projectParentPath
    
    if projectParentPath.strip()=='': #自动根据当前py脚本所在位置确定项目Code和Json文件路径
        codePath = "Code/"
        jsonPath = "Json/"
    else:                             #指定绝对路径解析,则追加就完事了
        codePath = projectParentPath + codePath
        jsonPath = projectParentPath + jsonPath


def Main():
    allfiles = []
    global excelDirPath

    if excelDirPath.strip()=='':    #如果没有指定Excel所在路径,那么默认为当前所在路径
        excelDirPath=os.getcwd()
       
    if os.path.isfile(excelDirPath):
        allfiles.append(excelDirPath)
    elif os.path.isdir(excelDirPath):
        allfiles = os.listdir(excelDirPath)
        
    files = []
    for i in allfiles:
        if os.path.splitext(i)[1]=='.xlsx':
            if excelDirPath.strip()=='':
                files.append(i)
            else:
                files.append(os.path.join(excelDirPath,i))

    if(len(files)==0):
        print("没有找到任何 .xlsx 文件")
        return

    for xlsx in files:
        
        wb = load_workbook(filename=xlsx,data_only=True) #path,data_only=True表示只读取数值,如果是公式会取出计算的数值
        lstSheets = wb.sheetnames

        for i in lstSheets:
            sheet = wb[i]
        
            if sheet.max_row < 3:
                print(sheet.title+' is NonStandard Excel Doc , Can not Deal!!!')

            lstCName = []
            lstEName = []
            lstType = []

            lstAllRow = []

            lstIgnoreIndex = []

            lstDefault = []

            for r in range(sheet.max_row):
                if r == 0:
                    for cCName in range(sheet.max_column):
                        CNameValue = sheet.cell(row=r+1,column=cCName+1).value
                        if CNameValue is None:
                            print("\nERROR : Sheet " + sheet.title + " Cell ("+str(r+1)+","+str(cCName+1)+") Is NONE\n")

                        if CNameValue.find('#') != -1:
                            lstDefault.append(CNameValue.split('#')[1])
                        else:
                            lstDefault.append('')

                        if CNameValue[0] == '_':
                            lstIgnoreIndex.append(cCName)     
                        else:
                            lstCName.append(CNameValue)

                if r == 1:
                    for cEName in range(sheet.max_column):
                        if not cEName in lstIgnoreIndex:
                            ENameValue = sheet.cell(row=r+1,column=cEName+1).value
                            if ENameValue is None:
                                print("\nERROR : Sheet : " + sheet.title + " Cell ("+str(r+1)+","+str(cEName+1)+") Is NONE\n")
                            lstEName.append(ENameValue)

                if r == 2:
                    for cType in range(sheet.max_column):
                        if not cType in lstIgnoreIndex:
                            TypeValue =  sheet.cell(row=r+1,column=cType+1).value
                            if TypeValue is None:
                                print("\nERROR : Sheet : " + sheet.title + " Cell ("+str(r+1)+","+str(cType+1)+") Is NONE\n")
                            lstType.append(TypeValue)

                if r>2:
                    lstOneRow = []
                    for c in range(sheet.max_column):
                        if not c in lstIgnoreIndex:
                            cValue = sheet.cell(row=r+1,column=c+1).value
                            if cValue is None:
                                cValue = lstDefault[c]
                            if isinstance(cValue,str):
                                cValue = cValue.strip(stripstr)
                            lstOneRow.append(cValue)

                    lstAllRow.append(lstOneRow)

            if isCreateCode:
                CreateCodeFile(sheet.title,lstCName,lstEName,lstType)
            if isCreateJson:
                CreateJsonFile(sheet.title,lstEName,lstType,lstAllRow)

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

推荐阅读更多精彩内容