2013-12-02 4 views
2

У меня есть .xlsx файл. Некоторые ячейки в нем имеют комментарии, содержимое которых будет использоваться после этого. Как проверять, итерации через каждую ячейку, если у нее есть комментарий или нет? Этот код (в котором я пытался перебирать третий столбец и ничего больше) возвращает ошибку:Как проверить, есть ли комментарий или нет

import win32com.client, win32gui, re 
xl = win32com.client.Dispatch("Excel.Application") 
xl.Visible = 1 
TempExchFilePath = win32gui.GetOpenFileNameW()[0] 
wb = xl.Workbooks.Open(TempExchFilePath) 
sh = wb.Sheets("Sheet1") 
comments = None 
for i in range (0,201,1): 
    if sh.Cells(2,i).Comment.Text() != None: 
     comment = sh.Cells(2,i).Comment.Text() 
     comments += comment 
print(comments) 
input() 

я очень новичок в Python и извините за мой английский. Спасибо! : 3

ответ

3

Вот что я думаю, что это лучший способ, с помощью Python Excel модулей, в частности, xlrd

Предположим, у вас есть книга, которая имеет ячейку A1 с комментарием, написанной Джо Schmo, который говорит " Привет! », Вот как вы можете это понять.

>>> from xlrd import * 
>>> wb = open_workbook("test.xls") 
>>> sheet = wb.sheet_by_index(0) 
>>> notes = sheet.cell_note_map 
>>> print notes 
{(0, 0): <xlrd.sheet.Note object at 0x00000000033FE9E8>} 
>>> notes[0,0].text 
u'Schmo, Joe:\nHi!' 

Краткое объяснение того, что происходит на

Так xlrd модуля является очень удобной вещью, как только вы понять это (полную документацию here). Первые две строки импортируют модуль и создают объект рабочей книги с именем wb. Затем мы создаем листовой объект первого листа (индекс 0) и вызываем его sheet (сегодня я чувствую себя творчески). Затем мы создаем dicitonary объектов примечаний, называемых notes, с атрибутом cell_note_map нашего листового объекта. Этот словарь имеет (row, col) индекс комментария в качестве ключа, а затем объект примечания как значение. Затем мы можем извлечь текст этой заметки, используя атрибут text объекта примечания.

Для нескольких нот, вы можете перебирать словарю, чтобы получить на весь текст, как показано ниже:

>>> comments = [] 
>>> for key in notes.keys(): 
...  comments.append(notes[key].text) 
... 
>>> print comments 
[u"Schmo, Joe:\nHere's another\n", u'Schmo, Joe:\nhi!'] 

Некоторые замечания

  • Это будет работать только с .xls файлами , но не .xlsx, но Вы можете сэкономить .xlsx как .xls, так что проблем нет
  • Au часть комментария всегда будет указана первыми, но к ней можно получить доступ отдельно, используя атрибут author вместо text. Там также всегда будет \n между автором и текстом.
  • Клетки, у которых нет комментариев, не будут отображаться cell_note_map. Таким образом, полный лист без комментариев даст пустой словарь
+0

Кажется, это самый мощный способ решить проблему, спасибо!^_ ^ –

0

Я думаю, что определение комментариев как None, а затем попытка добавить материал (я думаю, строка) не будет работать.

comments = "" Попробуйте вместо comments = None

Другое то, что было бы deffinitly поможет увидеть ошибку.

+0

Спасибо! Итак, это текст ошибки после того, как я изменил None на «», как вы посоветовали: Traceback (последний последний звонок): Файл «C:/Users/1/Google Диск/python/stacktry.py" , строка 9, в , если sh.Cells (2, i) .Comment.Text()! = None: Файл «C: \ Python33 \ lib \ site-packages \ win32com \ client \ dynamic.py», строка 192, в __call__ return self._get_good_object_ (self._oleobj_.Invoke (* allArgs), self._olerepr_.defaultDispatchName, None) pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None , 0, -2146827284), None) PS «Ошибка» = «Ошибка» –

+0

Вы изменили None в строке 9 или 7? потому что я имел в виду None в строке 7 ;-) – cptPH

+0

7, конечно ;-) –

0

Я думаю, что это должно сработать. Тем не менее, у вас есть

comments = None 

, а затем

comments += comment 

Я не думаю, что вы можете сделать None + что-нибудь. Скорее всего, вы либо хотите сделать

comments = '' 
comments += comment 

или

comments = [] 
comments.append(comment) 

Еще одна вещь, которую вы, вероятно, нужно исправить:

if sh.Cells(2,i).Comment.Text() != None: 

Синтаксис (2,i) не появляется на работе в питона. Изменить на Cells[2][i]. Кроме того, если Comment не существует, то он будет None и не будет иметь функцию Text(). то есть:

if sh.Cells[2][i].Comment != None: 
    comment = sh.Cells[2][i].Comment.Text() 
+0

Это не помогло проблеме (показывает ошибку, которую я написал выше), но спасибо вам! –

+0

см. Мое обновление. это должно помочь. –

Смежные вопросы