Excel本身没有类似Word的原生水印命令,但合同台账、内部报表和外发文件经常需要“CONFIDENTIAL”“草稿”或公司Logo这类标记。借助Spire.XLS for Python,可以在不依赖本地Microsoft Excel的情况下,通过工作表背景、页眉页脚图片和文本框三种对象实现接近水印的效果。三种方式在屏幕显示和打印输出上的行为不同,下面按代码实现逐一说明。
环境准备
安装Spire.XLS:
脚本中导入模块:
- from spire.xls import *
- from spire.xls.common import *
复制代码
方法一:工作表背景图片,适合屏幕显示
工作表背景通过PageSetup.BackgoundImage属性设置,注意该属性在API中保留了Backgound的拼写。图片文件先用Stream包装为流对象,再赋给属性。示例把指定图片设为第一张工作表的背景:
- 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()
复制代码
这段代码的关键步骤是:LoadFromFile()加载工作簿,Worksheets[0]取第一张工作表,Stream(inputFile_Img)读取图片,BackgoundImage赋值完成背景设置,最后按ExcelVersion.Version2013保存并调用Dispose()释放资源。背景图会显示在单元格数据后方,适合品牌底纹或装饰性标记;但它默认只出现在Excel屏幕视图中,不会进入打印结果和导出的PDF。
方法二:页眉页脚图片,适合打印和PDF
需要让水印随打印页或PDF输出时,应使用页眉页脚图片。Spire.XLS提供LeftHeaderImage、CenterFooterImage等属性;设置图片后,还必须在对应的页眉或页脚文本属性中写入&G占位符,图片才会显示。顺序是先设置图片,再设置&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()
复制代码
示例把同一张图片放到左侧页眉和居中页脚,并把ViewMode设为ViewMode.Layout,方便在页面布局视图中预览。页眉页脚内容会随打印页面输出,因此适合打印水印和导出PDF。如果希望图片位于页面中央而不是页眉页脚边缘,应提前制作带透明通道、主体居中的图片,再添加到页眉或页脚中。
方法三:文本框文字水印
如果水印只是“机密”“草稿”等文字,不必准备图片,可用TextBoxes.AddTextBox()创建文本框,再用.Text写入内容。AddTextBox()的四个参数依次是行索引、列索引、高度和宽度,用来确定文本框的位置和尺寸。
- 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()
复制代码
这段代码添加文本框后,通过Rotation = 45设置旋转角度,创建字体并设置为红色、14号字,再通过RichText.SetFont(0, len(textbox.Text) - 1, font)把字体应用到全部字符;Line.Weight = 0用于隐藏边框,Fill.Visible = False让文本框填充背景不可见。文本框位于单元格内容上方,屏幕可见,也会随工作表打印或导出。若想更接近传统水印,可以调大字号、使用浅色字体并保留倾斜角度,以减少对表格内容的遮挡。
三种方式如何选择
按输出目标选择即可:整表品牌底纹、只需屏幕显示,用工作表背景图片;需要打印或PDF保留图片水印,用页眉页脚图片;只需“机密”“草稿”等文字标记且不想准备图片,用文本框。三者也可以组合使用,例如在工作表中加“草稿”文本框,同时在打印页脚放公司Logo。需要注意:工作表背景屏幕可见但不打印;页眉页脚图片需在页面布局视图查看,且打印可见;文本框在屏幕和打印输出中都可见。
批量处理:为每张工作表添加水印
一个工作簿包含多张工作表时,可以遍历workbook.Worksheets集合,在循环内执行同样的设置,最后统一保存一次,避免反复调用SaveToFile()。以文字水印为例:
- 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循环。若要批量添加背景图片或页眉页脚图片,把循环中的文本框设置替换为对应的PageSetup属性即可;如果还要处理多个Excel文件,可以在外层再增加文件遍历逻辑。
实用技巧与注意事项
1. 图片水印优先使用带Alpha透明通道的PNG文件,透明区域不会遮挡表格数据;纯白背景的JPG图片可能覆盖部分内容。
2. 根据输出场景选择方法:PageSetup.BackgoundImage设置的背景图片不会随工作表打印,需要生成带水印PDF时应优先考虑页眉页脚图片或文本框。
3. 批量处理多张工作表时遍历workbook.Worksheets集合;处理多个工作簿时再外层套文件循环。
4. Spire.XLS免费版在处理行数和功能方面存在一定限制,大型工作簿或复杂排版需要评估是否使用商业许可。
5. 保存文件后调用Dispose()释放资源,批量处理多个工作簿时也应及时释放对象,避免资源持续占用。
总结
Excel没有原生的水印功能,但Spire.XLS for Python可以通过三种对象实现类似效果:用sheet.PageSetup.BackgoundImage = image设置屏幕背景;用LeftHeaderImage、CenterFooterImage配合&G生成打印和PDF图片水印;用TextBoxes.AddTextBox()加.Text生成文字水印。实际使用时按水印内容和输出方式选择,并结合循环完成多工作表、多工作簿的批量标记。 |