如何检查是否有评论

时间:2013-12-02 14:45:03

标签: python excel com comments

我有一个.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 个答案:

答案 0 :(得分:4)

以下是我认为最好的方法,使用Python Excel模块,特别是xlrd

假设你有一个工作簿,其中有一个单元格A1,其中有一条由Joe 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(我今天感觉很有创意)。然后,我们使用工作表对象的notes属性创建一个名为cell_note_map的注释对象的dicitonary。此字典将注释的(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,这样就没有问题了
  • 评论的作者将始终首先列出,但可以使用author属性而不是text单独访问。作者和文字之间也总是有\n
  • cell_note_map不会映射没有评论的单元格。因此,没有任何评论的完整工作表将产生一个空字典

答案 1 :(得分:0)

我认为将评论定义为None,然后尝试添加Stuff(我猜一个字符串)将不起作用。

尝试使用comments = ""代替comments = None

除此之外,它会有助于查看错误。

答案 2 :(得分:0)

我认为这应该有效。但是,你有

comments = None

然后

comments += comment

我认为你不能做None +任何事情。最有可能的是,你要么想做

comments = ''
comments += comment

comments = []
comments.append(comment)

您可能需要解决的另一件事:

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

(2,i)语法在python中似乎不起作用。更改为Cells[2][i]。另外,如果Comment不存在,那么它将是None,并且不会有Text()函数。即:

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