如何用Python读取(或解析)Excel注释

11 投票
3 回答
10444 浏览
提问于 2025-04-16 04:08

我有几个Excel文件,这些文件里用很多注释来保存信息。比如,有一个单元格的值是2,旁边有个注释写着“2008:2#2009:4”。这看起来是说,值2是当前年份(2010)的值。这个注释把之前几年的值用‘#’分开了。我想创建一个字典来保存这些信息,像这样{2008:2, 2009:4, 2010:2},但是我不知道怎么去读取这个单元格里的注释。Python的Excel读取模块有这个功能吗?

3 个回答

0

在这里运行了最后发布的代码后,你能把那些信息存储到一个Word文档里吗?

from openpyxl import load_workbook
    
workbook = load_workbook('/tmp/data.xlsx')
first_sheet = workbook.get_sheet_names()[0]
worksheet = workbook.get_sheet_by_name(first_sheet)

for row in worksheet.iter_rows():
    for cell in row:
        if cell.comment:
            print(cell.comment.text)
3

通常来说,如果你想从Excel读取数据,我会建议使用xlrd这个库,但xlrd不支持读取评论。所以我们可以使用Excel的COM对象来实现:

from win32com.client import Dispatch
xl = Dispatch("Excel.Application")
xl.Visible = True
wb = xl.Workbooks.Open("Book1.xls")
sh = wb.Sheets("Sheet1")
comment = sh.Cells(1,1).Comment.Text()

接下来,这里是如何解析评论的:

comment = "2008:2#2009:4"
d = {}
for item in comment.split('#'):
    key, val = item.split(':')
    d[key] = val

很多时候,Excel的评论会分成两行,第一行通常是写评论的人。如果是这样的话,你的代码可能会像这样:

comment = """Steven:
2008:2#2009:4"""
_, comment = comment.split('\n')
d = {}
for item in comment.split('#'):
    key, val = item.split(':')
    d[key] = val
5

你可以不使用Excel的COM对象,而是用 openpyxl 来实现这个功能:

from openpyxl import load_workbook

workbook = load_workbook('/tmp/data.xlsx')
first_sheet = workbook.get_sheet_names()[0]
worksheet = workbook.get_sheet_by_name(first_sheet)

for row in worksheet.iter_rows():
    for cell in row:
        if cell.comment:
            print(cell.comment.text)

处理评论的方式可以和Steven Rumbalski的回答一样。

(这个例子是从 这里 修改过来的)

撰写回答