На первоначальный вопрос и пример точно отвечает @jonnybazookatone answer ниже. Расширенный пример — это другая ошибка. Мне кажется, что это недостаток xlrd
, но я взломал решение для того, что вы хотите. Первый раздел — объяснение, последний раздел — хак.
Объяснение
Глядя на более развернутый пример, сообщение об ошибке создается из строк кода, которые обрабатывают состояние ошибки для объекта Name
, где по какой-то причине не удалось получить результат вычисления формул в диапазоне Name
.
Фактическая зарегистрированная ошибка
AttributeError: 'NoneType' object has no attribute 'logfile'
является вторичной ошибкой, указывающей, что self.book
оценивается как None
для этого объекта Name
.
Во-вторых, вы упускаете важную деталь, я думаю, что ваш файл Excel имеет формат .xlsx
. Обратите внимание на завершающий x. В обычном синтаксическом анализаторе xls объект Name не имеет атрибута formula_text
, поэтому ваш код завершается со следующей ошибкой.
Traceback (most recent call last):
File "D:\q1.py", line 16, in <module>
print cell_obj.formula_text
AttributeError: 'Name' object has no attribute 'formula_text'
Пожалуйста, будьте осторожны с вашими примерами кода - мне потребовалось некоторое время, чтобы отследить эту разницу - файлы xlsx
анализируются совершенно другим кодом в xlrd
. С исправленным xlsx
я могу воспроизвести вашу ошибку.
Атрибут formula_text
в этом случае просто дает ссылку в нотации RC на ячейку, которая является вашим именованным диапазоном. Следует отметить, что функция устанавливающая formula_text
a> имеет оговорку "#### UNDER CONSTRUCTION ####"
и существует с момента первоначальной фиксации модуля xlsx в 2012 году.
Проблема в том, насколько я вижу, формулы никогда не оцениваются при открытии xlsx, поэтому вы сталкиваетесь с ошибкой, что Name.res
равно None, и поэтому вы видите свою ошибку. Кажется, это xlrd
ошибка/фича.
взломать
Я придумал неприятный хак, который будет делать то, что вы хотите в случае, когда ваш диапазон представляет собой одну ячейку, путем расширения ссылки на ячейку. Обратите внимание, что он не будет работать для именованных диапазонов, ссылающихся на более чем одну ячейку, как сейчас, но его можно легко изменить, чтобы справиться с этим сценарием:
hack = cell_obj.formula_text
(sheetName,ref) = hack.split('!')
(discard,colStr,rowStr) = ref.split('$')
col = 0
for i in range(len(colStr)):
colAdd = string.ascii_uppercase.index(colStr)
col += colAdd * 10**i
row = int(rowStr)-1
print("Trying to evaluate cell",row,col,"in sheet",sheetName)
print workbook.sheet_by_name(sheetName).cell(row,col)
person
J Richard Snape
schedule
27.01.2015
XLRDError
. Вы уверены, что именно эта строка выдает вам ошибку? поскольку это относится кlogfile
- может быть, это ваша настройка ведения журнала или что-то, что на самом деле не работает? Не могли бы вы дать нам немного более полный вариант использования? Может быть, ваш вопрос не совпадает с исходным вопросом от @Dickster, и вам нужен новый вопрос? - person J Richard Snape   schedule 26.01.2015