使用python进行Excel文档的合并

使用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()
    

    效果如下图所示:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值