将公式添加到最后一行下方的单元格时出现python错误

时间:2018-12-06 10:23:37

标签: python excel openpyxl xlrd

在一些帮助下,我已经能够整理一个脚本,但是在这个代码块中,我不断遇到错误:

import openpyxl
import xlrd
import requests

# loads the workbook - assumes the sussex.xlsx file is in the same directory as the script
wb = openpyxl.load_workbook("sussex.xlsx")

# load first worksheet
ws = wb.worksheets[0]

#go to the British Fencing Association website and download this file (specified)
url = "https://www.britishfencing.com/wp-content/uploads/2018/10/mf_oct_2018.xls"
downloaded_file = requests.get(url)

#write the contents to a new file called rankings.xls
with open("rankings.xls", 'wb') as file:
    file.write(downloaded_file.content)

# Use xlrd to open older style .xls workbook
rank_wb = xlrd.open_workbook('rankings.xls')

# Get the first sheet of the ranked workbook
rank_ws = rank_wb.sheet_by_index(0)

# Get the total number of rows to be used to create our license list
rows = rank_ws.nrows

# Due to formatting, real numbers don't start until here
startrow = 5

# Create list of lic numbers
rank_lic = rank_ws.col_values(colx=4, start_rowx=startrow, end_rowx=rows)

# print the values in the second column of the first sheet
for row in ws['B1:B{}'.format(ws.max_row)]:
    for cell in row:
        print(cell.value)

# Putting values in same row as "Rank, Name, First name,...." adjust as necessary
ws.cell(2, 7).value = 'Fencer NIF'
ws.cell(2, 8).value = 'Points scored'


# Define function to lookup NIF and return value
def get_nif(x):
    startrow = 5
    for y in rank_lic:
        if int(x) == y:
            try:
                return int(rank_ws.cell_value(startrow, 9))
            except ValueError:
                pass
        startrow = startrow + 1

#sum of NIF values

Grand_Total_Row = ws.max_row + 1 
ws.cell(Grand_Total_Row, 1).value = "Grand Total"
ws.cell(Grand_Total_Row, 4).value = "=SUM(G4:G{})".format(ws.max_row - 1)

for row in ws['D3:D{}'.format(ws.max_row)]:
    for cell in row:
        nif_val = get_nif(cell.value)
        ws.cell(cell.row, 7).value = nif_val

# While testing I always save to a different workbook so I don't overwrite my test spreadsheet
wb.save('sussex2.xlsx')

错误是:

Traceback (most recent call last):
File "clubranking.py", line 63, in <module>
nif_val = get_nif(cell.value)
File "clubranking.py", line 48, in get_nif
if int(x) == y:
ValueError: invalid literal for int() with base 10: '=SUM(G4:G35)'

我想做的是将G4单元格移到最后一个具有该列中值的单元格,并在其下一行将这些值求和。

有人对如何解决这个问题有任何想法吗?

仅供参考,我正在使用请求; xlrd;和openpyxl

1 个答案:

答案 0 :(得分:3)

您的问题是,您正在使用的库可与Excel 文件一起使用,而这与在Excel 程序中进行操作不太一样。 Excel程序会自动执行很多操作,而这些操作是openpyxl或xlrd无法完成的。

例如,您必须了解Excel文件的一件事是公式及其结果是两个完全独立的事物。它们分别存储和独立读取。在openpyxl中,如果您将公式写入单元格,则该单元格中存储有公式。它不会(也不能)计算公式的结果。

类似地,当需要读取一个单元格时,openpyxl会 给您公式的结果,但不能同时给您两个(您必须选择一个想要;默认情况下,如果有一个,您将获得公式。 xlrd只会给您结果。而且,我的压力还不够大:在您的情况下,没有结果可读取,因为它只是未经计算的。因此,即使您告诉openpyxl给您结果而不是公式,对您也无济于事。

相比之下,Excel 程序(默认情况下)始终会重新计算公式,并同时存储公式及其结果,从而使它们保持同步。您正在使用的库不是这种情况。

您显示的错误消息是您尝试将'=SUM(G4:G35)'转换为整数时得到的消息。请注意,Python的int函数不知道什么是Excel,什么单元格或什么公式。它试图转换等号,大写字母“ S”,大写字母“ U”,大写字母“ M”,左括号,大写字母“ G”,数字4,冒号,另一个大写字母“ G”,数字3和5,以及右边的整数。 Python告诉您它不能理解为整数。

如果您想继续使用Python进行操作,您的主要选择是:(1)用Python自己计算总和,然后使用它;或(2)使用不同的库,例如xlwings,它将与Excel 程序一起使用,而不是与原始文件一起使用。