### 說明文檔
# 重要寫在開頭 文件必須為.xlsx 后綴 需引用openpyxl第三方模塊
# 將Excel文件轉(zhuǎn)換為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: 第一行描述前加上下劃線表示忽略當(dāng)前列的字段例如: _性別 列 會被忽略不生成代碼和Json
# PS: 第一行描述后加上#表示默認值 例如 人物年齡#18 則表示若當(dāng)前列下的單元格為空則設(shè)置為默認值
# PS: SheetName后面加上#表示該表在生成Code的時候是需要序列化的
###
import os
from openpyxl import Workbook
from openpyxl import load_workbook
isCreateCode = True #是否生成C# 代碼文件
isCreateJson = True #是否生成Json 文件
quotation = "\"" #雙引號 單引號 , 表示json文件中字符串表示形式
projectParentPath = "" #工程所在路徑,如果指定則追加,不指定則默認為當(dāng)前py腳本所在的項目
excelDirPath = "D:/art" #指定Excel所在路徑,不指定則默認為當(dāng)前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) #創(chuàng)建目標(biāo)文件夾
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) #創(chuàng)建目標(biāo)文件夾
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()=='': #自動根據(jù)當(dāng)前py腳本所在位置確定項目Code和Json文件路徑
codePath = "Code/"
jsonPath = "Json/"
else: #指定絕對路徑解析,則追加就完事了
codePath = projectParentPath + codePath
jsonPath = projectParentPath + jsonPath
def Main():
allfiles = []
global excelDirPath
if excelDirPath.strip()=='': #如果沒有指定Excel所在路徑,那么默認為當(dāng)前所在路徑
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表示只讀取數(shù)值,如果是公式會取出計算的數(shù)值
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
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 01 朋友思思是獨生女,母親是小學(xué)老師,父親是機關(guān)單位的職工,她是典型的學(xué)霸,從小學(xué)到高中學(xué)習(xí)都是在當(dāng)?shù)刈詈玫膶W(xué)校...
- 思維導(dǎo)圖中,使用圖像的目的是強調(diào)重點,若是使用彩色、立體圖像效果更好。——東尼·伯贊 同一樣的概念可以有4個層次的...