1. 程式人生 > 實用技巧 >(2020年9月8日)資料夾下多電子表格彙總合併

(2020年9月8日)資料夾下多電子表格彙總合併

問題描述: 各單位交來格式統一的電子表格,現在需要將其彙總合併為一個表格。 程式實現: 程式程式碼:
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程式