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

我有一个代码生成一个任意长度的列表,并将其输出到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,则代替chr(65 + i),代码可以例如说“=平均(AA1:AAx)”。

谢谢

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

使用(row,column)样式更简单一些,如下所示: https : //xlsxwriter.readthedocs.io/working_with_cell_notation.html

如果您使用的是XlsxWriter,则还可以使用它提供的函数将(row, col)值转换为string:

 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文档中的“使用单元格表示法”部分。

首先,如果你能避免使用xlsx文件,这是相当恼人的处理。

其次,你有没有考虑从python内部计算你的平均值,然后写在excel文件中?

如果还不行的话,这里是我的解决scheme(事实上是把你的列号转换成一个基数为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)