Openpyxl записи строк приводит к TypeError - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу записать строки из листа1 в лист2, если столбец D имеет значение больше 5. Но я столкнулся с ошибкой. Ниже приведен код и ошибка:

import openpyxl

Runwb = openpyxl.load_workbook('C:\\Python\\ExtractReport\\Top5.xlsx')

""" Create new sheet Top5 """
Runwb.create_sheet(title="Top5")
Runwb.save("C:\\Python\\ExtractReport\\Top5.xlsx")
print("Top5 sheet Created")

""" Create new instance to copy """
"""Runwb1 = openpyxl.load_workbook('C:\\Python\\ExtractReport\\Top5.xlsx')"""
Rawsheet = Runwb['Raw']
Top5sheet = Runwb['Top5']
TestDetailwb = openpyxl.load_workbook('C:\\Python\\ExtractReport\\TestDetails.xlsx')

Testdetailsheet = TestDetailwb['TestDetails']

""" Copy Data to Results """""
for row in range(Rawsheet.max_row):
      for col in range(Rawsheet.max_column):
          if (Rawsheet.cell(row+1, column=4).value) > Testdetailsheet.cell(row=2, column=2).value:
                Top5sheet.cell(row+1, col+1).value=Rawsheet.cell(row+1, col+1).value
print("Top5 sheet Updated")
Runwb.save("c:\\Python\\ExtractReport\\Top5.xlsx")

результат равен

========================== RESTART: C:\Python\Top5.py ==========================
Top5 sheet Created
Traceback (most recent call last):
  File "C:\Python\Top5.py", line 20, in <module>
    if (Rawsheet.cell(row+1, column=4).value) > Testdetailsheet.cell(row=2, column=2).value:
TypeError: '>' not supported between instances of 'str' and 'int'
>>> 

1 Ответ

0 голосов
/ 04 апреля 2020

Вы пытаетесь сравнить строку с целым числом по количеству, что приводит к ошибке TypeError:

TypeError: '>' not supported between instances of 'str' and 'int'

Для сравнения значений необходимо привести приведенное значение ((Rawsheet.cell(row+1, column=4).value) ) в тип нумерации c с чем-то вроде int(Rawsheet.cell(row+1, column=4).value), но это будет работать только тогда, когда значением является число в виде строки (например, "6").

Итак, сначала вы должны:

  • проверить, является ли значение числом в виде строки
  • преобразовать значение в int / float
  • проверить, что больше

На практике:

Если у вас есть такая функция:


def is_cell_greater(value_as_string_a, value_as_string_b):

    if type(value_as_string_a) is str and value_as_string_a.isnumeric():
        value_as_string_a = int(value_as_string_a)

    if type(value_as_string_b) is str and value_as_string_b.isnumeric():
        value_as_string_b = int(value_as_string_b)

    if type(value_as_string_b) is int and type(value_as_string_a) is int:
        return value_as_string_a > value_as_string_b
    else:
        # do something, return False or raise exception
        pass

Вы можете сделать:

if is_cell_greater(Rawsheet.cell(row+1, column=4).value, Testdetailsheet.cell(row=2, column=2).value):
   Top5sheet.cell(row+1, col+1).value=Rawsheet.cell(row+1, col+1).value
...