要求:使用第三方模块操作,比如xlrd、xlwt等,还需要注意一个excel中有多个sheet,也需要合并。
xlrd:
读取表格里的内容
xlrd模块中的一些常用的方法:Python中xlrd常用用法整理
xlwt与xlsxwriter:
将对应的信息写进表格里面,任选其一都可,但这两个模块都不支持修改表,无法实现追加写入。
两种思路解决:
A.换成其他模块:比如openpyxl等,这个模块可追加写入。
B.仍然使用xlwt与xlsxwriter等模块。要先将每次读取的信息存储到List列表中,然后,最后一次写入。
这里采用方案B进行:
先安装xlwt和xlsxwriter模块,这两个模块的安装是第三方模块的安装,我们选择pip方式安装。
安装过程中,出现了一些问题,pip要先升级到最新版本,但我在升级的时候一直出现错误,在网上查了查,应该是管理员权限的问题,然后用管理员权限打开cmd,再升级pip,升级成功。
之后再通过指令安装模块,指令格式是 pip install 模块名,即可安装。
先把代码贴一下然后在具体分析:
import xlrd,xlsxwriter
#设置要合并的所有文件
allxls = ["D:\\learning materials\\python\\30小时\\文件\\1.xls","D:\\learning materials\\python\\30小时\\文件\\2.xls","D:\\learning materials\\python\\30小时\\文件\\3.xls"]
#设置合并到的文件
endxls = "D:\\learning materials\\python\\30小时\\文件\\cndxls.xls"
#打开表格
#建立自定义函数,并进行异常处理(为了使程序不会异崩溃)
def open_xls(file):
try:
fh = xlrd.open_workbook(file)#使用open_workbook方法去打开文件,打开后,直接返回。
return fh
except Exception as e:
print(str("打开出错,错误为:"+e))
#获取所有sheet
#自定义函数
def getsheet(fh):
return fh.sheets()
#获取某个sheet的行数
def getnrows(fh,sheet):
table = fh.sheets()[sheet]
content = table.nrows
return content
#读取某个文件的内容并返回所有行的值
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[lenvalue:])
filevalue.append(rvalue[lenrvalue:])
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])
#print(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])
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()
之前的1,2,3表格内容:
1-sheet1 1-sheet2
2-sheet1 2-sheet2
3-sheet1 3-sheet2
合并后: