今天帮一个朋友处理了几千个小文件拼接,开始使用excel自带功能,发现很容易出现各种小问题,于是就用python写了一下,这类的操作有共通性,所以做一个记录。
#相同格式excel文件合并程序,最简易程序,未做容错处理
import os
import xlrd #读Excel文件包
import xlsxwriter #将写Excel包
#打开excel文件
def openExcel(file):
f = xlrd.open_workbook(file)
return f
#获取excel中所有的sheet表
def getSheet(f):
return f.sheets()
#读取文件内容,排除“合计”行,拼接文件内容,并返回行内容
def getFile(file,shnum):
f=openExcel(file)
table=f.sheets()[shnum]
num=table.nrows
keyword="合计"
for row in range(4,num):
rdata=table.row_values(row)
row_values = [str(i) for i in table.row_values(row)]
if len(''.join(row_values)) and (keyword not in ''.join(row_values)):
datavalue.append(rdata)
return datavalue
#获取sheet表的个数
def getshnum(f):
x=0
sh=getSheet(f)
for sheet in sh:
x+=1
return x
#函数入口
if __name__=='__main__':
#定义要合并的excel文件列表
source_dir = "F:/工资调整另一部分"
allxls = os.listdir(source_dir)
# allxls=['F:/test/excel1.xlsx','F:/test/excel2.xlsx'] #列表中的为要读取文件的路径
#存储所有读取的结果
datavalue=[]
filename = os.path.join(source_dir, allxls[0])
wb = xlrd.open_workbook(filename)
sheet = wb.sheets()[0]
#以下为获取表头部分,一般没有必要,可以合并完成后,直接手动黏贴
datavalue.append(sheet.row_values(0))
datavalue.append(sheet.row_values(1))
datavalue.append(sheet.row_values(2))
datavalue.append(sheet.row_values(3))
num=0;
for fl in allxls:
num+=1
fname=os.path.join(source_dir, fl);
print("[remind]当前文件是"+fname+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~")#此行用于排查错误,
# 因为中间报了lrd.biffh.XLRDError: Unsupported format,
# or corrupt file: Expected BOF record; found b'\x03ccz ',
# 后经排查,是因为多了一个隐藏文件,删除后问题解决
f=openExcel(fname)
x=getshnum(f)#获取sheet的个数
for shnum in range(x):
print("[remind]正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容")
rvalue=getFile(fname,shnum)
print("[remind]读取完成.共读取"+str(num)+"个文件")
#定义最终合并后生成的新文件
endfile='F:/all11.xlsx'
wb=xlsxwriter.Workbook(endfile)
#创建一个sheet工作对象
ws=wb.add_worksheet()
for a in range(len(rvalue)):
for b in range(len(rvalue[a])):
c=rvalue[a][b]
ws.write(a,b,c)
wb.close()
print("[remind]文件合并完成")
代码里面有基本的注释。正常情况代码可以直接使用。