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

时间:2017-03-07 22:44:59

标签: python excel xlsxwriter

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

const user = ( slug ) => ( state ) => state.users[state.slugs[slug]];

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

由于

4 个答案:

答案 0 :(得分:1)

考虑一个定义的方法,从列号计算 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)

答案 1 :(得分:1)

如果您正在使用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部分。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

首先,如果可以,你应该避免使用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

/!\ BEWARE列号以pythonic方式存在,即第一个为0,而不是"例外" (?)一,这将是第一个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)