ошибка Python при добавлении формулы в ячейку ниже последней строки - PullRequest
0 голосов
/ 06 декабря 2018

С некоторой помощью мне удалось собрать скрипт, но с этим блоком я получаю сообщение об ошибке:

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 голосов
/ 07 декабря 2018

Ваша проблема в том, что используемые вами библиотеки работают с файлами Excel , и это не совсем то же самое, что работа в программе Excel .Программа Excel делает довольно много вещей автоматически, которые не выполняются openpyxl или xlrd.

Например, одна вещь, которую вы должны знать о файлах Excel, - это то, что формулы и их результаты - это две совершенно разные вещи.Они хранятся отдельно и читаются независимо.В openpyxl, если вы пишете формулу в ячейку, то в этой ячейке only хранится формула.Он не (и не может) вычислить результат формулы.

Аналогично, когда приходит время читать ячейку, 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 , а не с необработанными файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...