使用 python 在 xlsxwriter 中输出超过 26 列

Output to more than 26 columns in xlsxwriter with python

我有一个代码可以生成任意长度的列表并将其输出到 excel 电子表格。然后它使用以下代码对每一列进行总计:

for i in range(years):
    average = "=AVERAGE("
    average += chr(65+i)
    average += "1:"
    average += chr(65+i)
    average += str(x)
    average += ")"
    worksheet.write(x, i, average)

理论上这会输出“=AVERAGE(A1:Ax)”,其中 x 是电子表格的底行。我只想处理大于 26 的宽度,即如果年数大于 26,那么代码可以说“=AVERAGE(AA1:AAx)”,而不是 chr(65+i)。

谢谢

首先,如果可以的话,你应该避免使用 xlsx 文件,处理这些文件很烦人。

其次,您是否考虑过从 python 中计算您的平均值,然后将其写入 excel 文件?

如果仍然不行,这是我的解决方案(实际上是将您的列号转换为 26 进制数字,然后将每个数字与相应的字母数字字符相关联)

def col_to_char(column): 
    """convert from column number to column name""" 

    if column == 0: return 'A' 
    name=''

    while column!=0: 
        name += ( chr(65 + column % 26) )
        column = column // 26
    return name

/!\ 请注意,此处的列号以 pythonic 方式显示,即第一个为 0,而不是 "excelic" (?) 一个,后者将是第一个1

您的代码将是:

for i in range(years):
    column_name=col_to_char(i)
    average = "=AVERAGE(" +column_name +"1:" +column_name +str(x) +")"
    worksheet.write(x, i, average)

考虑一个已定义的方法来根据列号计算 ColumnLetter,无需 Excel 的 Char() 转换:

def ColumnLetter(ColumnNumber):
    s = ''
    alpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    n = int(ColumnNumber)

    while n > 0: 
        c = ((n - 1) % 26)
        s = alpha[c] + s
        n = (n - c) // 26

    return s

for i in range(years):
    average = "=AVERAGE("
    average += ColumnLetter(i)
    average += "1:"
    average += ColumnLetter(i)
    average += str(x)
    average += ")"
    worksheet.write(x, i, average)

如果您使用的是 XlsxWriter,那么您还可以使用它提供的函数将 (row, col) 值转换为字符串:

from xlsxwriter.utility import xl_rowcol_to_cell
from xlsxwriter.utility import xl_range

cell = xl_rowcol_to_cell(0, 26)
cell_range = xl_range(0, 26, 66, 26)
formula = '=AVERAGE({})'.format(cell_range)

print(cell)        # AA1
print(cell_range)  # AA1:AA67
print(formula)     # =AVERAGE(AA1:AA67)

有关详细信息,请参阅 XlsxWriter 文档的 Working with Cell Notation 部分。

不使用字母样式的引用,使用(行,列)样式更简单,如下所述:https://xlsxwriter.readthedocs.io/working_with_cell_notation.html