(2020年9月8日)資料夾下多電子表格彙總合併
阿新 • • 發佈:2020-09-08
問題描述:
各單位交來格式統一的電子表格,現在需要將其彙總合併為一個表格。
程式實現:
程式程式碼:
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程式