用 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))