Python openpyxl 给 Excel 单元格添加批注方法
用openpyxl.comments.Comment给Excel单元格加批注气泡,设置作者、批注内容、显示/隐藏、批注框大小,批量给异常数据加备注说明。
场景痛点
报表里总有几行数据需要"备注一下":这个客户是新签约的、这个月的异常要单独说明、这个单元格的公式口径和别人不一样。手动一个个右键插入批注、敲文字,表一多就烦。而且批注内容往往来自另一张说明表,复制粘贴来回切。用Python按规则批量写批注,异常数据自动挂上备注,省心且一致。
用到的库
pip install openpyxl
完整代码
# -*- coding: utf-8 -*-
"""
openpyxl 给 Excel 单元格添加批注
"""
from openpyxl import Workbook, load_workbook
from openpyxl.comments import Comment
def add_comments(path: str):
wb = Workbook()
ws = wb.active
ws.title = "销售"
ws.append(["区域", "销售额(万)", "备注说明"])
ws.append(["华东", 120, None])
ws.append(["华北", 88, None])
ws.append(["华南", 150, None])
ws.append(["西南", 45, None])
# 1) 给"华东"销售额单元格加批注
c1 = ws["B2"]
c1.comment = Comment(
text="华东区双11大促拉动,环比增长23%",
author="报表自动生成",
)
# 2) 批量给低于60万的区域加预警批注
for row in range(2, 6):
cell = ws.cell(row=row, column=2)
if isinstance(cell.value, (int, float)) and cell.value < 60:
cell.comment = Comment(
text=f"销售额仅 {cell.value} 万,低于红线60万,请跟进",
author="自动巡检",
)
# 3) 调整批注框大小和默认显示状态
comment = ws["B4"].comment
if comment is not None:
comment.width = 240 # 批注框宽度(像素)
comment.height = 80 # 批注框高度(像素)
wb.save(path)
print("批注已写入:", path)
def read_comments(path: str):
"""读取已有批注内容,做二次校验或导出说明"""
wb = load_workbook(path)
ws = wb["销售"]
print("\n读取到的批注:")
for row in ws.iter_rows(min_row=1, max_row=10):
for cell in row:
if cell.comment is not None:
print(f"{cell.coordinate} 作者={cell.comment.author} 内容={cell.comment.text}")
def main():
file_path = "sales_with_comments.xlsx"
add_comments(file_path)
read_comments(file_path)
if __name__ == "__main__":
main()
代码讲解
from openpyxl.comments import Comment导入批注类。实例化时传两个参数:text是批注正文,author是作者名,Excel 里会显示在批注气泡标题上。- 赋值给单元格的方式很直接:
ws["B2"].comment = Comment(...)。一个单元格只能挂一个批注,重复赋值会覆盖旧的。 - 批量批注的关键是遍历数据区,按业务规则判断后再 new 一个
Comment挂上去。本例对销售额<60万的单元格自动挂"低于红线"提示。 comment.width、comment.height控制批注框尺寸,单位是像素;不加也能用,只是默认大小。- 读取批注时遍历每个单元格,判断
cell.comment is not None,再取.text和.author。批注不会出现在cell.value里,必须单独取。
运行结果
生成 sales_with_comments.xlsx。控制台打印三条批注的坐标、作者、内容。用 Excel/WPS 打开,鼠标移到 B2、B5 等单元格上,右上角红色小三角旁弹出批注气泡,能看到"华东区双11大促拉动"和"销售额仅 45 万,低于红线60万"等说明文字。
注意事项
- 批注是"浮动对象",不属于单元格值。用
pandas.read_excel读数据时批注会被直接忽略,不会进到 DataFrame 里。 - 一个单元格只能有一条批注;想叠加多条说明,用换行符
\n写进同一段text即可。 - 批注里的换行在 Excel 中要
\n生效,不要用\r\n;超长文本会自动换行,不需要手动断行。 - 批注默认是"鼠标悬停才显示"。想默认全部展开显示,打开文件后在 Excel 里"开始-查找和选择-定位条件-批注",或自行在 Excel 界面设置;openpyxl 对"始终显示批注"这个开关支持有限,别强依赖。
- 批注里的特殊符号、emoji 一般没问题,但超长英文路径、Unicode 私有区字符可能在某些版本 Excel 里显示异常,正式报表建议控制在 200 字以内。

更新时间:2026-09-15 09:16:58
下一篇: