144 lines
4.2 KiB
Python
144 lines
4.2 KiB
Python
import xlwt
|
|
from appPublic.strUtils import *
|
|
|
|
class ExcelWriter:
|
|
def __init__(self,encoding='gb2312'):
|
|
self.encoding = encoding
|
|
|
|
def writeV(self,sheet,x,y,v):
|
|
if type(v) == type([]):
|
|
return self.writeList(sheet,x,y,v)
|
|
|
|
if type(v) == type({}):
|
|
return self.writeDict(sheet,x,y,v)
|
|
|
|
if type(v) not in (type({}),type([])):
|
|
if type(v) == type(' '):
|
|
v = lrtrim(v)
|
|
sheet.write(x,y,v)
|
|
return 1
|
|
|
|
def write(self,excelfile,dictdata):
|
|
wb = xlwt.Workbook(encoding=self.encoding)
|
|
for tbl in dictdata.keys():
|
|
ws = wb.add_sheet(tbl,cell_overwrite_ok=True)
|
|
self.writeV(ws,0,0,dictdata[tbl])
|
|
wb.save(excelfile)
|
|
|
|
def createRecordTitle(self,ws,x,y,title,poss,isList=False):
|
|
if isList:
|
|
poss['__list__'][title] = True
|
|
|
|
if title in poss.keys():
|
|
return
|
|
|
|
if len(poss.keys()) > 1:
|
|
d_ = {}
|
|
for k,v in poss.items():
|
|
if k != '__list__':
|
|
d_[k] = v
|
|
y = max(d_.values()) + 1
|
|
# ws.write(x,y,title)
|
|
poss[title] = y
|
|
|
|
def writeRecordTitle(self,ws,x,poss):
|
|
for k in poss.keys():
|
|
if k == '__list__':
|
|
continue
|
|
if k in poss['__list__'].keys():
|
|
ws.write(x,poss[k],k+':list')
|
|
else:
|
|
ws.write(x,poss[k],k)
|
|
|
|
def writeRecords(self,ws,x,y,alist):
|
|
ox = x
|
|
oy = y
|
|
poss = {'__list__':{}}
|
|
x = ox + 1
|
|
for r in alist:
|
|
for k,v in r.items():
|
|
isList = False
|
|
if type(v) == type([]):
|
|
isList = True
|
|
v = ','.join(v)
|
|
self.createRecordTitle(ws,ox,oy,k,poss,isList)
|
|
ws.write(x,poss[k],v)
|
|
x = x + 1
|
|
self.writeRecordTitle(ws,ox,poss)
|
|
return x - ox
|
|
|
|
def isRecords(self,alist):
|
|
records = True
|
|
for r in alist:
|
|
if type(r) != type({}):
|
|
return False
|
|
for k,v in r.items():
|
|
if type(v) == type({}):
|
|
return False
|
|
if type(v) == type([]):
|
|
for c in v:
|
|
if type(c) in [type([]),type({})]:
|
|
return False
|
|
return True
|
|
|
|
def writeDict(self,ws,x,y,adict):
|
|
ox = x
|
|
ws.write(x,y,'__dict__')
|
|
x = x + 1
|
|
for k in adict.keys():
|
|
ws.write(x,y,k)
|
|
cnt = self.writeV(ws,x,y+1,adict[k])
|
|
x = x + cnt
|
|
# print "writeV return ",cnt,"handled key=",k,"next row=",x
|
|
return x - ox
|
|
|
|
def writeList(self,ws,x,y,alist,singlecell=False):
|
|
if self.isRecords(alist):
|
|
return self.writeRecords(ws,x,y,alist)
|
|
|
|
ox = x
|
|
if singlecell is True:
|
|
s = ','.join([ str(i) for i in alist ])
|
|
ws.write(x,y,s)
|
|
return 1
|
|
multiline = False
|
|
for d in alist:
|
|
if type(d) == type({}):
|
|
multiline=True
|
|
if multiline is True:
|
|
for i in alist:
|
|
if type(i) == type({}):
|
|
rows = self.writeDict(ws,x,y,i)
|
|
elif type(i) == type([]):
|
|
rows = self.writeMultiLineList(ws,x,y,i)
|
|
else:
|
|
ws.write(x,y,i)
|
|
rows = 1
|
|
x = x + rows
|
|
return x - ox
|
|
else:
|
|
for i in alist:
|
|
if type(i) == type([]):
|
|
self.writeList(ws,x,y,i,singlecell=True)
|
|
else:
|
|
ws.write(x,y,i)
|
|
y = y + 1
|
|
return 1
|
|
|
|
def writeMultiLineList(self,ws,x,y,alist):
|
|
ox = x
|
|
ws.write(x,y,'__list__')
|
|
x = x + 1
|
|
for i in alist:
|
|
ws.write(x,y,i)
|
|
x = x + 1
|
|
return x - os
|
|
|
|
if __name__ == '__main__':
|
|
data = {
|
|
'my1':['23423','423424','t334t3',2332,'erfverfefew'],
|
|
'my2':[{'aaa':1,'bbb':'bbb'},{'aaa':1,'bbb':'bbb'}],
|
|
}
|
|
w = ExcelWriter()
|
|
w.write('d:\\text.xls',data)
|
|
|