使用python进行Excel文档的合并
了解完python基础之后的一个小练习.
主要练习了python中列表的使用,记录下代码的缺陷和容易踩的坑.
-
缺陷
1.此代码仅仅是将n个excel中各sheet各行的数据统一写入了一个新的excel,并没有区分列名和数据.
2.使用的第三方库为xlrd和xlsxwriter,不支持excel的追加写入,因此实现方案为读取所有excel的数据存储为列表后再写入新的excel,效率较低 -
踩坑
1.列表中追加另一个列表时,增加的为列表本身,访问时应多一层括号,而不是单纯将另一个列表中元素追加.如:a=[1] b=[2] a.append(b) print(a) #此时结果为[1,[2]]
2.列表中追加另一个列表时,改变后者内容,前者也将改变!具体可以看本例子中往svalue中追加filevalue的情况.因为append()增加的是列表的引用.
代码详情如下:
import xlrd,xlsxwriter #设置要合并的文件 allxls=["/home/l03099/1.xls","/home/l03099/2.xls"] #设置要合并到的文件 endxls="/home/l03099/out.xls" #打开表格 def open_xls(file): try: fh=xlrd.open_workbook(file) return fh except Exception as e: print("打卡错误,错误为:"+e) #获取所有sheet def getsheet(fh): return fh.sheets() #读取某个sheet的行数 def getnrows(fh,sheet): table = fh.sheets()[sheet] return table.nrows #读取某个文件的内容并返回所有行的值 def getfilect(fh,fl,shnum): fh=open_xls(fl) table=fh.sheet_by_name(shname[shnum]) num=getnrows(fh,shnum) lenrvalue=len(rvalue) for row in range(0,num): rdata=table.row_values(row) rvalue.append(rdata) #print(rvalue[lenrvalue:]) filevalue.append(rvalue[lenrvalue:]) #print(filevalue) return filevalue #存储所有读取的结果 filevalue=[] #存储一个标签的结果 svalue=[] #存储一行结果 rvalue=[] #存储各sheet名 shname=[] #读取第一个待读文件,获得sheet数 fh=open_xls(allxls[0]) sh=getsheet(fh) x=0 for sheet in sh: shname.append(sheet.name) svalue.append([]) x+=1 #依次读取各sheet内容 #依次读取各文件当前sheet内容 for shnum in range(0,x): for fl in allxls: print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个标签的...") filevalue=getfilect(fh,fl,shnum) svalue[shnum].append(filevalue) #print("svalue[0]:"+str(svalue[0])) #print("svalue[1]:"+str(svalue[1])) #由于append具有叠加关系,分析可得所有信息均在svalue[0][0]中存储 #svalue[0][0]元素数据为sheet标签数sn * 文件数fn sn=x fn=len(allxls) endvalue=[] #设置一个函数专门获取svalue里面的数据,即获取各项标签的数据 def getsvalue(k): for z in range(k,k+fn): endvalue.append(svalue[0][0][z]) print(endvalue) return endvalue #打开最终写入的文件 wbl=xlsxwriter.Workbook(endxls) #创建一个sheet工作对象 ws=wbl.add_worksheet() polit=0 linenum=0 #依次遍历每个sheet中的数据 for s in range(0,sn*fn,fn): thisvalue=getsvalue(s) tvalue=thisvalue[polit:] #将一个标签的内容写入新文件中 for a in range(0,len(tvalue)): for b in range(0,len(tvalue[a])): for c in range(0,len(tvalue[a][b])): #print(linenum) #print(c) data=tvalue[a][b][c] ws.write(linenum,c,data) linenum+=1 #叠加关系要设置分割点 polit=len(thisvalue) wbl.close()
效果如下图所示: