2017-03-07 96 views
2

我有一個代碼,它生成一個任意長度的列表,並將其輸出到Excel電子表格。然後,它總計每一列用下面的代碼:輸出到python的xlsxwriter超過26列

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:斧)」,其中x是所述電子表格的底部行。我只希望能夠處理大於26的寬度,即如果年數大於26,則代替chr(65 + i),代碼可以例如說爲「=平均(AA1:AAx)」。

感謝

+1

你有沒有考慮使用CSV代替XLSX的?編寫一行任意長度要容易得多。你可以在Excel中使用該文件。 – Denziloe

回答

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) 
+0

第一次工作。非常感謝你! – IvanReilly

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 

/! \提防列數字是這裏的Python的方式,即,第一個是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) 
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節的更多細節。

+1

很高興聽到模塊作者:-) –