如何使用 python 从 excel 中的特定列中提取不可见评论
How to extract invisible comments from specific columns in excel using python
Data:我有一个相当大的 excel 文件,有 20 多列。每个单元格都包含注释。
Desired Goal:我正在尝试阅读来自 列 M 的所有评论,从第一行到 'Engine'最后一行。
期望输出:我想提取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个文件中有几种评论状态:
- 完全隐藏,没有指示器 - (双击触发评论显示)
- 用红色指示器隐藏 -(鼠标悬停触发评论显示)
- 显示。
worksheet.Cells(i, j).Comment.Text()
此方法适用于#2 和#3 情况。但它不适用于 #1 hidden without indicator case。
如评论中所述,我无法重现您提到的有关隐藏评论的问题,因此我无法对此发表评论。但是,无论如何,下面的方法很可能只是解决了这个问题。
关于性能,您可以尝试的一件事是完全避免 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
依赖于将所有内容分派给 Excel 进程。通过 openpyxl
路线,您当然会失去 COM 的全部功能,但您可能会发现只有在 COM 是唯一选择时才有意义。在这里,除了赢得大量速度之外,您还不必在脚本旁边安装 Excel 进程 运行(实际上,您甚至根本不需要安装 Excel ),它的额外好处是使您的脚本更易于测试。
Data:我有一个相当大的 excel 文件,有 20 多列。每个单元格都包含注释。
Desired Goal:我正在尝试阅读来自 列 M 的所有评论,从第一行到 'Engine'最后一行。
期望输出:我想提取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个文件中有几种评论状态:
- 完全隐藏,没有指示器 - (双击触发评论显示)
- 用红色指示器隐藏 -(鼠标悬停触发评论显示)
- 显示。
worksheet.Cells(i, j).Comment.Text()
此方法适用于#2 和#3 情况。但它不适用于 #1 hidden without indicator case。
如评论中所述,我无法重现您提到的有关隐藏评论的问题,因此我无法对此发表评论。但是,无论如何,下面的方法很可能只是解决了这个问题。
关于性能,您可以尝试的一件事是完全避免 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
依赖于将所有内容分派给 Excel 进程。通过 openpyxl
路线,您当然会失去 COM 的全部功能,但您可能会发现只有在 COM 是唯一选择时才有意义。在这里,除了赢得大量速度之外,您还不必在脚本旁边安装 Excel 进程 运行(实际上,您甚至根本不需要安装 Excel ),它的额外好处是使您的脚本更易于测试。