apppublic/appPublic/excelwriter.py
2020-07-12 16:04:02 +08:00

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)