天天看點

解決 Python 處理 excel 表格沒有字母列名清單的問題

用 Python 程式設計處理 excel 表格時,可以用 ws.row_max 方法取最大行數、用 ws.max_column 方法取最大列數。目前,如果想周遊列數進行單元格操作,可以将 ws.max_column 值帶入 openpyxl.utils.get_column_letter() 函數,得到列名。分享代碼如下:

for i in range(ws.max_column):
    ws.column_dimensions[get_column_letter(i+1)].width = 20
    for j in range(ws.max_row):
        ws[j+1][i].alignment = align
        
           

但是,get_column_letter() 函數能帶入的最大值為 18278 ,結果為:ZZZ,

經查詢 ofiice excel 表格最大列數如下:

2003版本256列

2007版本16384列

2013版本1048576列

按照 excel 最大表格列數:1048576,算出最大列名為:BGQCV,是以,get_column_letter() 函數遠不能滿足使用要求。為此,專門編制了【列名清單函數】col_list() ,隻要将 ws.max_column 列數帶入該函數,就能自動傳回列名的清單,滿足了目前 excel 100多萬清單格的操作需求。

程式設計思路比較簡單,就是利用字典特性,用列号做鍵名、字母列名做鍵值,得到最大列号并指派給自定義函數,用周遊方法生成列名的清單。難點在于如何生成104萬個鍵值。盡管生成104萬個字典資料比較多,但是,耗時不超過4秒鐘,還是比較實用的。程式如下:

from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.utils import get_column_letter
import time

#【列名清單函數】
def col_list(col_count):  
    s='ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    dict={} # 初始化列名字典

    # 生成 A-Z 段字典
    for n,a in enumerate(s,1):
        dict[n] = a

    # 生成 AA-ZZ 段字典
    for n,a in enumerate(s,1):
        for m,b in enumerate(s,(n+1)*26-25):
            dict[m] = a+b

    n=702  # 生成 AAA-ZZZ 段字典
    for a in s:
        for b in s:
            for c in s:
                n +=1
                dict[n] = a+b+c
            
    n=18278 # 生成 AAAA-ZZZZ 段字典
    for a in s:
        for b in s:
            for c in s:
                for d in s:
                    n +=1
                    dict[n] = a+b+c+d

    n=475254 # 生成 AAAAA-BGQCV 段字典
    for a in s:
        for b in s:
            for c in s:
                for d in s:
                    for e in s:
                        n +=1
                        dict[n] = a+b+c+d+e
                        if n == 1048576:
                            break
                    if n == 1048576:
                        break
                if n == 1048576:
                    break
            if n == 1048576:
                break
        if n == 1048576:
            break

    #with open('c:/abc.txt','w') as f:
        #f.write(str(dict))  # 查驗字典時用

    list = [] # 初始化列名的清單
    for i in range(1,col_count+1):
        list.append(dict[i])
    return list # 傳回列名的清單

if __name__ == '__main__': # 這個主程式用來示範
    t0 = time.time()
    path = 'D:/Python學習/ABC.xlsx'
    wb = load_workbook(path)
    ws = wb.active
    col_count = ws.max_column      # 擷取表格最大列數
    list_col = col_list(col_count) # 利用【列名清單函數]取回表格列名的清單
    for i in list_col:
        ws[i+'2'].font = Font(color='ff8c00',bold=True) # 将第2行所有列字型改為深橙色并加粗
        print(ws[i+'2'].value) # 顯示第2行所有列的資料
    wb.save(path)
    print('\n【共用時:{} 秒 = {} 分鐘】\n\n'.format(int(time.time()-t0),int(time.time()-t0)/60))