Openpyxl перебирает ячейки, не может сравнивать ячейки со строкой

У меня возникли проблемы с итерацией по каждой ячейке в рабочей книге и сравнением значения вызова со строковым объектом. Я могу успешно сравнить объекты datetime в книге, но когда дело доходит до обычных объектов String, ничего не печатается, а ячейки не обновляются.

wb = openpyxl.load_workbook(pathz, read_only=False)
ws = wb.active
    for row in ws.iter_rows():
        for cell in row:
            if cell.value == a:
                print("Found datetime cell")
                cell.value = newDate

            if cell.value == "Hello":
                print("Found string cell")
                cell.value = "Goodbye"

wb.save(pathz)

1 ответ

Решение

Вы должны быть в состоянии читать и записывать даты и строки в файл в формате Excel без проблем. Код ниже показывает, как это работает для обоих типов содержимого ячеек.

Строка, которую пытался сопоставить ОП, содержала символ дефиса в Юникоде. '\u2013', который не совпадает с ASCII '-' символ, поэтому строки не совпадают. Строки в приведенном ниже примере используют этот символ черты Unicode.

# -*- coding: utf-8 -*-
import openpyxl
import datetime

#create a workbook containing a string and save it
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = datetime.datetime(2017, 4, 1)
ws['A2'] = '4/1/2017–4/30/2017' # The dash between the dates is '\u2013'
wb.save('Test.xlsx')

#open that workbook and read it
wb = openpyxl.load_workbook('Test.xlsx', read_only=False)
ws = wb.active

for row in ws.iter_rows():
    for cell in row:
        print('Cell: [{}] is type({}): "{}"'.format(cell.coordinate, type(cell.value).__name__, cell.value))
        if cell.value == '4/1/2017–4/30/2017':
            print('Found "4/1/2017–4/30/2017"')

Запуск этого на Python 3.6 приводит к следующему выводу:

Cell: [A1] is type(datetime): "2017-04-01 00:00:00"
Cell: [A2] is type(str): "4/1/2017–4/30/2017"
Found "4/1/2017–4/30/2017"
Другие вопросы по тегам