美文网首页
Excel2Json

Excel2Json

作者: hh5460 | 来源:发表于2017-12-26 00:23 被阅读0次
###  说明文档
#    重要写在开头  文件必须为.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()

相关文章

网友评论

      本文标题:Excel2Json

      本文链接:https://www.haomeiwen.com/subject/nrebvxtx.html