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