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程序
原文:https://www.cnblogs.com/lqsj2018/p/13635137.html