
xlwings 默认的 .note 属性无法访问受密码保护工作表中的批注,需通过底层 COM 接口(.api.Comment.Text())获取;本文详解两种可靠方法:单单元格批注提取与全工作簿批注遍历。
xlwings 默认的 `.note` 属性无法访问受密码保护工作表中的批注,需通过底层 com 接口(`.api.comment.text()`)获取;本文详解两种可靠方法:单单元格批注提取与全工作簿批注遍历。
在使用 xlwings 处理受密码保护的 Excel 文件时,一个常见陷阱是:调用 range.note 总是返回 None,即使目标单元格确实存在手动添加的批注(Excel 中的“插入批注”或“新建批注”)。这是因为 xlwings 的高层封装 .note 属性在工作表受保护状态下无法穿透权限限制——它依赖于 Excel 的公开对象模型中较受限的接口。
✅ 正确做法是绕过高层抽象,直接调用底层 COM 对象(仅 Windows + pywin32 环境支持),通过 .api.Comment.Text() 获取原始批注文本:
import xlwings as xw
PATH = r'C:/Users/Hendo/Pictures/Sample.xlsx'
psw = '1234'
wb = xw.Book(PATH, password=psw)
sheet = wb.sheets['Sheet1']
# ✅ 正确:使用 .api.Comment.Text() 读取批注内容
try:
comment_text = sheet.range('H15').api.Comment.Text()
print("批注内容:", comment_text)
except AttributeError:
print("H15 单元格无批注")
print("单元格值:", sheet.range('H15').value)⚠️ 注意事项:
诊断并修复涉及公式、命名范围、Power Query 刷新、数据透视表、VBA/宏保存等问题的 Microsoft Excel XLSX 工作簿
- 此方法仅适用于 Windows 平台(依赖 pywin32),macOS/Linux 不支持 .api 访问;
- 若单元格未添加批注(而非批注为空),调用 .Comment.Text() 会触发 AttributeError,务必用 try/except 包裹;
- .api.Comment 返回的是 Excel COM Comment 对象,其 .Text() 方法返回纯字符串(含换行符),无需额外解析;
- 工作表保护(sheet.api.Protect)不影响 .api.Comment 访问——这是 Excel COM 的设计特性,批注属于独立元数据层。
? 进阶技巧:批量提取整个工作簿所有批注
以下脚本自动遍历每个工作表、每个 Comment 对象,并安全输出作者、位置与内容:
import xlwings as xw
excel_file = r'C:/Users/Hendo/Pictures/Sample.xlsx'
with xw.App(visible=False) as app:
wb = xw.Book(excel_file)
for sheet in wb.sheets:
print(f"---- 工作表 '{sheet.name}' ----")
# 遍历该表所有批注(非空单元格批注集合)
comments = sheet.api.Comments
if comments.Count == 0:
print("→ 无批注")
continue
for cmt in comments:
addr = cmt.Parent.Address.replace('$', '') # 如 'H15'
try:
text = cmt.Text()
author = cmt.Author
print(f"? 位置: {addr} | 作者: {author} | 内容: {text.strip()}")
except Exception as e:
print(f"⚠️ 读取批注 {addr} 时出错: {e}")
wb.close()? 提示:sheet.api.Comments 是 Excel 原生批注集合,比逐个检查 .api.Comment 更高效,且天然跳过无批注单元格;cmt.Parent.Address 精确定位来源单元格,避免因合并单元格或范围误判导致的地址偏差。
总结:当 range.note 返回 None 时,不要怀疑数据缺失——请优先启用 .api.Comment.Text() 路径。它稳定、直接、兼容受保护工作表,是 xlwings 在 Windows 环境下读取 Excel 批注的事实标准方案。

















