在 Excel 协作和审核场景里,批注最大的价值,是在不改动单元格原始数据的前提下补充说明、追踪责任人和记录处理意见。手工维护少量批注不难,但一旦表格进入多人协作、反复校对或批量审计阶段,批注的新增、格式统一、读取导出和集中清理就很适合交给 Python 自动完成。本文基于 Spire.XLS for Python,按“先创建、再美化、再维护”的顺序,整理 Excel 批注的常见操作,并说明各接口适合解决什么问题、哪些细节需要特别注意。
环境准备:先把批注操作能力接入脚本
本文使用的库是 Spire.XLS for Python。它提供了 CellRange.Comment 属性和 Comments 集合,适合对单个单元格批注和整张工作表的批注进行统一处理。
安装命令如下:
pip install Spire.XLS
脚本中导入模块后,就可以开始处理 Excel 文件:
from spire.xls import * from spire.xls.common import *
后续示例都围绕 Workbook、工作表对象以及单元格的 Comment 或 AddComment() 方法展开。
给单元格添加带作者信息的批注
如果表格要经过多人审核,批注里最好明确写出作者。这样后续回看时,能直接判断这条意见是谁添加的。Excel 对这类格式有一套常见约定:批注内容写成“作者名 + 冒号 + 换行 + 正文”,Excel 会把作者部分按批注头部来处理,阅读体验也更清晰。

Spire.XLS 可以通过 CellRange.AddComment() 创建批注,再分别设置文本、宽度和默认显示状态:
from spire.xls import * from spire.xls.common import * inputFile = "/示例.xlsx" outputFile = "/AddCommentWithAuthor.xlsx" # 创建 Workbook 并加载文件 workbook = Workbook() workbook.LoadFromFile(inputFile) # 获取第一个工作表 sheet = workbook.Worksheets[0] # 获取目标单元格 range = sheet.Range["C1"] # 设置作者和批注内容 author = "E-iceblue" text = "这是一个演示如何添加带有可编辑作者属性的批注示例。" # 添加批注并设置属性 comment = range.AddComment() comment.Width = 200 comment.Visible = True comment.Text = author + ":n" + text # 将作者姓名设置为粗体 font = workbook.CreateFont() font.FontName = "Tahoma" font.KnownColor = ExcelColors.Black font.IsBold = True comment.RichText.SetFont(0, len(author), font) # 保存文档 workbook.Sa veToFile(outputFile, ExcelVersion.Version2013) workbook.Dispose()
这里的关键点有三个:
作者信息写在批注开头
comment.Text = author + ":n" + text 用的是“作者 + 正文”的组织方式。原文示例保留了 :n 这一写法,实际使用时应特别核对换行符是否符合你的脚本环境和库要求。

批注框可直接设置尺寸和可见性
comment.Width = 200 用来控制批注框宽度,comment.Visible = True 则表示打开 Excel 时批注默认显示,而不是悬停后才出现。

作者名可以单独加粗
comment.RichText.SetFont(0, len(author), font) 通过富文本接口只修改作者这段文字的字体样式。这样既保留正文样式,又能让作者名更醒目。
需要突出重点时,如何设置富文本和批注外观
当批注内容较长,或者同一条批注里需要区分风险项、结论和补充说明时,纯文本就不够用了。这时可以分别处理两类样式:一类是批注文字本身的富文本格式,另一类是批注框的外观,例如背景色和默认显示状态。
在同一条批注里设置不同文字颜色
Spire.XLS 允许为批注中的不同字符区间分别指定字体。做法是先创建 ExcelFont 对象,再用 RichText.SetFont() 应用到指定区间。
from spire.xls import * from spire.xls.common import * inputFile = "示例.xlsx" outputFile = "RichTextComment.xlsx" workbook = Workbook() workbook.LoadFromFile(inputFile) sheet = workbook.Worksheets[0] # 创建三种不同颜色的字体 fontOrange = workbook.CreateFont() fontOrange.FontName = "Arial" fontOrange.Size = 11 fontOrange.KnownColor = ExcelColors.Orange fontBlue = workbook.CreateFont() fontBlue.KnownColor = ExcelColors.LightBlue fontGreen = workbook.CreateFont() fontGreen.KnownColor = ExcelColors.LightGreen # 在 B12 单元格添加富文本批注 range = sheet.Range["B12"] range.Text = "富文本批注示例" range.Comment.RichText.Text = "Rich text comment" # 对批注中不同字符区间应用不同字体颜色 range.Comment.RichText.SetFont(0, 4, fontGreen) # 第 0-4 个字符设为绿色 range.Comment.RichText.SetFont(5, 9, fontBlue) # 第 5-9 个字符设为蓝色 workbook.Sa veToFile(outputFile, ExcelVersion.Version2013) workbook.Dispose()
这段代码的重点是“按字符索引分段设置样式”。原文中指出,"Rich text comment" 共 17 个字符,通过两次 SetFont() 调用,将前 5 个字符和后续部分分别设置为不同颜色。对于需要高亮关键词、状态标签或错误级别的批注,这种方式很实用。
调整批注框颜色和默认显示状态
如果希望重点批注在打开工作簿时就被看见,还可以进一步设置批注框背景色和显示属性:
from spire.xls import * from spire.xls.common import * inputFile = "示例.xlsx" outputFile = "/SetCommentFillColor.xlsx" # 创建 Workbook 并加载文件 workbook = Workbook() workbook.LoadFromFile(inputFile) # 获取第一个工作表 sheet = workbook.Worksheets[0] # 创建字体 font = workbook.CreateFont() font.FontName = "Arial" font.Size = 11 font.KnownColor = ExcelColors.Orange # 在 A1 单元格添加批注 range = sheet.Range["A1"] range.Comment.Text = "这是一个批注" range.Comment.RichText.SetFont(0, len(range.Comment.Text) - 1, font) # 设置批注框填充颜色 range.Comment.Fill.FillType = ShapeFillType.SolidColor range.Comment.Fill.ForeColor = Color.get_SkyBlue() range.Comment.Visible = True workbook.Sa veToFile(outputFile, ExcelVersion.Version2013) workbook.Dispose()
Fill.FillType = ShapeFillType.SolidColor 表示使用纯色填充,Fill.ForeColor = Color.get_SkyBlue() 将批注框背景设为天蓝色。再配合 Visible = True,就能把关键意见固定展示出来。
如果一张工作表中批注很多,通常不建议全部显示。更合理的做法是,只让高优先级批注保持可见,普通批注仍采用默认隐藏状态,以免遮挡单元格内容。
批注多了以后,怎么修改、删除和避免索引出错
批注真正进入业务流程后,后期维护往往比创建更频繁。比如审核意见更新、重复批注清理、关闭周期后统一删除历史说明。这类操作可以直接使用工作表上的 Comments 集合完成。
from spire.xls import * from spire.xls.common import * inputFile = "./Data/CommentSample.xlsx" outputFile = "EditAndRemoveComment.xlsx" workbook = Workbook() workbook.LoadFromFile(inputFile) # 获取第一个工作表的所有批注 comments = workbook.Worksheets[0].Comments # 修改第一条批注的内容 comments[0].Text = "该批注内容已被更新。" # 删除第二条批注 comments[1].Remove() workbook.Sa veToFile(outputFile, ExcelVersion.Version2013) workbook.Dispose()
这段代码展示了两种最直接的维护方式:
按索引修改已有批注内容
comments[0].Text 可以直接改写已有批注文本,适合对审核意见做修订或追加标准化描述。
按索引删除单条批注
comments[1].Remove() 会将该批注从工作表中彻底移除。如果只想定位某个单元格上的批注,也可以调用 CellRange.Comment.Remove(),避免先遍历整个集合。
批量删除时要注意索引重排
这一点很关键:调用 Remove() 后,Comments 集合中的索引会立即重新排列。原来排在后面的元素会前移,所以如果你要连续删除多条批注,建议从最后一个开始倒序遍历,避免跳项或误删。
实用技巧:读取内容、控制显隐、封装批量添加
除了增删改,批注还有一些很常见的配套操作,比如导出内容、按阶段切换显示状态,以及为一批单元格统一添加同样格式的批注。
读取批注内容用于审计或导出
如果需要把批注内容输出到日志、文本文件或审计结果中,可以遍历工作表的 Comments 集合,并读取 Comment.Text。原文也提到,如果要保留格式信息,还可以使用 Comment.RichText.RtfText。
sheet = workbook.Worksheets[0]
for i in range(len(sheet.Comments)):
comment = sheet.Comments[i]
print(f"批注 {i}: {comment.Text}")
这类遍历很适合和 Python 的文件写入、数据库入库或审计流水结合使用。
按需显示或隐藏批注,减少遮挡
批注多的时候,全部展开会严重影响阅读。可以通过属性控制单条批注的显示状态:
# 隐藏第二条批注 sheet.Comments[1].IsVisible = False # 显示第三条批注 sheet.Comments[2].IsVisible = True
这种做法适合审核流转中的分阶段处理,例如只显示当前待办批注,其他批注暂时隐藏。
封装函数,批量生成统一格式的批注
如果多个单元格都需要写入类似格式的批注,最好把逻辑封装成函数,后续只传入单元格地址、作者和正文即可:
def add_comment(sheet, cell_address, author, text, fill_color=None):
cell = sheet.Range[cell_address]
comment = cell.AddComment()
comment.Text = f"{author}:n{text}"
comment.Width = 200
if fill_color:
comment.Fill.FillType = ShapeFillType.SolidColor
comment.Fill.ForeColor = fill_color
return comment
这个函数保留了原文中的写法,核心价值在于把“创建批注、设置文本、统一宽度、按需填充颜色”放到一个入口里。后续结合单元格遍历,就能对异常数据、缺失数据或审核节点批量打标。
总结:把 Excel 批注纳入可维护的自动化流程
从实际使用角度看,Python 处理 Excel 批注并不只是“能不能加上一条说明”,而是能否把批注纳入完整的数据协作流程。Spire.XLS for Python 提供的接口已经覆盖了这一流程中的大部分环节:你可以创建带作者信息的批注,设置富文本和批注框样式,读取批注内容做后续处理,也可以按索引或按单元格删除、更新已有批注。
如果你的表格经常经历录入、审核、复核和归档几个阶段,那么把这些操作统一写进脚本,通常比手工维护更稳定,也更容易保持格式一致。真正需要特别注意的,主要是批量删除时的索引变化,以及富文本字符区间的边界是否与实际内容对应。









