使用 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
我有一个代码可以生成任意长度的列表并将其输出到 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