001、文件夹下多电子表格汇总合并

001、文件夹下多电子表格汇总合并
问题描述:
各单位交来格式统一的电子表格,现在需要将其汇总合并为一个表格。
 
程序实现:
程序代码:
import xlwings as xw
import os

data_ncols = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', 11: 'K'}
data = []
data_one = []
i = 0
app = xw.App(visible=False, add_book=False)
for r, d, f in os.walk('../../excel/20200905'):
    for s in f:
        if s[-5:].lower() == '.xlsx' and s[:2] != '~$':  # 切片,取字符串后5个字符
            i += 1
            wb = app.books.open(r + '/' + s)  # 打开列表中的每一个文件
            info = wb.sheets[0].used_range

            # 数据行数
            nrows = info.last_cell.row
            # 数据列数
            ncols = info.last_cell.column
            print(f'{i}:正在处理{r}/{s};有{nrows}行,{ncols}列数据。')
            # 将列数转换为字母
            ncols_c = data_ncols[ncols]
            ncols_c_one = data_ncols[ncols + 1]
            # 计算数据区域转换为python能识别的字符串
            # 处理第一个表格时,包含表头;其后不含表头
            if i == 1:
                data_range = f'A1:{ncols_c}{nrows}'
                data.extend(wb.sheets[0].range(data_range).value)
            else:
                data_range = f'A2:{ncols_c}{nrows}'
                # 输出整个电子表数据
                # 当nrows=2,表格只有一行数据时,以(append)列表作为一个元素加到新列表中
                # 当nrow>2时,表格有多行数据,以extend方法加入到新列表。
                # extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
                # append() 方法用于在列表末尾添加新的对象。
                if nrows != 2:
                    data.extend(wb.sheets[0].range(data_range).value)
                else:
                    # print(wb.sheets[0].range(data_range).value)
                    data.append(wb.sheets[0].range(data_range).value)

            wb.close()

# 去除列表data中的空行
for k in data:
    # 把k转换为集合,
    # set(k) != {None}成立,说明k不为空行
    # 把k添加到新列表data_one
    if set(k) != {None}:
        # if k not in data_one:
        data_one.append(k)

# 添加工作表
wb = app.books.add()
ws = wb.sheets[0]
# 设置单元格格式为文本
ws.range(f'a:{ncols_c}').api.NumberFormat = '@'
# 把数据放入新工作表的A1单元格
ws.range('A1').value = data_one
# 自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。
ws.autofit()
# 保存新工作表

'''选择sheet页面最右下角的单元格,获取最大行数,和列数'''
cell = ws.used_range.last_cell
rows = cell.row
columns = cell.column

'''如果是一个区域的单元格,边框设置如下'''
# f'A1:{data_ncols[columns]}{rows}'有数据的单元格区域
b3 = ws.range(f'A1:{data_ncols[columns]}{rows}')
# 7-10为外部边框,11-12为内部边框
for e in range(7, 13):
    # 边框样式(LineStyle)
    b3.api.Borders(e).LineStyle = 1
    # 边框粗细(Weight)
    b3.api.Borders(e).Weight = 2

wb.save('../../excel/001、汇总.xlsx')
wb.close()  # 关闭工作表

app.quit()  # 退出excel程序

  

posted @ 2020-09-08 20:31  lqsj2018  阅读(203)  评论(0编辑  收藏  举报