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