import re
import xlrd
import xml.dom.minidom as Dom
import sys
import Tkinter
import tkFileDialog
class ExcelToXML():
"""A tool class to chang xlsx_file to xml_file"""
def __init__(self, excelName, outDir):
self.xml_doc = Dom.Document()
self.excelData = xlrd.open_workbook(excelName)
self.outDir = self.cellContentHandle(outDir)
def cellContentHandle(self, cellTxt, tarType='None'):
oriType = type(cellTxt)
print oriType,'------',tarType
txt = cellTxt
#将cell中得数据转成标准字符串
#类型目前考虑的分三种:int、float、string(unicode)
if isinstance(txt, int):
txt = str(txt)
elif isinstance(txt, float):
#容错处理:excel中int和float混用,要求是int,填写的是float
if tarType == 'int':
txt = str(int(float(txt)))
else:
txt = str(float(txt))
elif isinstance(txt, unicode):
txt = txt.encode('utf-8')
return txt
#遍历所有的表单,生成plist
def createAllSheetPlist(self):
for i in range(0, self.excelData.nsheets):
self.createSheetAllPlist(i)
#遍历一张表单的所有行生成plist
def createSheetAllPlist(self, sheetIdx):
sheet = self.excelData.sheets()[sheetIdx]
if sheet.nrows <= 0:
sys.exit()
self.keys = sheet.row_values(0)
self.types = sheet.row_values(2)
for i in range(0, sheet.nrows):
self.buildOnePlistByRowData(sheet.row_values(i))
#遍历一行的所有数据值,构建一个plist文件
def buildOnePlistByRowData(self, rowDatas):
## print ".....",re.match(r'\d+',self.cellContentHandle(rowDatas[0])),self.cellContentHandle(rowDatas[0])
if re.match(r'\d+',self.cellContentHandle(rowDatas[0])) == None:
return None
rootNode = self.createRootNode()
for i in range(0, len(rowDatas)):
self.createKeyNode(rootNode,self.cellContentHandle(self.keys[i]))
self.createValueNode(rootNode,self.cellContentHandle(rowDatas[i],self.types[i]))
plistName = self.cellContentHandle(rowDatas[0],'int')
f = open(self.outDir+'/'+plistName+'.plist','w')
self.xml_doc.writexml (f,'','','\n','utf-8')
f.close()
def createRootNode(self):
del self.xml_doc
self.xml_doc = Dom.Document()
boxNode = self.xml_doc.createElement('plist')
boxNode.setAttribute('version','1.0')
self.xml_doc.appendChild(boxNode)
rootNode = self.xml_doc.createElement ('dict')
boxNode.appendChild (rootNode)
return rootNode
def createKeyNode(self, root_node, kText):
keyNode = self.xml_doc.createElement('key')
keyTxtNode = self.xml_doc.createTextNode(kText)
keyNode.appendChild (keyTxtNode)
root_node.appendChild(keyNode)
def createValueNode(self, root_node, vText):
vNode = self.xml_doc.createElement('string')
vTxtNode = self.xml_doc.createTextNode(vText)
vNode.appendChild(vTxtNode)
root_node.appendChild(vNode)
def GUI_OpenFile():
xlsxPath = tkFileDialog.askopenfilename()
if xlsxPath == "":
sys.exit()
outPath = tkFileDialog.askdirectory()
if outPath == "":
sys.exit()
return xlsxPath,outPath
def MyParseExcelToXML():
xp,op = GUI_OpenFile()
etx = ExcelToXML(xp,op)
etx.createAllSheetPlist()
MyParseExcelToXML()
##data = xlrd.open_workbook(xlsxPath) #'resource/npc.xlsx'
##
##for sheetNum in range(0, len(data.sheets())):
## table = data.sheets()[sheetNum]
## nrows = table.nrows
## ncols = table.ncols
## if nrows <= 0:
## sys.exit()
## for rowNum in range(0, nrows):
## celltxt = table.cell(rowNum,0).value
## if isinstance(celltxt, unicode):
## celltxt = celltxt.encode('utf-8')
## else: #number
## celltxt = str(celltxt)
## if re.match(r'\d+',celltxt) :
## name = int(float(celltxt))
## createXml(rowNum,outPath)
##
##
##
##
####doc = Dom.Document()
##rootNode = doc.createElement ('root')
##doc.appendChild (rootNode)
##
##keyNode = doc.createElement('key')
##keyTxtNode = doc.createTextNode ('npcId')
##keyNode.appendChild (keyTxtNode)
####keyNode.setAttribute('npcId','10001')
##rootNode.appendChild (keyNode)
##doc.createComment('jgljflhjlfhjljhlg')
##f = open('resource/my.plist','w')
##doc.writexml (f,'','\t','\n','utf-8')
##f.close()