与 Word 和 PDF 不同,Excel 没有提供专门的水印功能,无法像在 Word 中那样直接插入"机密"或"草稿"等文字。不过,在实际工作中,给 Excel 表格添加标记的需求并不少见。例如,合同台账需要标注"CONFIDENTIAL",内部报表需要显示"草稿",对外发送的文件则可能需要带上公司 Logo。
虽然 Excel 没有原生的水印功能,但借助 Spire.XLS for Python,仍然可以通过工作表背景图片、页眉页脚图片和文本框等方式实现类似效果。不同方法适用于不同场景,本文将逐一介绍具体操作,并说明它们在屏幕显示和打印输出方面的区别。
环境准备
本文使用 Spire.XLS for Python 处理 Excel 文件。它提供了操作工作表背景、页眉页脚图片和文本框等功能,无需依赖本地安装的 Microsoft Excel。
首先,打开终端或命令提示符,执行以下命令安装:
bash
pip install Spire.XLS
安装完成后,在 Python 脚本中导入相关模块:
python
from spire.xls import *
from spire.xls.common import *
Excel 中常见的三种水印实现方式
由于 Excel 没有内置的水印功能,需要根据实际用途选择合适的实现方式。常见需求大致可以分为以下三类:
- 工作表背景标记: 将公司 Logo 或其他图片设置为工作表背景,让图片显示在单元格数据后面,适合在屏幕上展示品牌标识或装饰性底纹。
- 打印水印: 将图片添加到页眉或页脚,使其在打印或导出 PDF 时显示,适合需要在输出文件中保留水印的场景。
- 文字水印: 在工作表中添加文本框,叠加"机密""DRAFT"等文字标记,既能在屏幕上查看,也能随工作表一起打印。
这三种方式分别对应 Spire.XLS 中不同的属性和对象,下面介绍具体实现方法。
方法一:使用背景图片为工作表添加水印
如果希望在工作表数据后面显示一张图片,可以将其设置为工作表的背景图片。Spire.XLS 提供了 PageSetup.BackgoundImage 属性来实现这一操作。这里的 BackgoundImage 保留了 API 中的原始拼写。
下面的示例加载一个 Excel 工作簿,将指定图片设置为第一张工作表的背景,然后保存修改后的文件。
python
from spire.xls import *
from spire.xls.common import *
inputFile = "/示例文档.xlsx"
inputFile_Img = "/背景图.png"
outputFile = "/BackgroundWatermark_out.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]
# 将图片设置为工作表背景
image = Stream(inputFile_Img)
sheet.PageSetup.BackgoundImage = image
workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
workbook.Dispose()

在这个代码中,我们使用 Stream(inputFile_Img) 用于将图片文件包装为流对象,再通过 BackgoundImage 属性将其设置为工作表背景。
需要注意的是,工作表背景图片只会在 Excel 的屏幕视图中显示,默认不会出现在打印结果或导出的 PDF 中。因此,这种方法更适合添加品牌背景或装饰性标记,而不适合需要在打印文件中保留水印的场景。
方法二:使用页眉和页脚图片添加打印水印
如果希望水印出现在打印文件或导出的 PDF 中,可以将图片添加到工作表的页眉或页脚。
Excel 支持在页眉页脚中插入图片,Spire.XLS 则提供了 LeftHeaderImage、CenterFooterImage 等属性来设置图片,并通过 LeftHeader = "&G" 这样的占位符引用图片。
下面的示例将同一张图片分别添加到左侧页眉和居中页脚:
python
from spire.xls import *
from spire.xls.common import *
inputFile = "/示例文档.xlsx"
inputFile_Img = "/Logo1.png"
outputFile = "/HeaderFooterWatermark.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]
# 设置页眉图片
image = Stream(inputFile_Img)
sheet.PageSetup.LeftHeaderImage = image
sheet.PageSetup.LeftHeader = "&G"
# 设置页脚图片
sheet.PageSetup.CenterFooterImage = image
sheet.PageSetup.CenterFooter = "&G"
# 切换到页面布局视图,方便预览
sheet.ViewMode = ViewMode.Layout
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

运行这个代码时需要注意两个地方:
- 先设置图片,再添加
&G占位符。&G是 Excel 页眉页脚中用于引用图片的占位符。设置XxxHeaderImage或XxxFooterImage后,还需要在对应的页眉或页脚属性中添加&G,图片才能正确显示。 - 页眉页脚图片适合打印和 PDF 输出。 与工作表背景图片不同,页眉页脚内容会随打印页面输出,因此更适合需要在打印文件中保留图片水印的场景。
如果希望图片显示在页面中央,而不是页眉或页脚的边缘位置,可以提前制作一张带透明通道、主体居中的图片,再将其添加到页眉或页脚中。
方法三:使用文本框添加文字水印
如果水印内容只是"机密""草稿"或"DRAFT"等文字,不需要准备图片文件,可以直接在工作表中添加文本框。
Spire.XLS 提供了 TextBoxes.AddTextBox() 方法来创建文本框,并通过 .Text 属性设置其中的文字。
下面的示例在第一张工作表中添加一个文本框,并写入"机密"作为水印:
python
from spire.xls import *
from spire.xls.common import *
inputFile = "/示例文档.xlsx"
outputFile = "/TextWatermark.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
ws = workbook.Worksheets[0]
# 添加文本框,参数依次为行索引、列索引、高度和宽度
textbox = ws.TextBoxes.AddTextBox(9, 2, 35, 120)
textbox.Text = "水印示例"
# 设置文本框旋转角度
textbox.Rotation = 45
# 设置文本框内文字的字体和颜色
font = workbook.CreateFont()
font.Color = Color.get_Red() # 字体颜色
font.Size = 14 # 字号大小
richText = textbox.RichText
rt = RichText(richText)
rt.SetFont(0, len(textbox.Text) - 1, font) # 应用到所有字符
# 隐藏边框
textbox.Line.Weight = 0
# 将文本框的填充背景设为不可见
textbox.Fill.Visible = False
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

AddTextBox() 的四个参数依次表示行索引、列索引、高度和宽度,用于确定文本框的位置和尺寸。创建文本框后,通过 textbox.Text 设置需要显示的文字。
与工作表背景图片不同,文本框位于单元格内容上方,因此可以直接在 Excel 中看到,也会随文件一起打印或导出。
如果希望文字更接近传统水印的效果,还可以进一步调整文本框的字体、颜色和旋转角度。例如,使用较大的字号、浅色字体和倾斜角度,让文字标记更加醒目,同时尽量减少对表格内容的遮挡。具体样式可以通过文本框对象对应的字体和填充属性进行设置。
三种方法怎么选?
以上三种方式都可以实现类似水印的效果,但它们在显示位置、打印效果和使用场景方面有所不同。
| 方法 | 适用场景 | 屏幕上可见 | 打印/PDF 可见 | 是否需要图片 |
|---|---|---|---|---|
| 工作表背景图片 | 整表品牌底纹 | 是 | 否 | 是 |
| 页眉/页脚图片 | 打印水印、品牌标识 | 页面布局视图可见 | 是 | 是 |
| 文本框 | "机密""草稿"等文字标记 | 是 | 是 | 否 |
简单来说:
- 想在屏幕上为整张工作表添加品牌背景,可以使用背景图片。
- 想让水印出现在打印文件或 PDF 中,可以使用页眉或页脚图片。
- 只需要添加文字标记,不想准备图片文件,可以使用文本框。
在实际项目中,也可以组合使用不同方法。例如,在 Excel 工作表中添加"草稿"文字标记,同时在打印页脚中添加公司 Logo,以满足不同场景下的标识需求。
批量处理:为整个工作簿的每张工作表添加水印
如果一个工作簿包含多张工作表,逐张添加水印会比较繁琐。此时,可以遍历 workbook.Worksheets 集合,对每张工作表执行相同的操作。
下面以添加文字水印为例,展示如何为整个工作簿中的每张工作表添加"机密"标记:
python
from spire.xls import *
from spire.xls.common import *
inputFile = "Sample.xlsx"
outputFile = "TextWatermark_Batch_out.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
# 遍历工作簿中的每张工作表
for sheet in workbook.Worksheets:
textbox = sheet.TextBoxes.AddTextBox(9, 2, 25, 100)
textbox.Text = "机密"
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
与单张工作表的处理方式相比,这段代码主要增加了一个 for 循环,用于遍历工作簿中的所有工作表。循环内部仍然使用 TextBoxes.AddTextBox() 创建文本框,并通过 .Text 设置水印内容。
如果需要批量添加背景图片或页眉页脚图片,也可以采用相同的思路,只需将循环中的文本框设置替换为对应的 PageSetup 属性即可。
对于包含多张工作表的工作簿,建议在循环中完成所有设置后,再统一调用一次 SaveToFile() 保存文件,避免重复保存。
实用技巧与注意事项
使用 Python 为 Excel 添加水印时,还需要留意以下几点:
- 优先使用透明 PNG 图片。 如果使用图片作为水印,建议选择带有 Alpha 透明通道的 PNG 文件。透明区域不会遮挡表格数据,更适合制作浅色 Logo 或底纹。纯白背景的 JPG 图片则可能覆盖工作表中的部分内容。
- 根据输出场景选择方法。
PageSetup.BackgoundImage设置的背景图片不会随工作表打印。如果需要生成带水印的 PDF,应优先考虑页眉页脚图片或文本框。 - 批量处理时使用循环。 需要为多张工作表添加相同水印时,可以遍历
workbook.Worksheets集合;如果还需要处理多个 Excel 文件,可以在外层增加文件遍历逻辑。 - 留意免费版限制。 Spire.XLS 免费版在处理行数和功能方面存在一定限制。处理较大的工作簿或涉及复杂排版时,需要根据实际需求评估是否使用商业许可。
- 及时释放资源。 示例代码在保存文件后都调用了
Dispose()。批量处理多个工作簿时,也应及时释放对象,避免资源持续占用。
总结
虽然 Excel 没有原生的水印功能,但使用 Spire.XLS for Python 仍然可以通过三种方式实现类似效果:
- 工作表背景图片: 设置
sheet.PageSetup.BackgoundImage = image,适合屏幕显示,不会随工作表打印。 - 页眉/页脚图片: 使用
LeftHeaderImage、CenterFooterImage等属性配合&G占位符,适合打印和 PDF 输出。 - 文本框: 使用
TextBoxes.AddTextBox()创建文本框,再通过.Text设置文字,适合添加"机密""草稿"等文字标记。
实际使用时,可以根据水印内容和文件输出方式选择合适的方法。如果需要为多张工作表或多个工作簿添加统一标记,还可以结合循环实现批量处理。