使用 Python 在 Excel 文档中添加水印

0 阅读9分钟

与 Word 和 PDF 不同,Excel 没有提供专门的水印功能,无法像在 Word 中那样直接插入“机密”或“草稿”等文字。不过,在实际工作中,给 Excel 表格添加标记的需求并不少见。例如,合同台账需要标注“CONFIDENTIAL”,内部报表需要显示“草稿”,对外发送的文件则可能需要带上公司 Logo。

虽然 Excel 没有原生的水印功能,但借助 Spire.XLS for Python,仍然可以通过工作表背景图片、页眉页脚图片和文本框等方式实现类似效果。不同方法适用于不同场景,本文将逐一介绍具体操作,并说明它们在屏幕显示和打印输出方面的区别。

环境准备

本文使用 Spire.XLS for Python 处理 Excel 文件。它提供了操作工作表背景、页眉页脚图片和文本框等功能,无需依赖本地安装的 Microsoft Excel。

首先,打开终端或命令提示符,执行以下命令安装:

pip install Spire.XLS

安装完成后,在 Python 脚本中导入相关模块:

from spire.xls import *
from spire.xls.common import *

Excel 中常见的三种水印实现方式

由于 Excel 没有内置的水印功能,需要根据实际用途选择合适的实现方式。常见需求大致可以分为以下三类:

  • 工作表背景标记: 将公司 Logo 或其他图片设置为工作表背景,让图片显示在单元格数据后面,适合在屏幕上展示品牌标识或装饰性底纹。
  • 打印水印: 将图片添加到页眉或页脚,使其在打印或导出 PDF 时显示,适合需要在输出文件中保留水印的场景。
  • 文字水印: 在工作表中添加文本框,叠加“机密”“DRAFT”等文字标记,既能在屏幕上查看,也能随工作表一起打印。

这三种方式分别对应 Spire.XLS 中不同的属性和对象,下面介绍具体实现方法。

方法一:使用背景图片为工作表添加水印

如果希望在工作表数据后面显示一张图片,可以将其设置为工作表的背景图片。Spire.XLS 提供了 PageSetup.BackgoundImage 属性来实现这一操作。这里的 BackgoundImage 保留了 API 中的原始拼写。

下面的示例加载一个 Excel 工作簿,将指定图片设置为第一张工作表的背景,然后保存修改后的文件。

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()

图片背景作为水印.png

在这个代码中,我们使用 Stream(inputFile_Img) 用于将图片文件包装为流对象,再通过 BackgoundImage 属性将其设置为工作表背景。

需要注意的是,工作表背景图片只会在 Excel 的屏幕视图中显示,默认不会出现在打印结果或导出的 PDF 中。因此,这种方法更适合添加品牌背景或装饰性标记,而不适合需要在打印文件中保留水印的场景。

方法二:使用页眉和页脚图片添加打印水印

如果希望水印出现在打印文件或导出的 PDF 中,可以将图片添加到工作表的页眉或页脚。

Excel 支持在页眉页脚中插入图片,Spire.XLS 则提供了 LeftHeaderImage、CenterFooterImage 等属性来设置图片,并通过 LeftHeader = "&G" 这样的占位符引用图片。

下面的示例将同一张图片分别添加到左侧页眉和居中页脚:

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()

页眉作为水印.png

运行这个代码时需要注意两个地方:

  1. 先设置图片,再添加 &G 占位符。 &G 是 Excel 页眉页脚中用于引用图片的占位符。设置 XxxHeaderImage 或 XxxFooterImage 后,还需要在对应的页眉或页脚属性中添加 &G,图片才能正确显示。
  2. 页眉页脚图片适合打印和 PDF 输出。 与工作表背景图片不同,页眉页脚内容会随打印页面输出,因此更适合需要在打印文件中保留图片水印的场景。

如果希望图片显示在页面中央,而不是页眉或页脚的边缘位置,可以提前制作一张带透明通道、主体居中的图片,再将其添加到页眉或页脚中。

方法三:使用文本框添加文字水印

如果水印内容只是“机密”“草稿”或“DRAFT”等文字,不需要准备图片文件,可以直接在工作表中添加文本框。

Spire.XLS 提供了 TextBoxes.AddTextBox() 方法来创建文本框,并通过 .Text 属性设置其中的文字。

下面的示例在第一张工作表中添加一个文本框,并写入“机密”作为水印:

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()

添加文本水印.png

AddTextBox() 的四个参数依次表示行索引、列索引、高度和宽度,用于确定文本框的位置和尺寸。创建文本框后,通过 textbox.Text 设置需要显示的文字。

与工作表背景图片不同,文本框位于单元格内容上方,因此可以直接在 Excel 中看到,也会随文件一起打印或导出。

如果希望文字更接近传统水印的效果,还可以进一步调整文本框的字体、颜色和旋转角度。例如,使用较大的字号、浅色字体和倾斜角度,让文字标记更加醒目,同时尽量减少对表格内容的遮挡。具体样式可以通过文本框对象对应的字体和填充属性进行设置。

三种方法怎么选?

以上三种方式都可以实现类似水印的效果,但它们在显示位置、打印效果和使用场景方面有所不同。

方法适用场景屏幕上可见打印/PDF 可见是否需要图片
工作表背景图片整表品牌底纹是否是
页眉/页脚图片打印水印、品牌标识页面布局视图可见是是
文本框“机密”“草稿”等文字标记是是否

简单来说:

  • 想在屏幕上为整张工作表添加品牌背景,可以使用背景图片。
  • 想让水印出现在打印文件或 PDF 中,可以使用页眉或页脚图片。
  • 只需要添加文字标记,不想准备图片文件,可以使用文本框。

在实际项目中,也可以组合使用不同方法。例如,在 Excel 工作表中添加“草稿”文字标记,同时在打印页脚中添加公司 Logo,以满足不同场景下的标识需求。

批量处理:为整个工作簿的每张工作表添加水印

如果一个工作簿包含多张工作表,逐张添加水印会比较繁琐。此时,可以遍历 workbook.Worksheets 集合,对每张工作表执行相同的操作。

下面以添加文字水印为例,展示如何为整个工作簿中的每张工作表添加“机密”标记:

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 设置文字,适合添加“机密”“草稿”等文字标记。

实际使用时,可以根据水印内容和文件输出方式选择合适的方法。如果需要为多张工作表或多个工作簿添加统一标记,还可以结合循环实现批量处理。