天天看点

解决 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))