用xlrd与xlwt将大量excel表格复制到一个表格中

 任务大致是这样的:

有一个文件夹,下面会有很多深度不确定的子文件夹,但是最后都会包含数份我需要整理的文件。将其中一个最小文件夹下的exel表格放置到一起。

本例所使用的库。说是使用的xlrd,其实pip和用的是xlrd。因为xlrd最新版本不支持‘.xlsx’文件。时间模块用来计算程序运行时间。

第一个函数是打开excel文件。给定一个,就可以通过索引的方式返回第一个工作表。

第二个函数是将ctrl_c这个工作表粘贴到 ctrl_v这个工作表的某一列中(不是工作簿)(目的就是将多个工作表在一个工作表中平行排布)

第三个函数用于遍历文件夹。用了os模块,将所有的需要处理的文件的绝对路径以二维列表的方式储存。方便第一个函数调用。

第四个函数就是给定几个绝对路径。将这些绝对路径下的excel文件放置在ctrl_v这个表中

import os
import xlrd2 as xlrd
import xlwt
import time


# 用于获取指定文件路径下的工作簿的工作表
def open_excel(file):
    workbook = xlrd.open_workbook(file)
    worksheet = workbook.sheet_by_index(0)
    return worksheet


# 把ctrlc中的数据全部粘贴到ctrlv的某一列
def ctrl_cv(ctrl_c, ctrl_v, x):
    n_cols = ctrl_c.ncols
    n_rows = ctrl_c.nrows
    for i in range(n_cols):
        elist = ctrl_c.col_values(i)
        for j in range(len(elist)):
            ctrl_v.write(j, x+i, str(elist[j]))


def read_xls(o_path):
    # 遍历路径文件夹
    i = 0
    for file in os.walk(o_path):
        if file[2]:
            sheet_list.append(my_workbook.add_sheet(str(i)))
            name.append([])
            for each_list in file[2]:
                file_path = file[0]+"/"+each_list
                name[i].append(file_path)
            i = i + 1
    print('总共有'+str(len(sheet_list))+'个sheet')


def zhu(o_name, ctrl_v):
    i = 0
    for Each in o_name:
        leach = Each[-5:]
        if leach == '.xlsx':
            ctrl_cv(open_excel(Each), ctrl_v, 7*i)
            i = i+1


name = []
sheet_list = []
operate_path = r"E:\5050777302684 1113-1212"
# for root, dirs, files in os.walk(operate_path):
#     print('root:', root)
#     print('dirs:', dirs)
#     print('files:', files)
#     print('\n')


my_workbook = xlwt.Workbook()
# 创建新的工作表对象 worksheet, 并取名为 test_sheet
# ctrlv = my_workbook.add_sheet('test_sheet')


read_xls(operate_path)


z = 0
for each in sheet_list:
    t1 = time.time()
    zhu(name[z], each)
    t2 = time.time()
    print('第'+str(z+1)+'个sheet已完成')
    print('用时'+str(t2-t1)+'\n')
    z = z+1

my_workbook.save('test.xls')

本来以为可以到此结束了,后来发现“甲方”的要求和我的做法不太一样。上文是将需要放在一起的表格放在一个sheet中。然后不同的文件夹下的表格,放在不同的sheet中。但是,后来发现 ,想要做到的是将不同的文件夹下的文件纵向排布在同一个表格中。

由于通过xlwt创建的文件是不能由xlrd读取其行数的,所以只能自己统计。 

以下是修改过后的代码:

import os
import xlrd2 as xlrd
import xlwt
import time


# 用于获取指定文件路径下的工作簿的工作表
def open_excel(file):
    workbook = xlrd.open_workbook(file)
    worksheet = workbook.sheet_by_index(0)
    return worksheet


# 把ctrlc中的数据全部粘贴到ctrlv的某行某列
def ctrl_cv(ctrl_c, ctrl_v, x, y):
    n_cols = ctrl_c.ncols
    n_rows = ctrl_c.nrows
    for i in range(n_cols):
        elist = ctrl_c.col_values(i)
        for j in range(len(elist)):
            ctrl_v.write(x+j, y+i, str(elist[j]))


def read_xls(o_path):
    # 遍历路径文件夹
    i = 0
    for file in os.walk(o_path):
        if file[2]:
            # sheet_list.append(my_workbook.add_sheet(str(i)))
            name.append([])
            for each_list in file[2]:
                file_path = file[0]+"/"+each_list
                name[i].append(file_path)
            i = i + 1
    print('总共有'+str(len(sheet_list))+'个sheet')


# 切片获取表号 E:\正确接线三项三线\三相三线 正相序\5491895832575 1114-1213/三相电流数据表格 (5491895832575).xlsx -> '5491895832575'
def ammeter(path):
    return path[17:19], path[-19:-6:]


def zhu(o_name, ctrl_v):
    i = 0
    m = 0
    a = ''
    global gross_rows
    for Each in o_name:
        leach = Each[-5:]
        if leach == '.xlsx':
            if i == 0:
                a, b = ammeter(Each)
                m = open_excel(Each).nrows
                for x in range(m):
                    ctrl_v.write(gross_rows + x, 0, a)
                    ctrl_v.write(gross_rows + x, 1, b)
            ctrl_cv(open_excel(Each), ctrl_v, gross_rows, 7 * i + 2)
            i = i+1
    gross_rows = gross_rows+m


gross_rows = 0
name = []
sheet_list = []
operate_path = r"E:\正确接线三项三线"
# for root, dirs, files in os.walk(operate_path):
#     print('root:', root)
#     print('dirs:', dirs)
#     print('files:', files)
#     print('\n')


my_workbook = xlwt.Workbook()
# 创建新的工作表对象 worksheet, 并取名为 test_sheet
ctrlv = my_workbook.add_sheet('test_sheet')


read_xls(operate_path)


z = 0
for each in range(len(name)):
    t1 = time.time()
    zhu(name[z], ctrlv)
    print(name[0][0])
    gross_rows = gross_rows+1
    t2 = time.time()
    print('第'+str(z+1)+'个sheet已完成')
    print('用时'+str(t2-t1)+'\n')
    z = z+1

my_workbook.save('test.xls')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值