python - 如何使用Python从Excel中的特定列中提取不可见的注释

标签 python excel openpyxl pywin32 win32com

数据:我有一个相当大的 Excel 文件,有 20 多列。每个单元格都包含注释。

期望目标:我正在尝试阅读名为“Engine”的M 列中从第一行到最后一行的所有评论。

期望输出:我想提取M列中的所有评论并将它们保存在列表或pandas数据框中。

以下是我在阅读其他人的帖子后尝试的:

# load the worksheet for interation
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
workbook = xlApp.Workbooks.Open('My_large_data_file.xls')
worksheet = workbook.Sheets('Mysheet')


# get the row counts for iteration
from openpyxl import load_workbook
wb = load_workbook('My_large_data_file.xls', read_only=True)
sheet = wb.get_sheet_by_name('Mysheet')
row_count = sheet.max_row

comments = []
# iteration
for i in range(2, row_count + 1): # first row is column names
    print(i)
    comment = worksheet.Cells(i, 13).Comment.Text() # Column M = #13
    comments.append(comment)

但是,此方法仅适用于默认情况下注释可见的单元格。如果单元格的注释不可见,它将被读取为 NoneType。然后我得到这样的错误:

Traceback (most recent call last):

  File "<ipython-input-64-dead2ed27460>", line 5, in <module>
    comment = worksheet.Cells(i, 13).Comment.Text() # Column M = #13

AttributeError: 'NoneType' object has no attribute 'Text'

问题:

1)如何将所有单元格的注释设置为可见,以便我可以提取它们?我不确定是否需要在 python 中应用一些 VBA 代码。

2)我当前的代码效率不高。特别是我正在处理 60 多个这样的 Excel 文件,每个文件包含 70000 多行。有什么建议可以改进吗?

提前致谢!

######################################

Excel 文件中的注释有几种状态:

  1. 完全隐藏,没有指示器 - (双击触发评论显示)
  2. 用红色指示器隐藏 - (鼠标悬停触发评论显示)
  3. 已显示。

worksheet.Cells(i, j).Comment.Text()

此方法适用于 #2 和 #3 情况。但它不适用于没有指示器大小写的 #1 隐藏。

最佳答案

正如评论中提到的,我无法重现您提到的有关隐藏评论的问题,因此我无法对此发表评论。然而,无论如何,下面的方法很可能就能解决这个问题。

关于性能,您可以尝试的一件事是完全避免 COM 的开销,因为 openpyxl 实际上拥有您需要的一切。

因此,您可以执行以下操作:

from openpyxl import load_workbook
wb = load_workbook('My_large_data_file.xls')
sheet = wb.get_sheet_by_name('Mysheet')
comments = [c.comment.text for c in sheet['M'][1:]]

就性能而言,这应该会给您带来几个数量级,如以下 1000 行比较所示:

In [64]: %timeit [c.comment.text for c in sheet['M'][1:1000]]
1.31 ms ± 25.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [72]: %timeit [worksheet.Cells(i, 13).Comment.Text() for i in range(2, 1000)]
1.7 s ± 330 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

这里的区别在于 openpyxl 直接解析 Excel 文件,而 win32com 依赖于将所有内容分派(dispatch)到 Excel 进程。通过采用 openpyxl 路线,您当然会失去 COM 的全部功能,但您可能会发现只有当 COM 是唯一的选择时才有意义。在这里,除了获得巨大的速度之外,您还不必让 Excel 进程与您的脚本一起运行(事实上,您甚至根本不需要安装 Excel),这还有一个额外的好处,即使您的脚本更加高效。更易于测试。

关于python - 如何使用Python从Excel中的特定列中提取不可见的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860507/

相关文章:

openpyxl - 使用 openpyxl 1.8.6 将 excel 单元格编号格式 "General"更改为 "Text"

python - Kivy:如何向文本输入添加填充

python - 为什么 len(a[0]) 与 a.shape[1] 不同

arrays - VLOOKUP() 使用数组的替代方法

r - 使用 R 从 Bloomberg 中提取历史盘中数据

python - 如何将Openpyxl生成的xlsx输出到浏览器?

python - 如何在Ubuntu启动时自动启动该服务?

python - 使用 Python OpenCV 在模糊对象周围找到紧密轮廓

excel - 错误 : Can' t connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable

python-2.7 - 在openpyxl中使用 `append`时如何应用单元格样式?