Я пытаюсь вытащить значения ячейки из листа excel, делать с ними математику и записывать вывод на новый лист. Я продолжаю получать ErrorType. Я запустить код успешно и раньше, но только добавил этот аспект, таким образом, код был дистиллированная ниже:Openpyxl: Манипулирование значениями ячеек
import openpyxl
#set up ws from file, and ws_out write to new file
def get_data():
first = 0
second = 0
for x in range (1, 1000):
if ws.cell(row=x, column=1).value == 'string':
for y in range (1, 10): #Only need next ten rows after 'string'
ws_out.cell(row=y, column=1).value = ws.cell(row=x+y, column=1).value
second = first #displaces first -> second
first = ws.cell(row=x+y, column=1).value/100 #new value for first
difference = first - second
ws_out.cell(row=x+y+1, column=1).value = difference #add to output
break
Выдает сообщение TypeError:
first = ws.cell(row=x+y, column=1).value)/100
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
Я предполагаю, что это имеет в виду значение ws.cell и 100, соответственно, так что я также пытался:
first = int(ws.cell(row=x, column=1))/100 #also tried with float
Который поднимает:
TypeError: int() argument must be a string or a number
Я подтвердил, что каждая ячейка в столбце состоит только из цифр. Кроме того, cell_data_type openpyxl возвращает 'n' (предположительно для номера, насколько я могу судить по документации).
Я также проверил более простую математику и имею ту же ошибку.
Все мои поиски, похоже, указывают на openpyxl, как обычно. Я что-то делаю неправильно, или это просто ограничение модуля? Если да, существуют ли какие-либо программные обходные пути?
В качестве бонуса, советы по написанию кода более лаконично будут высоко оценены. Я только начинаю и чувствую, что должен быть более чистый способ написать такие идеи.
Python 3.3, openpyxl-1.6.2, Windows 7
Резюме
ответ CFI помогли мне понять это, хотя я использовал немного другой обходной путь. При проверке исходного файла была одна пустая ячейка (которую я пропустил ранее). Так как я буду повторно использовать этот код позже на колонках с более спорадическими пустыми ячейками, я использовал:
if ws.cell(row=x+r, column=40).data_type == 'n':
second = first #displaces first -> second
first = ws.cell(row=x+y, column=1).value/100 #new value for first
difference = first - second
ws_out.cell(row=x+y+1, column=1).value = difference #add to output
Таким образом, если заданная ячейка была пуста, она была проигнорирован и пропускаюсь.
Всегда указывайте код, который соответствует приведенной ошибке. 'row = x + r' ссылается на переменную' r', которая не существует в вашем коде. – cfi
Спасибо, обновили сообщение об ошибке. – Jonathan